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

为什么不能比较浮点数?[副本]

  •  3
  • Shubham  · 技术社区  · 15 年前


    strange output in comparision of float with float literal

    #include<stdio.h>
    int main()
    {
    float me = 1.7;
    if(me==1.7)
       printf("C");
    else
       printf("C++");
    }
    
    Output: C++
    

    现在出现这种情况的原因是很多浮点数不能用二进制的绝对精度来表示。

    me 对我来说也一样 1.7 当比较时。所以两者应该相等。

    打字如何解决这个问题? (float)1.7

    7 回复  |  直到 9 年前
        1
  •  13
  •   nos    15 年前

    你是在比较一个浮点数和一个双精度浮点数。文字 1.7 是双人房。

    您将其存储在一个浮点中,它的精度可能比double低,因此 me == 1.7 将1.7作为浮点(升级为双精度)与1.7作为双精度进行比较。

    在这种情况下, me == 1.7f me 到双人房 double me = 1.7;

    不过,在一般情况下,您可能希望使用epsilon来比较等式,如@duffymo所示。

    Obligatory read .

        3
  •  2
  •   Joe    15 年前

    不能比较浮点数的一个主要原因是,对于实数和整数有效的恒等式不一定适用于浮点数,因为四舍五入-即(x+y)+z和x+(y+z)通常是不同的(注意,这样写通常不会改变编译器的行为,但您可以通过执行编译器不会优化的操作来归纳顺序)。

    例如,(100-(100-.0000000001))!=.00000000001使用IEEE-754双倍,即使数学上说它们应该相等。因此,应该产生.00000000001的计算将稍微偏离。这是一个特别复杂的计算问题,例如线性代数,其中的答案可以是成千上万的加法和减法的结果,每一个加法和减法都会增加浮点舍入误差。

    IEEE-754浮点运算可能是非常棘手的,如果你真的不明白发生了什么。

    我推荐优秀的“每个计算机科学家都应该知道的浮点运算”: http://docs.sun.com/source/806-3568/ncg_goldberg.html

        4
  •  2
  •   fredoverflow    15 年前

    假设采用IEEE-754表示,文字1.7f和1.7代表以下值:

    1.7f == 1.7000000476837158203125
    1.7  == 1.6999999999999999555910790149937383830547332763671875
    

        5
  •  1
  •   Mayosse    15 年前

    浮动me=1.7f;

        6
  •  0
  •   rano    15 年前

    这是一个代表性问题 numerical analysis ,因为你有一个有限的位来表示这个数字,它所表示的数字并不完全等于你所指的数字,它只是一个非常接近的数字,可以用你的位来表示。 读一读 here

        7
  •  0
  •   Alexandre C.    15 年前