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

Rúb*_*ias 10 java floating-point

JDK 8 和 JDK 13 似乎有不同的浮点数。
我使用 Math 来安装 JDK 8:

cos(2.3) = -0.666276021279824
Run Code Online (Sandbox Code Playgroud)

在 JDK 13 上:

cos(2.3) = -0.6662760212798241
Run Code Online (Sandbox Code Playgroud)

这是怎么发生的?在使用 Windows 10 的第 11 代 Intel 和 AMD Ryzen 上存在差异。

编辑 20.03.2022:
使用 Long.toHexString(Double.doubleToRawLongBits()) 我得到不同的位模式:
我在 JDK 8 上得到:

cos(2.3) = 0xbfe5522217302fe0
Run Code Online (Sandbox Code Playgroud)

我得到了 JDK 13:

cos(2.3) = 0xbfe5522217302fe1
Run Code Online (Sandbox Code Playgroud)

Mar*_*234 5

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

此错误中报告的返回结果确实是相邻的浮点值[这里也是这种情况]

[...]

因此,虽然其中一个或另一个返回值可能超出精度范围,但 Math.cos 具有不同的返回值本身并不是问题的证据。

为了获得可重现的结果,请使用 StrictMath.cos。

事实上,禁用内在函数-XX:+UnlockDiagnosticVMOptions -XX:DisableIntrinsic=_dcos(如链接问题中建议的那样)会导致Math.cos与 相同的(预期)结果StrictMath.cos

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