0

我在调试一些将返回的单个数组与预期结果进行比较的单元测试时遇到了这个问题。

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

单元测试期望为真,但这评估为假。当 single 的其他静态方法返回 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 值被认为是不相等的。” 但是这个问题是出于好奇,为什么这比其他任何事情都重要。

4

3 回答 3

5

因为 IEEE 754 标准(用于float和的标准double)是这么说的。

引用维基

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

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

于 2012-07-17T08:20:59.107 回答
1

那是对的。NaN == NaN 总是错误的。这是一种测试某个变量是否等于 NaN 的方法,例如

if(x != x) //做某事

于 2012-07-17T08:24:37.363 回答
0

曾经有人问过这个问题Double.NaN。我在那篇文章中能找到的最佳答案是“因为它是这样定义的”。

不是很满意,我同意。

于 2012-07-17T08:21:07.090 回答