2014-10-18 72 views
2

当比较大的变化双打它发生下列测试失败:比较与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?

+2

如果你明白为什么测试失败,最好是如果你从问题的开始就明确*,而不是在最后一部分改变问题。 – 2014-10-18 16:40:54

+0

看看[这个问题](http://stackoverflow.com/questions/15330644/get-next-smallest-double-number)。 – Zong 2014-10-18 16:41:20

+0

@Jon:你说得对,我希望现在更清楚。 – 2014-10-18 17:10:40

回答

5

要回答最后问题,因为它听起来像你真正明白为什么测试失败...

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