当比较不同的大双打时,会发生以下测试失败:
[Test]
public void DoubleMaxValueTest()
{
double val = Double.MaxValue;
double epsilon = 10000.0;
Assert.IsTrue(val > (Double.MaxValue - epsilon));
}
意识到双精度表示为尾数,指数和符号位,这是因为值Double.MaxValue - 10000实际上与Double.MaxValue(这些值相等)实际表示。
问题是:如何获得此测试返回的最小epsilon?
答案 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
。