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的最小ε?
要回答最后一个问题,因为听起来你实际上理解了测试失败的原因。。。
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
。