I have a program:
int main()
{
float f = 0.0f;
int i;
for (i = 0 ; i < 10 ; i++)
f = f + 0.1f;
if (f == 1.0f)
printf("f is 1.0 \n");
else
printf("f is NOT 1.0\n");
return 0;
}
It always prints f is NOT 1.0
. I understand this is related to floating point precision in C. But I am not sure exactly where it is getting messed up. Can someone please explain me why it is not printing the other line?
For floating point numbers you should always use an epsilon value when comparing them:
You cannot compare floats like this. You need to define a threshold and compare based on that. This blog post explains
This is equivelent to adding 0.33 together 3 times (0.99) and wondering why it is not equal to 1.0.
You may wish to read What Every Programmer Should Know About Floating Point Arithmetic
Binary floating point cannot represent the value 0.1 exactly, because its binary expansion does not have a finite number of digits (in exactly the same way that the decimal expansion of 1/7 does not).
The binary expansion of 0.1 is
When truncated to IEEE-754 single precision, this is approximately
0.100000001490116119
in decimal. This means that each time you add the "nearly 0.1" value to your variable, you accumulate a small error - so the final value is slightly higher than1.0
.