比较相同的浮点数时奇怪的输出?

比较C中的相同浮点值

与float和float文字相比较的奇怪输出

浮动添加提升到双倍?


我在浮点上阅读了上面的链接,但是甚至得到了奇怪的输出。

#include int main() { float x = 0.5; if (x == 0.5) printf("IF"); else if (x == 0.5f) printf("ELSE IF"); else printf("ELSE"); } 

现在,根据促销规则,不应该打印“ ELSE IF ”吗?

但是,这里是打印“ IF


编辑:是因为0.5 = 0.1二进制,之后一切都为0,精度损失因此没有影响,因此比较IF返回true。

如果它是0.1,0.2,0.3,0.4,0.6,0.7 ……,则Else If块返回true。


请原谅我提出同样的问题,因为我已经从上面的链接中读到,浮动比较绝对不能完成。

但是,这种意外行为的原因是什么?

浮点数永远不准确。

这种说法是错误的。 一些浮点数是准确的,例如1.0,12345.0,12345.5,-2.25。 所有这些数字都可以表示为2的幂的整数。所有数字都不能准确。

在您的特定情况下, float x = 0.5导致x的值为1.00000000 * 2^-1 。 当你将它与double 0.5进行比较时,两个操作数都被转换为double ,因此比较变为1.000000000000000 * 2^-1 == 1.000000000000000 * 2^-1 ,这是成功的。

对于float x = 0.1 ,它看起来不同。 该值存储为1.01010101 * 2^-3 (或类似)。 请注意,这已经不准确了。 当你将它与double 0.1进行比较时,float在末尾用零1.010101010000000 * 2^-3 == 1.010101010101010 * 2^-3 ,比较变为1.010101010000000 * 2^-3 == 1.010101010101010 * 2^-3 ,这会失败。

当您阅读有关浮点类型和比较问题的链接时,您可能期望在转换期间舍入0.5,因此比较失败。 但是0.5是2的幂,并且可以完美地表示,而不需要在float或double类型变量中进行任何舍入。 因此比较结果为TRUE。

在您编辑完问题之后:是的,如果您使用0.1或您提到的其他值,则应该遇到else部分。

第一个if语句的计算结果为true ,因此打印IF 。 其他表达式甚至没有检查。