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