JDK 8 和 JDK 13 之间的浮点数差异

Differences in floating point between JDK 8 and JDK 13

好像JDK8和JDK13的浮点数不一样
我得到 JDK 8,使用数学:

cos(2.3) = -0.666276021279824

然后在 JDK 13:

cos(2.3) = -0.6662760212798241

这是怎么发生的?使用 Windows 10.

的第 11 代英特尔和 AMD Ryzen 显示差异

编辑 2022 年 3 月 20 日:
使用 Long.toHexString(Double.doubleToRawLongBits()) 我得到不同的位模式:
我上了 JDK 8:

cos(2.3) = 0xbfe5522217302fe0

我上了 JDK 13:

cos(2.3) = 0xbfe5522217302fe1

这似乎是由 Math.cos 的 JVM 内部函数引起的,相关问题 JDK-8242461 中对此进行了描述。那里经历的行为不被视为问题:

The returned results reported in this bug are indeed adjacent floating-point values [this is the case here as well]

[...]

Therefore, while it is possible one or the other of the returned values is outside of the accuracy bounds, just have different return values for Math.cos is not in and of itself evidence of a problem.

For reproducible results, use the StrictMath.cos instead.

事实上,使用 -XX:+UnlockDiagnosticVMOptions -XX:DisableIntrinsic=_dcos 禁用内在函数(如链接问题中所提议),导致 Math.cos 具有与 StrictMath.cos.[=17 相同的(预期)结果=]

看来您在这里看到的行为很可能也符合 Math 文档。