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

时间:2009-07-17 20:12:36

标签: c# .net

有人可以向我解释一下吗?在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

我可以将什么常数与double.NaN进行比较并获得真实?

11 个答案:

答案 0 :(得分:130)

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

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

时髦,是吗?

答案 1 :(得分:44)

使用Double.IsNaN

答案 2 :(得分:15)

bool isNaN = Double.IsNaN(yourNumber)

答案 3 :(得分:10)

这种行为是故意的。原因是NaN表示不是数字的东西,因此对于许多事情而言,这是一种全能。

将某些内容与NaN进行比较的正确方法是使用IsNaN函数。

答案 4 :(得分:7)

使用Double.IsNan()在此处测试相等性。原因是NaN不是数字。

答案 5 :(得分:6)

这是一个专门的功能:

double.IsNan(huh);

答案 6 :(得分:5)

使用方法“Double.IsNaN(value)”检查此情况。

答案 7 :(得分:3)

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

False

在引擎盖下,Double.IsNaN方法实际上可能会做同样的事情。你仍然应该使用它,因为任何不了解FP标准的人都会感到非常惊讶。

答案 8 :(得分:2)

我们对NaN唯一了解的是它是“非数字”。这并不意味着它具有与其状态相关联的值。例如:

∞+( - ∞)= NaN

0/0 = NaN

(∞+( - ∞))&lt;&gt; (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);

答案 9 :(得分:2)

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);

答案 10 :(得分:2)

  
    

Equality运算符认为两个NaN值彼此不相等。通常,Double运算符不能用于将Double.NaN与其他Double值进行比较,尽管比较方法(例如等于 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");
        }
    }
}

here同样是.net小提琴。