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