Java:编码 Wallis 乘积以求 pi
Java: coding the Wallis product to find pi
我正在尝试使用 Wallis 乘积公式编写代码来输出 pi:https://en.wikipedia.org/wiki/Wallis_product
这是我的代码:
public class PI {
public static void main(String[] args) {
pI();
}
public static void pI () {
double pi = 0;
int a = 0;
int b = 1;
double denom = 0;
double num = 0;
int temp = 0;
int count = 0;
double halfpi = 1;
while(true) {
temp = b;
b = temp + 2;
denom = temp*b;
a += 2;
num = a*a;
halfpi *= (num/denom);
count++;
System.out.println(halfpi*2);
}
}
}
我发现在循环超过大约 33000 次迭代之前,代码工作正常。在这一点之后它只打印:“-0.0”:
-0.0
-0.0
-0.0
-0.0
-0.0
...
----jGRASP: process ended by user.
可能是什么原因造成的?
redFIVE 是对的。你正在混合 int 和 double 这会导致问题。这会解决它
public class PI {
public static void main(String[] args) {
pI();
}
public static void pI () {
double pi = 0;
double a = 0;
double b = 1;
double denom = 0;
double num = 0;
double temp = 0;
double count = 0;
double halfpi = 1;
while(true) {
temp = b;
b = temp + 2;
denom = temp*b;
a += 2;
num = a*a;
halfpi *= (num/denom);
count++;
System.out.println(halfpi*2);
}
}
}
问题是因为您混合了 INT 和双打。您的代码不会产生任何错误,因为这种类型的乘法很好,但是当您分配整数然后尝试将它们分配回双精度值时,您将丢失除小数点前的整数值之外的所有内容。
double pi = 0;
double a = 0;
double b = 1;
double denom = 0;
double num = 0;
double temp = 0;
double count = 0;
double halfpi = 1;
整数限制了获取所有小数点的能力,因此修复它应该可行。此外,使用此程序,您将 运行 非常快地从堆 space 中取出。就说
我正在尝试使用 Wallis 乘积公式编写代码来输出 pi:https://en.wikipedia.org/wiki/Wallis_product
这是我的代码:
public class PI {
public static void main(String[] args) {
pI();
}
public static void pI () {
double pi = 0;
int a = 0;
int b = 1;
double denom = 0;
double num = 0;
int temp = 0;
int count = 0;
double halfpi = 1;
while(true) {
temp = b;
b = temp + 2;
denom = temp*b;
a += 2;
num = a*a;
halfpi *= (num/denom);
count++;
System.out.println(halfpi*2);
}
}
}
我发现在循环超过大约 33000 次迭代之前,代码工作正常。在这一点之后它只打印:“-0.0”:
-0.0
-0.0
-0.0
-0.0
-0.0
...
----jGRASP: process ended by user.
可能是什么原因造成的?
redFIVE 是对的。你正在混合 int 和 double 这会导致问题。这会解决它
public class PI {
public static void main(String[] args) {
pI();
}
public static void pI () {
double pi = 0;
double a = 0;
double b = 1;
double denom = 0;
double num = 0;
double temp = 0;
double count = 0;
double halfpi = 1;
while(true) {
temp = b;
b = temp + 2;
denom = temp*b;
a += 2;
num = a*a;
halfpi *= (num/denom);
count++;
System.out.println(halfpi*2);
}
}
}
问题是因为您混合了 INT 和双打。您的代码不会产生任何错误,因为这种类型的乘法很好,但是当您分配整数然后尝试将它们分配回双精度值时,您将丢失除小数点前的整数值之外的所有内容。
double pi = 0;
double a = 0;
double b = 1;
double denom = 0;
double num = 0;
double temp = 0;
double count = 0;
double halfpi = 1;
整数限制了获取所有小数点的能力,因此修复它应该可行。此外,使用此程序,您将 运行 非常快地从堆 space 中取出。就说