我写了这个小程序来计算圆周率。

在玩代码并尝试找到最准确的结果时,我发现我的计算机无法计算结果。它可以在几秒钟内完成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时,int33554431promoted 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

09-11 19:40