在MS测试中的双重平等

Ric*_*chK 6 c# mstest nan

为什么我得到这个结果?

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

三角洲在断言NaN方面与一个数字有什么不同?当然它应该总是返回假.我知道IsNaN,但这在这里没用(见下文).

背景:我有一个函数返回NaN(错误地),它本来是一个实数,但测试仍然通过.我正在使用delta,因为它是双精度相等,原始测试使用1E-9.

Mik*_*ham 4

当您使用 时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 !=)
Run Code Online (Sandbox Code Playgroud)

这是错误的。看起来实际的增量并不大于您传递的增量,但这只是因为它试图delta表明您无法执行比较。

这个故事的寓意是:NaN 的行为相当疯狂(但一些聪明人能想出的最好的办法)。在执行任何无法让错误以静默方式传播的计算之前,请尽力检查 NaN,就像这样。