题
为什么会出现这样的结果?
[TestMethod]
public void nan_test()
{
Assert.AreEqual(1, double.NaN, 1E-1); <-- Passes
Assert.AreEqual(1, double.NaN); <-- Fails
}
区别呢三角洲有NaN的主张等于什么一些?当然,它应该始终返回false。我知道IsNaN的,但在这里,这不是有用的(见下文)。
背景:我有一个函数返回的NaN(错误地),它的意思是实数,但仍通过了测试。我使用的增量,因为它是双精度平等,所使用的原来的测试1E-9。
解决方案
当您使用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。
其他提示
看看这里:为什么Assert.AreEqual(1.0,double.NaN,1.0)通?
编辑:
肯定是在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
: - )
你能使用这个测试楠呢?
double.IsNaN(somenNumber)
不隶属于 StackOverflow