如何确认浮点处理的差异是否会导致不同的结果?

bra*_*ter 6 c++ java floating-point

我已经转换了一个相对简单的算法,double该算法对从C++到Java 的类型数执行大量计算,但是在两个平台上运行算法但是同一台机器产生的结果略有不同.该算法将许多双精度和整数相乘和相加.我正在尝试将Java算法加倍; C算法没有投射.

例如,在一次运行中我得到结果:

  • (Java)64684970
  • (C++)65296408

(打印忽略小数位)

当然,我的算法可能存在错误,但是在我开始花时间调试之前,是否有可能通过C++和Java中的不同浮点处理来解释这种差异?如果是这样,我可以证明这是问题吗?


更新 - 类型不同的位置是两个整数之间的乘法,然后将其添加到运行的总双精度数中.修改了C代码,目前在两者中:

mydouble += (double)int1 * (double)int2

jos*_*efx 2

AFAIK 有时,双精度文字的值可能会在两个 C++ 编译器版本之间发生变化(当用于将源转换为下一个最佳双精度值的算法发生变化时)。

此外,在某些 cpu 上,浮点寄存器大于 64/32 位(更大的范围和精度),这对结果的影响取决于编译器和 JIT 如何将值移入和移出这些寄存器 - 这在 java 和c++。

Java 有 strictftp 关键字来确保仅使用 64/32 位精度,但这会带来运行时成本。还有大量选项可以通过抛弃 IEEE 标准制定的保证/规则来影响 C++ 编译器处理和优化浮点计算的方式。

如果算法大部分相同,那么您可以检查相同输入的第一个差异出现的位置。