我写了这个小程序来计算圆周率。
在玩代码并尝试找到最准确的结果时,我发现我的计算机无法计算结果。它可以在几秒钟内完成33554430次重复,但是如果我将for循环增加到33554431,则不会输出任何内容。
那么33554430是一个特殊的数字吗?
public class CalculatePi{
public static void main(String[] args){
float pi=0;
int sign=1;
for(float i=1; i <= 33554430; i+=2){
pi += (sign*(1.0/i));
sign*= -1;
}
pi *= 4;
System.out.println(pi);
}
}
最佳答案
您正在无休止地循环,因为在比较i <= 33554431
时,int
值33554431
是promoted to a float
值,对于浮点数来说“太精确”,实际上等于33554432
。
然后,当您尝试将值增加+2
时,float
不够精确,无法从值33554432
递增。为了说明我的观点:
float f = 33554432;
System.out.println(f); //33554432
f += 2;
System.out.println(f); //33554432
因此,值
f
由于其精度限制而不会增加。如果将其增加例如11
,则会得到33554444
(而不是33554443
),因为这是可以精确表示的最接近的数字。那么33554430是一个特殊的数字吗?
而不是33554430,而是33554432。浮点数的第一个“特殊数字”是
16777217
,它是第一个不能表示为float
的正整数(等于16777216
浮点数)。因此,如果将i
变量增加1
,则这是您遇到的问题。现在,由于您要递增2
,因此卡住的数字是16777216 * 2 = 33554432
。