用Java实现莱布尼兹公式
关于π的莱布尼兹公式是:π/4=1-1/3+1/5-1/7+1/9。。。我试图用Java编写这篇文章,但遇到了一个问题,输出总是4(不是pi的值)。我将代码放在java可视化工具中,问题似乎在于,当代码落入else语句时,它并没有从pi中减去(1分母),这使得prevPi值和pi值相同,从而导致do/while循环结束。有人知道我怎么解决这个问题吗 我的代码:用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;
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)
条件,我在回答(分支预测?)时从代码中删除了该条件。试试看。