在C中测试浮点相等性

时间:2013-10-24 20:55:34

标签: c

我有以下代码,它给出了奇怪的输出

#include<stdio.h>
void main()
{
 float a, x;
 a=6.7;
 if(a==6.7)
  printf("1\n");
 else
  printf("2\n");


 x=8.5;
 if(x==8.5)
  printf("1\n");
 else
  printf("2\n");

}

输出

$ ./a.out 
2
1

如果我用f后缀数字,例如“6.7f”如果条件然后我得到正确的输出,我不明白为什么这种奇怪的行为?

4 个答案:

答案 0 :(得分:5)

float的精度低于double,这是用于浮点文字的默认类型。由于6.7不能用有限数量的二进制数字表示,因此不太精确的float表示不等于double表示。

答案 1 :(得分:4)

6.7是双倍的,所以当你说a=6.7时,你将一个双截断为浮点数。

因为浮点数存储在基数2而不是基数10中,所以不可能完全精确地表示6.7。因此,当被截断为浮点数时,在这种情况下会丢失一些信息。 8.5也不会发生同样的情况,因为8.5可以在基数2中完全精确地存储。

然后,当您比较(a==6.7)时,您正在比较不同的表示形式,如上所述 - 它们不相等。

答案 2 :(得分:4)

非浮动浮点文字的类型为double,而不是float类型。

6.7    /* double */
6.7f   /* float  */

答案 3 :(得分:3)

计算机中浮点数的表示具有限制精度。你永远不应该使用简单的==来比较两个浮点数。相反,你可以使用

if(fabs(a-6.7) < epsilon)其中epsilon数字足够小但不小于计算机FP数字表示的精度(例如float的FP32或double的FP64)

修改:正如下面的讨论所指出的,从不使用应该改为,这是不可取的。有关详细信息,请参阅讨论,可能适用于在程序中经常使用浮点的用户。另外,this link处的准确性问题部分可能非常重要。