繁体   English   中英

使用 Java 的莱布尼茨公式

[英]Leibniz Formula using Java

pi 的莱布尼茨公式是:pi/4 = 1 - 1/3 + 1/5 - 1/7 + 1/9... 我试图在 Java 中写这个,但我遇到了一个问题 output 总是4(这不是 pi 的值)。 我将我的代码放在 java 可视化工具中,似乎问题在于,当代码落入 else 语句时,它没有从 pi 中减去(1 分母),这使得 prevPi 值和 pi 值相同导致 do/while 循环结束。 有谁知道我该如何解决这个问题?

我的代码:

public static float piCalculatorLeibniz() {
        float pi = 0;
        int denominator = 1;
        float prevPi = 0;
        boolean keepGoing = true;
        int i = 0;
        while (keepGoing == true) {
            prevPi = pi;
            if (i % 2 == 0) {
                pi += (1/denominator);
            } else {
                pi -= (1/denominator);
            }
            i++;
            denominator += 2;
            if (pi == prevPi) {
                keepGoing = false;
            }
        }
        pi *= 4;
        return pi;
    }

你是对的。 4 实际上不是 Pi 的值。

问题是denominator变量是int所以1/denomenatorint/int所以结果是0 由于pi == prevPi ,这使您在一次迭代后退出循环

只需将denominator类型更改为双精度(或浮点数),您就会得到正确答案。

此外,您不需要编写while(keepGoing == true) 变量keepGoing已经是boolean了,可以简单写while(keepGoing)

编辑:

我喜欢玩这段代码,所以这里有一个稍微短一些的版本,由于使用了double更准确。 它的收敛速度似乎也快了很多:

double pi = 0, denominator = 1, prevPi = 1;
while (pi != prevPi) {
    prevPi = pi;
    pi += (1 / denominator) - (1 / (denominator + 2));
    denominator += 4;
}
return pi * 4;

问题是 integer 除法会导致 integer,而不是浮点数或双精度数。

1 / 3为 0。

为避免这种情况,您可以切换到使用浮点数作为分母而不是整数。

float denominator = 1.0f;

使您的所有操作数都是浮点类型。 否则,您的结果是 integer。

请参阅Java 语言规范

如果提升的类型是 float 或 double,则执行浮点运算。


此外,在大多数平台上,您可以使用double而不会造成任何性能损失,但这是另一个主题。 ;-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM