gpt4 book ai didi

更改循环变量的类型时,Java For-loop 会更改数值结果

转载 作者:IT老高 更新时间:2023-10-28 20:49:37 26 4
gpt4 key购买 nike

我写了一个程序用莱布尼茨公式计算PI数:

[ Leibniz formula]

我写了一个初始化类型为“int”的for循环,循环工作正常,但是当我将初始化类型更改为“long”时,结果发生了变化。这只发生在循环次数超过十亿时。这使得“int-loop”计算 PI 比“long-loop”更准确。我不知道为什么会这样。请帮助我理解这个问题。谢谢!这是我的代码。

public static void main(String[] args) {
double result1 = 0;
double result2 = 0;
double sign = 1;

for (int i = 0; i <= 1607702095; i++) {
result1 += sign/(2 * i + 1);
sign *= -1;
}
sign = 1;

for (long j = 0; j <= 1607702095; j++) {
result2 += sign/(2 * j + 1);
sign *= -1;
}

System.out.println("result1 " + result1 * 4);
System.out.println("result2 " + result2 * 4);
System.out.println("pi " + Math.PI);
}

结果是:

result1  3.141592653576877
result2 3.1415926529660116
pi 3.141592653589793

最佳答案

实际上,当 i 足够大时,您的第一个循环会在 (2 * i + 1) 的计算中出现 int 溢出,所以我不会依赖它的输出。

另一方面,第二个循环产生更正确的输出,因为 (2 * j + 1) 不会溢出,因为它执行 long 乘法.

This makes the "int - loop" calculates PI more accurate than "long - loop"

这可能只是一个巧合,因为 int 循环中的计算会溢出。

关于更改循环变量的类型时,Java For-loop 会更改数值结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34610421/

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