【问题标题】:Leibniz formula for pi - Java [closed]pi 的莱布尼茨公式 - Java [关闭]
【发布时间】:2013-10-01 16:32:43
【问题描述】:

所以,莱布尼茨的 pi 公式是 pi/4 = 1 - 1/3 + 1/5 - 1/7 + 1/9...我不知道如何在 Java 中使用这个公式。我只需要一些关于如何将第二部分合并到其中的帮助。我知道我需要一个循环,我需要一个除数变量,并且每次都需要加 2。感谢您的帮助。

【问题讨论】:

  • 我不想给你解决方案。在循环的每个步骤中,添加(+/-)1/(2*i+1),其中i 是for 循环的变量。这里有什么困难?
  • 我建议您尽可能多地写,并将其包含在问题中。我建议一次评估两个表达式。它会稍微快一点,并且舍入误差更小。顺便说一句,您也可以计算 PI 而不是 PI/4。
  • 你会在这里找到一个很好的关于 pi 方法的解决方案: stackoverflow.com/a/70053809/9345726

标签: java formula pi


【解决方案1】:

作为提示,这是一个优化版本

long start = System.nanoTime();
double pi = 0;
for (int i = 1; i < 1000000000; i += 4) {
    pi += 8.0 / (i * (i + 2L));
}
long time = System.nanoTime() - start;
System.out.println(pi + " took " + time / 1000000 / 1e3 + " secs.");

打印

3.1415926445762157 took 1.217 secs.

如果您将此循环更改为向后而不是向前执行,您将获得更准确的结果。它更准确,因为最后添加的较大数字隐藏了较小值的一些累积舍入误差。

3.141592651589793 took 1.222 secs.

值应该是 3.14159265359

【讨论】:

【解决方案2】:

for 循环应如下所示:

double sum=0;
double sign=1.0;
for(int i =1;i<=limit;i+=2)
{
    sum+=sign/i;
    sign* =-1;
}

【讨论】:

  • sign*=-1; sum+=sign/i;
  • ok 标志 = 标志*-1;可以替换为符号*=-1;
  • 如果您可以删除if 条件,这将快得多
  • 合并了变化!现在简洁多了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-21
  • 2015-01-11
  • 1970-01-01
  • 2020-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多