Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Java实现莱布尼兹公式_Java_Math_Pi - Fatal编程技术网

用Java实现莱布尼兹公式

用Java实现莱布尼兹公式,java,math,pi,Java,Math,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;

关于π的莱布尼兹公式是:π/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;
    }

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

见:

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



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

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

问题是
分母
变量是
int
所以
1/分母
int/int
所以结果是
0
。这使得您在一次迭代后退出循环,因为
pi==prevPi

只要将
分母
类型更改为double(或float),您就会得到正确的答案

另外,您不需要在(keepGoing==true)时编写
。变量
keepGoing
已经是布尔值,您可以在(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;

旁注:使用float代替double并没有真正的好处。帮你自己一个忙,改用double-type。@HovercraftFullOfEels这就是我的想法,但实际上,在这个实现中,性能上的差异是非常显著的,因为你一直在迭代,直到
pi
达到一个固定点。使用double时达到固定点需要更多的迭代和更多的时间。罪魁祸首似乎是
if(i%2==0)
条件,我在回答(分支预测?)时从代码中删除了该条件。试试看。