为什么会出现这样的结果?

[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)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top