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)
这似乎是由 JVM 内部函数引起的Math.cos,相关问题JDK-8242461中对此进行了描述。那里经历的行为不被认为是一个问题:
此错误中报告的返回结果确实是相邻的浮点值[这里也是这种情况]
[...]
因此,虽然其中一个或另一个返回值可能超出精度范围,但 Math.cos 具有不同的返回值本身并不是问题的证据。
为了获得可重现的结果,请使用 StrictMath.cos。
事实上,禁用内在函数-XX:+UnlockDiagnosticVMOptions -XX:DisableIntrinsic=_dcos(如链接问题中建议的那样)会导致Math.cos与 相同的(预期)结果StrictMath.cos。
Math因此,您在这里看到的行为很可能也符合文档。