我在调试一些单元测试时发现了这一点,这些测试将返回的单个数组与预期结果进行了比较。
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值被认为是彼此不相等的。”但这个问题出于好奇,为什么这比其他任何东西都重要。
答案 0 :(得分:5)
因为IEEE 754标准(用于float
和double
的标准)是这样说的。
引用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 this约Double.NaN
。我在那篇文章中找到的最佳答案是“因为这是它定义的方式”。
不太满意,我同意。