我正在尝试使用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.
导致这种情况的原因是什么?
答案 0 :(得分:1)
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);
}
}
}
答案 1 :(得分:1)
问题是因为你正在混合INT和双打。你的代码不会产生任何错误,因为这种类型的乘法很好,但是当你分配整数然后尝试将它们分配回双精度时,除了小数之前的整数值之外你都会失去一切。
git submodule foreach --recursive '
REV1=HEAD;
REV2=HEAD~10;
SHA1=$(cd $toplevel && git ls-tree $REV1 $path | grep -E -o "[0-9a-f]{40}");
SHA2=$(cd $toplevel && git ls-tree $REV2 $path | grep -E -o "[0-9a-f]{40}");
git log --oneline $SHA1...$SHA2'
答案 2 :(得分:1)
整体限制了获得所有小数点的能力,因此修复它应该有效。此程序也会很快耗尽堆空间。只是说