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

Strange output when comparing same float values?

Comparing Same Float Values In C

strange output in comparison of float with float literal

Float addition promoted to double?


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

#include<stdio.h>
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 returns 正确。

如果它是 0.1, 0.2, 0.3, 0.4, 0.6, 0.7.... ,那么 Else If 块 returns true.


请原谅我问同样的问题,因为我从上面的链接中了解到绝对不能进行浮动比较。

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

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

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

编辑问题后: 是的,如果你取了 0.1 或你提到的其他值之一,你应该 运行 到 else 部分。

Floating point numbers are never accurate.

这个说法是错误的。有些浮点数是准确的,比如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 进行比较时,浮点数在末尾用零扩展,比较变为 1.010101010000000 * 2^-3 == 1.010101010101010 * 2^-3,失败。