为什么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/0
和Math.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
对于Double
和Single
使用静态函数,例如
Double.IsNaN(value) && Double.IsInfinity(value);
或者更具体的:
Double.IsPositiveInfinity(value); Double.IsNegativeInfinity(value);
平等运算符认为两个NaN值是不相等的。 通常,Double运算符不能用于比较Double.NaN和其他Double值,尽pipe比较方法(如Equals和CompareTo )可以。 看下面的例子
从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小提琴的一样。