【问题标题】:Are there denormalized floats that evaluate to the same value apart from +0/-0?除了 +0/-0 之外,是否有非规范化的浮点数评估为相同的值?
【发布时间】: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


【解决方案1】:

除了 +0/-0 之外,是否还有非规范化的浮点数,它们真正转换为相同的离散值,或者我可以按原样散列它们的二进制表示,而不必担心为相同的值生成不同的散列?

没有从表示到其他“真实”值的转换。只有 IEEE 754 相等,这是一种等价关系,但使一些具有不同表示的值相等。 +0.0 和 -0.0 是唯一具有不同表示的浮点值,它们是相等的。

你不需要对 NaN 的许多表示做任何特别的事情,所有的 NaN 都是不同的(对于 IEEE 754 相等性),即使它们具有相同的表示。因此,NaN 不需要具有相同的散列。 NaN 的相同表示甚至不需要与它本身具有相同的哈希值。

【讨论】:

  • 在不同时间对不同事物进行值哈希可能会破坏哈希表的不变量。
  • @tmyklebu 我会说它有不等于自己的键破坏了哈希表的不变量。
猜你喜欢
  • 2022-12-10
  • 2018-12-12
  • 2016-08-25
  • 1970-01-01
  • 1970-01-01
  • 2021-06-13
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
相关资源
最近更新 更多