gpt4 book ai didi

java - Java 8 和 Java 13 中的 Math.pow() 返回不同的结果

转载 作者:行者123 更新时间:2023-12-05 08:14:29 25 4
gpt4 key购买 nike

以下代码在 Java 8 和 Java 11 上返回不同的结果。

class Playground {
public static void main(String[ ] args) {
long x = 29218;
long q = 4761432;
double ret = Math.pow(1.0 + (double) x / q, 0.0005);
System.out.println("val = " + String.format("%.24f", ret));
}
}

Java 8:

val = 1.000003058823805400000000

Java 11:(与 Python、Rust 相同的结果)

val = 1.000003058823805100000000

问题是这些:

  • 是否有描述此类行为的文档?
  • 如何在 Python 中实现 Java 8 的 Math.pow()
  • 如何确保与使用 Java 8 库的旧程序的严格一致性?

最佳答案

如果我们只使用 Double.toString() 来打印答案,那么两个不同的结果将是

1.0000030588238054
1.0000030588238051

末尾的额外数字只是 String.format() 的一个因素。我们看到数字仅在最后一个有效的小数位上有所不同。将这两个数字转换为十六进制给出

1.000033518c576
1.000033518c575

所以二进制表示仅在最后一位 (ulp) 有一个单位不同。

阅读 Math.pow 的规范我们发现

“计算结果必须在精确结果的 1 ulp 以内。”

真实值接近 1.000003058823805246468 ( WolframAlpha ),介于两个答案之间,因此都在规范内。

所发生的一切是图书馆在算法上有轻微的变化,也许是为了让它更快。

关于java - Java 8 和 Java 13 中的 Math.pow() 返回不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64586096/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com