为什么NAN比较返回true?

问题描述 投票:0回答:2

如 Java 语言规范中所述“如果两个操作数之一或两个操作数均为 NaN,则数字比较运算符 <, <=, > 和 >= 返回 false” 所以我正在比较两个 NAN。 为什么当我比较两个 NAN 时它在控制台中打印 true?

double f = 3/0.0d;
double h = 2/0.0d;
        
System.out.println((f>=h));

f 和 h 都是 NAN,当我比较它们时,我期望打印 false,但我的输出为 true。

java floating-point ieee-754
2个回答
0
投票

盗贼 已经解释得很好了:

因为

f
h
的值不是
NaN
,而是无穷大!
Double.NaN == Double.NaN
false
,但是
Double.POSITIVE_INFINITY == Double.POSITIVE_INFINITY
true

除了此注释之外,您还应该知道

NaN
表示无效操作的结果,例如
0/0.0d
Math.sqrt(-1)
等。因此,以下语句将打印
false

System.out.println(0 / 0.0d == Math.sqrt(-1));

0
投票

2.0/0 不会产生 NaN:

System.out.println(2.0/0.0);
> Infinity

双精度数有 3 个“非数字”值:

  • 正无穷
  • 负无穷
  • NaN

根据规范,正无穷大等于正无穷大,负无穷大等于负无穷大。只有 NaN 不等于其自身。

我们可以得到 NaN:

double nan = 0.0 / 0.0;
System.out.println(nan);
System.out.println(nan == nan);
> NaN
> false

如果你确实需要 NaN 某处(例如你想返回它),最清晰的方法是

Double.NaN
。上面的示例简单地展示了如何自然地从计算中获得 NaN 值 - 最常见的方式是零除以零。其他一些方法:

double posInf = Double.POSITIVE_INFINITY;
double negInf = Double.NEGATIVE_INFINITY;
System.out.println(posInf - posInf); // NaN
System.out.println(posInf - negInf); // positive infinity
System.out.println(posInf / posInf); // NaN
© www.soinside.com 2019 - 2024. All rights reserved.