strange number of repetitions in for loop

I wrote this little program to calculate pi.

While playing with the code and trying to find the most exact result, I found a point where my computer couldn’t calalculate a result. It could do 33554430 repetitions within seconds, but if i increased the for loop to 33554431 it didn’t output anything.

So is 33554430 a special number?

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);
     }

}

Answer

You are getting and endless loop, because during the comparison i <= 33554431, the int value 33554431 is promoted to a float value which is “too precise” for float and will actually equal to 33554432. Then, when you try to increase the value by +2, the float just isn’t precise enough to increment from the value 33554432. To illustrate my point:

float f = 33554432;
System.out.println(f); //33554432
f += 2;
System.out.println(f); //33554432

So the value f doesn’t increase due to its precision limitation. If you’d increase it by, say 11, you’d get 33554444 (and not 33554443) as that is the closest number expressible with that precision.

So is 33554430 a special number?

Sort of, not 33554430 but rather 33554432. First “special number” for float is 16777217, which is the first positive integer that cannot be represented as a float (equals 16777216 as float). So, if you’d increment your i variable by 1, this is the number you’d get stuck on. Now, since you are incrementing by 2, the number you get stuck on is 16777216 * 2 = 33554432.