【问题标题】:Is double arithmetic the same in cpp and javascript?cpp和javascript中的双重算术相同吗?
【发布时间】: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


【解决方案1】:

在考虑了上面的cmets,又想了想,得出浮点计算可以的结论:

  • 因不同的语言、架构和实现而异,
  • 即使所有这些目标共享相同的 IEEE754 标准。

所以答案是——除了对(可能是大量特定于目标的)边缘情况进行一些认真的调查和处理之外,没有其他方法可以带来浮点结果(尤其是由一个使用浮点的哈希函数)转换成任何类型的跨目标的一致协议。

在这种情况下,事实证明这并不是一件可怕的事情,甚至可能具有一些优势,例如能够根据哈希值对特定目标进行指纹识别。

无论如何,感谢您的努力。如果可以的话,我会支持你,干杯!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    相关资源
    最近更新 更多