为啥 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.PositiveInfinity
和float.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) 通过?
45 Float.NaN == Float.NaN 为 false 是怎么实现的?
45 Float.NaN == Float.NaN 为 false 是怎么实现的?