我有以下代码,它给出了奇怪的输出
#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”如果条件然后我得到正确的输出,我不明白为什么这种奇怪的行为?
答案 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处的准确性问题部分可能非常重要。