Comparison vs. Double.MaxValue

本文关键字:MaxValue Double vs Comparison | 更新日期: 2023-09-27 18:27:03

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

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

请注意,doubles表示为尾数、指数和符号位,这是因为值Double.MaxValue-10000实际上与Double.MaxValue的表示方式相同(这些值相等)。

问题是:如何得到这个测试返回true的最小ε?

Comparison vs. Double.MaxValue

要回答最后一个问题,因为听起来你实际上理解了测试失败的原因。。。

IEEE-754有一个巧妙的特性,如果你取相邻的逐位值,这些值最终会成为相邻的可表示的double值。因此,您可以通过将MaxValue的位模式视为整数,减去1,并将结果返回为double:来找到"第二高"的可表示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