有人可以向我解释一下吗?在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进行比较并获得真实?
答案 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/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);
答案 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小提琴。