代码之家  ›  专栏  ›  技术社区  ›  shreyasva

C中的浮点问题[副本]

  •  3
  • shreyasva  · 技术社区  · 14 年前

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

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

    为什么这里的表达式的值为真?

    6 回复  |  直到 14 年前
        1
  •  5
  •   JoshD    14 年前

    浮点数的精度有限。0.7很可能无法精确表示,因此A中的值在浮点中可能是0.69999999982左右。与双0.7(更精确地说:0.69999999999999999384)相比,这将表明它的值更小。

    看看这个: http://docs.sun.com/source/806-3568/ncg_goldberg.html

        2
  •  4
  •   Hans Passant    14 年前

    因为文本0.7的类型是double,而不是float。A的实际值为0.699999…修复:

     if (a < 0.7f) 
    
        3
  •  3
  •   EboMike    14 年前

    其他答案也暗示了这一点,但这个问题是由于你没有在你的数字上加上“f”而引起的。

    任何带小数点的数字都将被编译器隐式地解释为double(即精度是float两倍的64位值)。在第一行中,将double指定给float,从而失去精度(如果打开了应该打开的警告,则会收到编译器警告)。

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

    解决方案:处理浮动时始终使用“F”,即

    float a = 0.7f;
    if (a < 0.7f);
    
        4
  •  1
  •   user180326    14 年前

    因为0.7不能精确地表示为float或double。当您将它存储在一个浮点中时,它会比表示为双精度(默认值)时稍微向下取整一点。

        5
  •  1
  •   Community Lee    7 年前

    试试这个:

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

    更多细节 most effective way for float and double comparison .

        6
  •  0
  •   abelenky    14 年前

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

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