比较与Double.MaxValue

时间:2014-10-18 16:36:18

标签: c# double floating-accuracy

当比较不同的大双打时,会发生以下测试失败:

[Test]
public void DoubleMaxValueTest()
{
    double val = Double.MaxValue;
    double epsilon = 10000.0;
    Assert.IsTrue(val > (Double.MaxValue - epsilon));
}

意识到双精度表示为尾数,指数和符号位,这是因为值Double.MaxValue - 10000实际上与Double.MaxValue(这些值相等)实际表示。

问题是:如何获得此测试返回的最小epsilon?

1 个答案:

答案 0 :(得分:5)

回答最终的问题,因为听起来你真的明白为什么测试会失败......

IEEE-754具有一个简洁的属性,如果你采用相邻的按位值,那么这些值最终会与可表示的double值相邻。所以你可以找到第二高的"通过将double的位模式视为整数,减去1,并将结果转换回MaxValue来表示double

using System;

class Test
{
    static void Main()
    {
        long maxDoubleBits = BitConverter.DoubleToInt64Bits(Double.MaxValue);
        double nextLargestDouble = BitConverter.Int64BitsToDouble(maxDoubleBits - 1);
        double difference = double.MaxValue - nextLargestDouble;
        Console.WriteLine(difference);
    }
}

结果是1.99584030953472E + 292

现在,差异是MaxValue与下一个最高值之间的实际差异。因此,您可以从double.MaxValue中减去以获得不是 MaxValue的值的最小金额实际为difference / 2