【发布时间】:2017-11-12 19:31:46
【问题描述】:
上下文:我正在尝试将一个哈希函数的实现移植到 C++ 中,该哈希函数使用 JavaScript 中的原始实现中的双重算术。在这个函数中,我们操作的双精度可以非常小也可以非常大,并且任何差异都会被放大(故意的,因为这是一个哈希函数)。
更多详情
- 出了什么问题: 与 JavaScript 版本相比,cpp 版本中的哈希似乎产生了不同的结果。 您使用的是什么系统: 目前我正在使用节点 6.10.2(用于 JavaScript)和 g++(Debian 4.9.2-10)在 Debian 上运行它 4.9.2 我尝试了什么:在一组测试向量上运行哈希。 结果如何:测试向量的哈希值在 JS 和 C++ 版本中是不同的。 我想要什么:了解原因,以便我可以使版本兼容或了解它们不兼容。 更多细节: 在 JS 中我使用 Float64Array 作为双精度类型,在 C++ 中我使用双精度类型。
问题:在 JS 和 C++ 上的双重算术不同吗?
【问题讨论】:
-
感谢您的链接
-
C++ 没有简单的答案。虽然 IEEE754 是每个人都假设的,并且您在大多数情况下都会得到什么,但在某些情况下浮点计算不使用双精度 IEEE754 计算。这方面的示例是 -Ofast 与 gcc 或 x87 扩展精度计算。
-
虽然浮点计算确实是不可移植的,但问题通常是极端情况。但是,我担心哈希与浮点结合。即使只有一位不同,散列也会有很大不同,因此说散列不同并不能很好地表明“结果不同”(因为浮点计算允许一定的误差范围)。而是比较实际输出值。 [我假设散列是根据结果计算的,而不是浮点散列的计算,因为那会很奇怪]
-
再读一遍这个问题,用浮点数进行哈希计算不太可能在任何平台上都能正常工作——除非非常小心避免舍入错误等。寻找另一个解决方案!
标签: javascript c++ hash floating-point floating-accuracy