【发布时间】:2015-06-27 10:50:56
【问题描述】:
散列浮点数
我想感受散列函数的浮动(单打、双打等)。
我希望散列函数为实际上相同但具有不同二进制表示的事物生成相同的散列。
因此 +0/-0 应该被归一化。
许多 NaN 应合并为一个表示。
+Inf 相同(与 -Inf 不同)等。
问题
除了 +0/-0 之外,是否还有非规范化的浮点数,它们真正转换为相同的离散值,或者我可以按原样散列它们的二进制表示,而不必担心为相同的值生成不同的散列?
额外问题:如果有,除了使用 frexp 之外,将这些非规范化恢复为唯一表示的最快方法是什么?
(最好在 X64 SSE2 汇编中回答,但是 C 也可以)。
出于性能原因,我希望在将浮点数输入哈希之前尽可能少做准备工作。我不在乎兼容性。
【问题讨论】:
-
请注意,在 IEEE754 中没有一个 NaN……有“许多”NaN。在 32 位浮点数中,NaN 可能有 24 位有效负载(1 位符号和 23 位有效负载)
-
除了 NaN 和 +-0 的问题外,IEEE754 float 的所有值都是不同的,如果转换为 uint32_t/uint64_t t,如果字节序相同,则严格排序
-
对于您的附加问题,应该编写一种语言...鉴于您对 freexp 的引用,您可能指的是 C。
-
@xanatos 不,实际上是 x64 程序集。
-
如果您使用 NaN 作为基于 IEEE 754 相等性的哈希表中的键,您可能做错了什么。无论如何,NaN 的哈希值并不重要,因为 NaN != NaN。你可以对不同的 NaN 使用不同的哈希,你可以对“相同”的 NaN 使用不同的哈希,哈希函数仍然兼容 IEEE 754 相等性。
标签: hash floating-point 64-bit ieee-754 floating-point-conversion