Single.NaN 不等于自身?

Posted

技术标签:

【中文标题】Single.NaN 不等于自身?【英文标题】:Single.NaN doesn't equal itself? 【发布时间】:2012-07-16 03:24:39 【问题描述】:

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

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 值被认为是不相等的。”但这个问题是出于好奇,为什么这比其他任何事情都重要。

【问题讨论】:

如果您考虑 NaN 的实际含义,可能会更容易理解为什么 NaN 永远不相等。 “A”是 NaN,“b”也是 NaN,“其他一些 B****s”仍然是 NaN。他们平等吗?没有。 【参考方案1】:

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

引用wiki

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

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

【讨论】:

【参考方案2】:

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

如果(x != x) //做点什么

【讨论】:

【参考方案3】:

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

不是很满意,我同意。

【讨论】:

以上是关于Single.NaN 不等于自身?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 [1,2,3] 在 Javascript 中不等于自身? [复制]

为啥Lua算术不等于自身? [复制]

为啥多维数组的枚举值不等于自身?

为什么 NaN 不等于自身?

面试官:x可以不等于它自身吗?

R的名称是否等于Pandas df.columns?