【问题标题】:double.NaN Equality in MS TestMS 测试中的 double.NaN 等式
【发布时间】:2011-02-01 05:46:04
【问题描述】:

为什么我会得到这个结果?

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

delta 在断言 NaN 等于数字方面有什么区别?当然,它应该总是返回 false。我知道 IsNaN,但这在这里没有用(见下文)。

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

【问题讨论】:

标签: c# mstest nan


【解决方案1】:

当您使用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 不大于您传递的 delta,但只是因为它试图表明您无法执行比较。

故事的寓意:NaN 的行为非常疯狂(但一些聪明人能想出的最好的方法)。在执行任何不能让错误无声传播的计算之前,请尽量检查 NaN,例如这个。

【讨论】:

    【解决方案2】:

    看看这里: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 :-)

    【讨论】:

    • 太好了,谢谢。那个问题的 OP 似乎让问题和我做的一模一样,很奇怪。
    【解决方案3】:

    你能用这个测试代替 NaN 吗?

    double.IsNaN(somenNumber)
    

    【讨论】:

    • 是的,但我不希望我的结果是 NaN,如果我只是运行测试而不使用预期值进行调试,它会通过。不好。
    猜你喜欢
    • 2010-10-08
    • 2010-09-05
    • 2011-07-21
    • 1970-01-01
    • 2010-11-11
    • 2011-04-03
    • 2012-02-07
    • 2021-05-08
    相关资源
    最近更新 更多