莱布尼兹近似 - Java

Leibniz approximation - Java

所以,我正在尝试编写一个近似圆周率的程序。我认为我正确地输入了莱布尼茨的公式,但我的数字出现了错误。谁能发现我的代码有什么问题?或者如果它完全搞砸了。

import java.util.Scanner;
public class Pi2 {
  public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    System.out.print("Number of sentances: ");
    double sent = input.nextDouble();
    double den = 1;
    double LeiPI;
    for(int i = 0;i <= sent;i++)
    {
      double firstden = (1/den);
      double firstVAR = 1 - firstden;
      double secvar = (Math.pow(-1, (sent + 1)) / ((2 * sent) - 1));
      double thirdvar = firstVAR + secvar;
      LeiPI = 4 * thirdvar;
      for(int j = 0;j < i;j++)
      {
        if(i < j)
          den++;
        den++;
      }
      if(i == sent)
        System.out.println(LeiPI);
    }
  }
}

抱歉,完全搞砸了(你的话:o)。

逐行检查您的代码:

double den = 1;
double LeiPI;

您应该在每次 for 循环中添加到 LeiPI。如果您不这样做,则所有迭代状态都在 den 中。你 不能 这样做,因为你必须初始化 LeiPI 才能这样做,因为 definite assignment

for(int i = 0;i <= sent;i++)

您实际上迭代了 (sent + 1) 次。

{
  double firstden = (1/den);
  double firstVAR = 1 - firstden;

不清楚你在这里做什么。 Leibniz's formula中单项没有1 - anything(明明有1 - 1/3):一切都只是+/- 1 / denominator:

1 - 1/3 + 1/5 - 1/7 + 1/9 - ... = pi/4

无论如何:

  double secvar = (Math.pow(-1, (sent + 1)) / ((2 * sent) - 1));

-1/ ((2 * sent) - 1) 你的想法是正确的,但是分子应该是 1。

  double thirdvar = firstVAR + secvar;
  LeiPI = 4 * thirdvar;
  for(int j = 0;j < i;j++)
  {
    if(i < j)
      den++;
    den++;
  }

正如我上面提到的,您将所有迭代状态存储在 den 中,因此您实际上在这里所做的就是将 den 增加 i - 所以 den只是根据三角形数以二次方增加。

  if(i == sent)
    System.out.println(LeiPI);

您应该在循环外打印 LeiPI,之前已经初始化了变量。

}

我建议您忘记所有这些额外的变量:它们只会把它弄得乱七八糟,使它更难阅读。只需按照您在公式中看到的那样实施该术语。

以下是您对 sent == 100 的回答:

double LeiPI = 0;
for (int i = 0; i < sent; i++) {
  LeiPI += 4.0 * Math.pow(-1, i) / (2.0 * i + 1);
}
System.out.println(LeiPI);