Single.NaN不等于自己?

时间:2012-07-17 08:17:58

标签: c# nan

我在调试一些单元测试时发现了这一点,这些测试将返回的单个数组与预期结果进行了比较。

System.Single.NaN == System.Single.Nan;

单元测试期望为真,但评估结果为假。当其他单一的静态方法返回true时,为什么这会求值为false? NaN不是一个恒定的值吗?

System.Single.MaxValue == System.Single.MaxValue;
System.Single.Epsilon == System.Single.Epsilon;
null == null;

http://msdn.microsoft.com/en-us/library/system.single.nan.aspx说:“两个NaN值被认为是彼此不相等的。”但这个问题出于好奇,为什么这比其他任何东西都重要。

3 个答案:

答案 0 :(得分:5)

因为IEEE 754标准(用于floatdouble的标准)是这样说的。

引用wiki

  

与NaN进行比较时,即使与自身进行比较,也会返回无序结果。比较谓词是信令或非信令,信令版本表示这种比较的无效例外。等式和不等式谓词是非信令的,因此x = x返回false可用于测试x是否是安静的NaN。如果它们接收NaN操作数,则其他标准比较谓词都是信令,该标准还提供这些其他谓词的非信令版本。谓词isNaN(x)确定一个值是否为NaN并且从不发出异常信号,即使x是信令NaN。

(请注意,.NET不支持信令NaN,并且可能将其视为非信令)

答案 1 :(得分:1)

这是正确的。 NaN == NaN始终为假。这是一种测试某个变量是否等于NaN的方法,如

  

if(x!= x)    //做点什么

答案 2 :(得分:0)

有人asked thisDouble.NaN。我在那篇文章中找到的最佳答案是“因为这是它定义的方式”。

不太满意,我同意。