I am currently learnig java float-point numbers. I know, that a float have a specific amount of significant digets. I also know, that a float is represented in java like -1 or 1 * num * 10^x. Where num is the numer and 10^x is the decimal "point". But here we do not have a fraction of a number. How is a infinite loop here possible?
The code with infinite loop:
float f = 123456789;
while (f-- > 0) {
System.out.println(f);
}
It's about floating point arithmetic. When you're decrementing the number you stumble upon the situation when you go through the number f = 1.23456792E8
makes everything go wrong, because f-1
and f
have the same floating point representation here. So decrementing makes the number be itself, which leads to the infinite loop. Just check:
System.out.println(1.23456792E8f);
System.out.println(1.23456792E8f - 1);
What is so special about the number and why execution stops there? It's because the floating point representation of 123456789
is 1.23456792E8
. Already this gives us a gap of at least 3
due to the lack of precision of floating point numbers. Using double
instead of float
makes the program finish, but the issue will occur with higher numbers.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With