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

双精度问题

  •  7
  • levanovd  · 技术社区  · 14 年前

    a-b<c a<b+c公司

    编辑
    假设算术溢出不会发生,这与以下示例不同:

    double a = 1L << 53;
    double b = 1;
    double c = a;
    
    Console.WriteLine(a - b < c); // Prints True
    Console.WriteLine(a < b + c); // Prints False
    

    想象一下 数学Abs(a) <1.0&数学Abs(b) <1.0&数学Abs(c) <1.0版

    3 回复  |  直到 14 年前
        1
  •  14
  •   Jon Skeet    14 年前

    a - b 具有小于 a ,但是 a + b 是如此接近 (更大)它最终仍然可以最精确地表示为 .

    举个例子:

    double a = 1L << 53;
    double b = 1;
    double c = a;
    
    Console.WriteLine(a - b < c); // Prints True
    Console.WriteLine(a < b + c); // Prints False
    

    编辑:

    double a = 1.0;
    double b = 1.0 / (1L << 53);
    double c = a;
    
    Console.WriteLine(a - b < c); // Prints True
    Console.WriteLine(a < b + c); // Prints False
    

    换句话说,当我们从1中减去一个很小的数时,我们得到的结果小于1。当我们把相同的数字加到1上时,由于双精度的限制,我们只得到1。

        2
  •  6
  •   Tim Carter    14 年前

    不,不总是这样:

            double a = double.MaxValue;
            double b = double.MaxValue;
            double c = 0.1;
            Console.WriteLine(a - b < c); // True
            Console.WriteLine(a < b + c); // False
    
        3
  •  2
  •   digEmAll    14 年前

    此链接介绍浮点算术属性,可能非常有趣:

    FLOATING-POINT FALLACIES

    关系的性质