double.NaN平等在MS测试

double.NaN平等在MS测试

问题描述:

为什么我会得到这个结果?double.NaN平等在MS测试

[TestMethod] 
public void nan_test() 
{ 
    Assert.AreEqual(1, double.NaN, 1E-1); <-- Passes 
    Assert.AreEqual(1, double.NaN);  <-- Fails 
} 

三角洲声称NaN有什么区别等于一个数字?当然,它总是会返回错误的。我知道IsNaN,但在这里没有用(见下文)。背景:我有一个函数返回NaN(错误地),它的意思是一个实数,但测试仍然通过。我使用的是三角洲,因为它是双精度平等,原始测试使用1E-9。

+2

Microsoft bug entry:https://connect.microsoft.com/VisualStudio/feedback/details/762286/unit-test-with-assert-areequal-2-3-double-nan-0-1-passes – jbe 2012-09-12 09:29:09

+0

请参阅也是http://stackoverflow.com/questions/1780004/why-do-mstests-assert-areequal1-0-double-nan-0-0-pass – 2015-01-20 11:30:58

当您使用Assert.AreEqual(1, double.NaN),它试图相等测试在数字上,当然它失败了,因为double.NaN不等于任何东西。

当你做Assert.AreEqual(1, double.NaN, 1E-1),它必须对数字进行算术运算。具体来说,它计算

Math.Abs((double) (expected - actual)) > delta 
Math.Abs(1 - double.NaN) > 1E-1 
Math.Abs(double.NaN) > 1E-1 // All arithmetic with double.NaN returns double.NaN 
double.NaN > 1E-1 // All comparisons with double.NaN return false (except !=) 

这是错误的。它看起来像实际增量不大于你通过的delta,但只是因为它试图表明你不能执行比较。这个故事的寓意:NaN的行为非常疯狂(但最好的一些聪明的人可以提出)。在执行任何计算之前,尽可能检查NaN,在这种情况下,您无法默默地传播错误,就像这样。

+0

很好的解释,谢谢 – RichK 2010-03-26 15:54:01

你可以用NaN代替这个测试吗?

double.IsNaN(somenNumber) 
+1

是的,但我不希望我的结果是NaN,如果我只是运行测试而没有用期望的值进行调试,它会通过。不好。 – RichK 2010-03-26 15:45:19

看一看这里:Why does Assert.AreEqual(1.0, double.NaN, 1.0) pass?

编辑:

肯定是有在Assert.AreEqual的错误。在VS 2008的Microsoft.VisualStudio.QualityTools.UnitTestFramework它的编码为

if (Math.Abs((double) (expected - actual)) > delta) 
{ 
    // report error 
} 

至于你的情况Math.Abs((double) (expected - actual))double.NaN,比较收益率false :-)

+0

非常好,谢谢。这个问题的OP似乎让问题与我完全一样,很奇怪。 – RichK 2010-03-26 15:44:39