比较与Double.MaxValue
问题描述:
当比较大的变化双打它发生下列测试失败:比较与Double.MaxValue
[Test]
public void DoubleMaxValueTest()
{
double val = Double.MaxValue;
double epsilon = 10000.0;
Assert.IsTrue(val > (Double.MaxValue - epsilon));
}
意识到作为双打被表示为尾数,指数和符号位是由于这样的事实: Double.MaxValue - 10000的值实际上表示方式与Double.MaxValue相同(这些值相等)。
问题是:如何获得此测试返回true的最小epsilon?
答
要回答最后问题,因为它听起来像你真正明白为什么测试失败...
IEEE-754有着简洁的属性,如果你把相邻的按位值,这些最终会被相邻可表示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
位模式为整数,减去1,并转动结果返回到
double
找到“第二高”表示的
double
现在,差异是实际与MaxValue
之间的差异和次高值。因此,您可以从double.MaxValue
中扣除的最小金额以获得不是的值MaxValue
实际上是difference/2
。
如果你明白为什么测试失败,最好是如果你从问题的开始就明确*,而不是在最后一部分改变问题。 – 2014-10-18 16:40:54
看看[这个问题](http://*.com/questions/15330644/get-next-smallest-double-number)。 – Zong 2014-10-18 16:41:20
@Jon:你说得对,我希望现在更清楚。 – 2014-10-18 17:10:40