もちろん、 aを同じサイズfloat
の型として表現しint
てハッシュすることもできますが、この素朴なアプローチには注意が必要な落とし穴がいくつかあります...
等しい値が必ずしも同じバイナリ表現を持つとは限らないため、単純にバイナリ表現に変換するとエラーが発生しやすくなります。
明白なケース:たとえば-0.0
一致しません。*0.0
さらに、単純にint
同じサイズの に変換するだけでは、非常に均等な分散が得られません。これは、多くの場合重要です (たとえば、バケットを使用するハッシュ/セットの実装)。
推奨される実装手順:
- 非有限ケース (
nan
、inf
) および ( 0.0
、-0.0
これを明示的に行う必要があるかどうかは、使用する方法によって異なります) を除外します。
int
同じサイズの に変換します
(つまり、単に int にキャストするのではなく、たとえばユニオンを使用して をfloat
としてint
表します) 。
- ビットを再配布します(ここでは意図的にあいまいにしています!)。これは基本的に速度と品質のトレードオフです。しかし、狭い範囲に多くの値がある場合は、それらを同様の範囲にしたくないでしょう。
*nan
: (と-nan
) もチェックしたくないかもしれません。それらを正確に処理する方法は、ユース ケースによって異なります ( nan
CPython のように、すべての の符号を無視することもできます)。
Python のは、実稼働コードで , を_Py_HashDouble
ハッシュする方法の良いリファレンスです(これは Python の特別な値であるため、最後のチェックは無視してください) 。float
-1