为什么浮点数为5的最后一个十进制数字在浮点数比较中给出了正确的输出,而在其他情况下它不是?

Dey*_*eya 1 c c++ floating-point precision

我已经问过这个问题了,但这个特定子部分的答案对我来说并不清楚.请参阅以下代码:

float f=2.5;
if (f==2.5)
printf("abc");
else
printf("xyz"); //prints abc
Run Code Online (Sandbox Code Playgroud)

我知道如果我们2.2取而代之2.5,它将输出相反的值,因为float被视为double和浮点nos.他们真的不应该等同吗?我想知道为什么有一个例外,数字有他们的最后一个十进制数字5.

Che*_*Alf 5

因为它可以表示为2的整数倍的整数倍.例如2.5 = 5/2 = 5×(2 -1).这直接匹配浮点值的公共表示.


Bat*_*eba 5

2.5可以写成二元有理数,并且考虑到它的幅度足够小,它可以精确地表示在IEEE754浮点数中.2.25例如,也可以完美地表示.参考:https://en.wikipedia.org/wiki/Dyadic_rational


浮点数.实际上不应该等同

这只是一个经验法则.使用严格考虑的公差进行任意比较可能是有害的.浮点没有什么神秘之处.它只是大多数不能表示为小数(这是开发人员倾向于思考的),就是这样.