为什么double.NaN不等于自己?

谁可以给我解释一下这个? 在C#中double.NaN不等于double.NaN

bool huh = double.NaN == double.NaN; // huh = false bool huh2 = double.NaN >= 0; // huh2 = false bool huh3 = double.NaN <= 0; // huh3 = false 

什么常数,我可以比较一个doubleNNN,并成为现实?

如果你好奇,这就是Double.IsNaN样子:

 public static bool IsNaN(double d) { return (d != d); } 

时髦,是吧?

使用Double.IsNaN 。

 bool isNaN = Double.IsNaN(yourNumber) 

行为是有目的的。 原因是NaN代表的东西不是一个数字 ,所以这是一个万能的东西。

比较NaN的正确方法是使用IsNaN函数。

使用Double.IsNan()在这里testing相等。 原因是NaN不是一个数字。

有一个专门的function:

 double.IsNan(huh); 

使用方法“Double.IsNaN(值)”来检查这种情况。

实际上,您已经find了检查IEEE-754浮点数是否是NaN的方法 :它是唯一的浮点值(或值的范围,因为有几个NaN),如果与自身比较,其值为False ,即:

 bool isNaN(double v) { return v != v; } 

在引擎盖下,Double.IsNaN方法实际上可能做同样的事情。 你仍然应该使用它,因为对于不了解FP标准的人来说,这种行为是相当令人惊讶的。

我们唯一知道的是NaN是“不是数字”。 这并不意味着它具有与其状态相关的价值。 例如:

∞+( – ∞)= NaN

0/0 = NaN

(∞+(-∞))<>(0/0)

这里有一些C#来演示

 var infinity = 100d / 0; var negInfinity = -100d / 0; var notANumber = infinity + negInfinity; Console.WriteLine("Negative Infinity plus Infinity is NaN: {0}", double.IsNaN(notANumber)); var notANumber2 = 0d / 0d; Console.WriteLine("Zero divided by Zero is NaN: {0}", double.IsNaN(notANumber2)); Console.WriteLine("These two are not equal: {0}", notANumber == notANumber2); 

Double.NaN != Double.NaN的原因很简单:

你期望0/0Math.Sqrt(-3)吗? 和Math.Sqrt(-7)吗?

在C#中有一个错误,我认为Equals()不会覆盖NaN。

 Assert.IsTrue(Double.NaN != Double.NaN); Assert.IsTrue(Double.NaN.Equals(Double.NaN)); 

与此同时

 Assert.IsTrue(Double.PositiveInfinity == Double.NegativeInfinity); Assert.IsTrue(Double.PositiveInfinity.Equals(Double.PositiveInfinity)); // same for Double.NegativeInfinity and Single 

对于DoubleSingle使用静态函数,例如

 Double.IsNaN(value) && Double.IsInfinity(value); 

或者更具体的:

 Double.IsPositiveInfinity(value); Double.IsNegativeInfinity(value); 

平等运算符认为两个NaN值是不相等的。 通常,Double运算符不能用于比较Double.NaN和其他Double值,尽pipe比较方法(如EqualsCompareTo )可以。 看下面的例子

从msdn引用

 class Program { static void Main(string[] args) { Double i = Double.NaN; while (!i.Equals(i)) //this would be result in false //while(i != i) // this would result in true. { Console.WriteLine("Hello"); } } } 

这里是.net小提琴的一样。