我目前正在 C++ 中实现一个哈希表,并且正在尝试为浮点数创建一个哈希函数......
我本来打算通过填充小数来将浮点数视为整数,但后来我意识到我可能会用大数字来溢出......
有没有好的方法来散列浮点数?
您不必直接给我该功能,但我想看到/理解不同的概念......
Notes:
我不需要它非常快,只要可能的话均匀分布即可。
我读过,由于计算速度的原因,不应对浮点数进行哈希处理,有人可以确认/解释这一点,并给出为什么浮点数不应进行哈希处理的其他原因吗?我真的不明白为什么(除了速度)
这取决于应用程序,但大多数情况下浮点数不应该被散列,因为散列用于快速查找精确匹配,并且大多数浮点数是产生浮点数的计算结果,该浮点数只是正确答案的近似值。检查浮动相等性的通常方法是检查它是否在正确答案的某个增量(绝对值)内。这种类型的检查不适用于散列查找表。
EDIT:
通常,由于舍入误差和浮点运算的固有限制,如果您期望浮点数a
and b
应该彼此相等,因为数学是这样说的,你需要选择一些相对地 small delta > 0
,然后你声明a
and b
相等,如果abs(a-b) < delta
, where abs
是绝对值函数。有关更多详细信息,请参阅本文 http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html.
这是一个演示该问题的小示例:
float x = 1.0f;
x = x / 41;
x = x * 41;
if (x != 1.0f)
{
std::cout << "ooops...\n";
}
根据您的平台、编译器和优化级别,这可能会打印ooops...
到你的屏幕上,这意味着数学方程x / y * y = x
不一定保存在您的计算机上。
在某些情况下,浮点运算会产生精确的结果,例如大小合理的整数和具有 2 次方分母的有理数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)