使用Java的莱布尼茨公式



pi的莱布尼茨公式是:pi/4 = 1 - 1/3 + 1/5 - 1/7 + 1/9...我正在尝试用 Java 编写它,但遇到了输出始终为 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已经是布尔值,你可以简单地写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;

问题是整数除法会产生整数,而不是浮点数或双精度数。

1 / 3为 0。

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

float denominator = 1.0f;

使你所有的操作数都是浮点类型。否则,结果为整数。

请参阅 Java 语言规范:

如果升级的类型为浮点型或双精度型,则执行浮点运算。


此外,在大多数平台上,您可以使用双倍而不会降低任何性能,但这是另一个话题。

最新更新