Java For 循环在更改循环变量类型时更改数值结果

2022-09-01 03:02:22

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

[Leibniz formula]

我写了一个for-loop,初始化类型是“int”,循环工作正常,但是当我将初始化类型更改为“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

答案 1

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

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

这使得“int - loop”计算PI比“long - loop”更准确

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


答案 2

因为你在生产线上溢出

result1 += sign/(2 * i + 1);

其中,值与最大整数值相交2*i

int 范围是,但当你做更大的值时,它跨越了该范围。-2,147,483,648 to 2,147,483,6472*i

最好坚持下去,这给你正确的输出。long