为啥 float.NaN != double.NaN 在 C# 中?

Posted

技术标签:

【中文标题】为啥 float.NaN != double.NaN 在 C# 中?【英文标题】:Why float.NaN != double.NaN in C#?为什么 float.NaN != double.NaN 在 C# 中? 【发布时间】:2011-07-09 16:49:00 【问题描述】:

为什么是float.NaN != double.NaN

float.PositiveInfinity == double.PositiveInfinityfloat.NegativeInfinity == double.NegativeInfinity 相等

示例:

bool PosInfinity = (float.PositiveInfinity == double.PositiveInfinity); //true
bool NegInfinity = (float.NegativeInfinity == double.NegativeInfinity); //true

bool isNanEqual = (float.NaN == double.NaN);  //false, WHY?

【问题讨论】:

请任何人举一些当数字变为 NaN 的例子。 你也注意到double.NaN != double.NaN了吗? 参见“为什么 double.nan 不等于自身”***.com/questions/1145443/… 【参考方案1】:

可能是因为NaN != NaN

【讨论】:

【参考方案2】:

引用wikipedia:

与 NaN 的比较总是返回无序的结果,即使与它自身比较也是如此。

【讨论】:

就像事务sql一样,NULL总是不同于NULL:P【参考方案3】:

NaN 永远不会等于 NaN(即使在同一类型中)。因此IsNaN 函数存在的原因:

Double zero = 0;
// This will return true.
if (Double.IsNaN(0 / zero)) 

    Console.WriteLine("Double.IsNan() can determine whether a value is not-a-number.");


您还应该注意,您所展示的所有比较实际上都不是“按原样”进行的。当您编写floatValue == doubleValue 时,浮点数实际上会在比较发生之前隐式转换为双精度数。

【讨论】:

以上是关于为啥 float.NaN != double.NaN 在 C# 中?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Assert.AreEqual(1.0, double.NaN, 1.0) 通过?

浮点数.NaN == 浮点数.NaN

45 Float.NaN == Float.NaN 为 false 是怎么实现的?

45 Float.NaN == Float.NaN 为 false 是怎么实现的?

如何从python中的混合数据类型列表中删除nan(float)项目[重复]

如何检查单元测试中的值是不是为nan?