java - 使用 Java 的莱布尼茨公式

标签 java math pi

pi 的莱布尼茨公式是:pi/4 = 1 - 1/3 + 1/5 - 1/7 + 1/9...输出始终为 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 类型更改为double(或float),您就会得到正确的答案。

此外,您不需要编写 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;

关于java - 使用 Java 的莱布尼茨公式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58329400/

相关文章:

java - 使用有限状态机解析文件

javascript - 地球绕太阳转

c# - 返回一个长度为 n 的 int 数组,其中包含 pi 的前 n 位数字? (C#)

algorithm - 流式 pi 十进制数字生成器算法

在C中递归计算PI

java - 线程服务器如何继续监听更多传入连接的帖子?

java - 访问空联系人照片时出现 KitKat ANR

java - JSF - 使用 ajax 调用更改 panelGroup - Beans、EL 和?

javascript - 将两个32bit寄存器中的64bit除以32bit

algorithm - 给定 N,找出 A^A 能被 N 整除的最小数 A