C中的浮点问题

时间:2010-10-12 15:40:09

标签: c++ c floating-point

  

可能重复:
  strange output in comparision of float with float literal

float a = 0.7;
if (a < 0.7) ;

为什么这里的表达式评估为true?

6 个答案:

答案 0 :(得分:5)

浮点数的精度有限。 0.7最有可能无法准确表示,因此a中的值可能是浮点数的0.6999999999982左右。相比之下,双0.7(更精确:0.6999999999999999999999999384)将显示它更少。

检查出来:http://docs.sun.com/source/806-3568/ncg_goldberg.html

答案 1 :(得分:4)

因为文字0.7是double类型,而不是float。 a的实际值是0.699999 ...修复:

 if (a < 0.7f) 

答案 2 :(得分:3)

其他答案暗示它,但是这个问题是由于你没有在你的号码中添加“f”而造成的。

任何带小数点的数字都将被编译器隐式解释为double(即64位值,其精度是浮点数的两倍)。在你的第一行,你给一个浮点数分配一个双精度,从而失去精度(如果你打开了警告,你应该有,你会得到一个编译器警告)。

在第二行中,您将浮点数与双精度值进行比较。浮动将被提升为双倍(如果我错了,请纠正我),因此与精确的0.7相比,你的精确度不如0.7。

解决方案:在处理浮动时总是使用“f”,即

float a = 0.7f;
if (a < 0.7f);

答案 3 :(得分:1)

因为0.7不能完全表示为float或double。当你将它存储在一个浮点数时,它会比它表示为双精度(默认值)时向下舍入一点。

答案 4 :(得分:1)

试试这个:

float a = 0.7f;
if (fabs(a - 0.7f) < numeric_limits<float>::epsilon) ;

most effective way for float and double comparison的更多详情。

答案 5 :(得分:0)

阅读本文: What Every Computer Scientist Should Know About Floating-Point Arithmetic

每个计算机程序员都必须知道这一点。