【问题标题】:Floating point issue in C [duplicate]C中的浮点问题[重复]
【发布时间】:2010-10-12 15:40:09
【问题描述】:

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

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

为什么这里的表达式计算结果为真?

【问题讨论】:

标签: c++ c floating-point


【解决方案1】:

浮点数的精度有限。 0.7 很可能无法准确表示,因此 a 中的值可能是浮点数中的 0.6999999999982 左右。这与双倍 0.7(更精确:0.69999999999999999999999999384)相比将表明它更少。

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

【讨论】:

    【解决方案2】:

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

     if (a < 0.7f) 
    

    【讨论】:

    • a 的实际值为 0.699999... 假设可能是 0.699999... :)
    【解决方案3】:

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

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

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

    解决方案:处理浮点数时始终使用“f”,即

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        试试这个:

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

        更多详情请访问most effective way for float and double comparison

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            猜你喜欢
            • 2013-05-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-02-17
            • 1970-01-01
            相关资源
            最近更新 更多