This question already has answers here:
strange output in comparison of float with float literal
                                
                                    (8个答案)
                                
                        
                                2年前关闭。
            
                    
我遇到了两个用C编写的程序,它们都比较浮点数,但输出不同。

1)

  #include<stdio.h>
   int main()
   {
       float x = 0.1;
       if (x == 0.1)
           printf("IF");
       else if (x == 0.1f)
            printf("ELSE IF");
       else
            printf("ELSE");
    }


输出:ELSE IF

2)

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


输出:中频

为什么0.5不能提升为两倍而0.1可以提升为两倍?

最佳答案

由于double宽于float,因此x == 0.1被解释为(double) x == 0.1

这适用于0.5,因为0.5可以精确地用二进制表示,因此(double) 0.5f精确地产生0.5。另一方面,0.1具有an infinite-digit representation in binary,并且0.1f和0.1最终四舍五入为它们所持有的序列的初始位数不同的数字。

在使用十进制数字的类比中,您可以认为上述情况是尝试通过将分数1/3舍入为固定的十进制数字来写下分数1/3。使用5位有效数字表示,您将获得0.33333;选择一个10位数的数字将得出0.3333333333。现在,将5位数字“转换”为10位数字将得到0.3333300000,这与0.3333333333的数字不同。同样,0.5 in就像十进制的1/10,分别表示为0.10000和0.1000000000,因此一个人可以将其转换为另一种表示形式,而又不改变其含义。

如果x的内容是代码中设置的标记值,则只需将其与0.1f而不是0.1进行比较。如果是计算结果,请参见Paul's answer,以比较浮点数量。

10-04 21:17
查看更多