c# - double.NaN MS 测试中的相等性

标签 c# mstest nan

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

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

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

背景:我有一个函数返回 NaN(错误地),它本来是一个实数,但测试仍然通过。我使用 delta 是因为它是 double 相等,原始测试使用 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 !=)

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

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

关于c# - double.NaN MS 测试中的相等性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2524462/

相关文章:

c# - 如何将 byte[] 转换为 {#, #, #} 格式的字符串?

c# - 在.Net core Web API中使用Xunit - 如何测试/通过500状态代码

c# - 将 Xamarin.forms 应用程序上的目标框架从 Android 8.1 更改为 Android 9(对于 Xamarin.Essentials)

c# - 如何获取在方法单元测试中分配给 protected 对象的 HttpContext.Current.Server.MapPath 的假路径?

nunit - 在没有 Visual Studio 的情况下运行 SpecFlow 测试

javascript - undefined 和 NaN,隐式与显式转换为 boolean 值

c++ - 动态规划 : Timus Online Judge 1119 Metro

c# - 使用C#读取RAR文件的内容

.net - 由于 .net MVC 中的 HttpContext,测试我的 Controller 引发错误

c++ - 矩阵乘法的结果是 'nan'