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
文档。
好像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
文档。