提问人:Aryan Singh 提问时间:8/21/2023 最后编辑:ZabuzardAryan Singh 更新时间:8/22/2023 访问量:87
为什么 NAN 的比较返回 true?
Why does comparison of NAN return true?
问:
正如 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。
答:
2赞
Arvind Kumar Avinash
8/21/2023
#1
Rogue 已经很好地解释了这一点:
因为 和 的值不是 ,而是无穷大! 是 ,但 是 。
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));
2赞
rzwitserloot
8/21/2023
#2
2.0/0 不会产生 NaN:
System.out.println(2.0/0.0);
> Infinity
doubles 有 3 个“非数字”值:
- 正无穷大
- 负无穷大
- 南
根据规范,正无穷大等于正无穷大,负无穷大等于负无穷大。只有 NaN 不等于自身。
我们可以得到 NaN:
double nan = 0.0 / 0.0;
System.out.println(nan);
System.out.println(nan == nan);
> NaN
> false
如果您确实在某个地方需要 NaN(例如,您想归还它),那么到达那里的最清晰的方式是 .上面的例子只是展示了如何自然地从计算中得到 NaN 值 - 当零除以零是最常见的方法时。其他几种方式:Double.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
评论
0赞
chux - Reinstate Monica
8/22/2023
将“有 3 个'非数字'值”视为“有 3 个'非有限'值”更好。
0赞
rzwitserloot
8/22/2023
这更像是哲学的问题。无穷大不是数字,这很清楚:它们不由数字组成,也不代表单个值(因此,为什么“正无穷大减去正无穷大”不是零,而是 NaN - 因为它们代表一团数字)。我甚至会说:非数字实际上是一个更好的术语(而 NaN 是一个不好的术语)。
0赞
chux - Reinstate Monica
8/22/2023
不同意“像白天一样清晰”,因为将无穷大视为数字有很多合理性,包括:0.0/0.0 也是 NAN,但这并不能使 0.0 成为非数字。无穷大 >= 所有其他数值,无穷大 + 无穷大 --> 无穷大,1/无穷大 --> 0.0,...以及无穷大的许多其他用途有助于将其视为数字。使用 时,无穷大按数字顺序排列。由于无穷大不是一个非数字,它在词典上是一个数字。Java 将无穷大视为具有无限值的数字。unordered(x, y)
0赞
rzwitserloot
8/22/2023
这是一个灰色的阴影:无穷大的行为部分是数字的,部分是非数字的。我支持这个答案。在这种情况下,从NaN是not-a-number的缩写的概念中提取出对“数字”一词的过于具体的解释(例如,比普通听众/读者的直觉更具体)并不是一个公平的逻辑跳跃:NaN作为一个术语有60年的历史包袱。
-1赞
Reilas
8/22/2023
#3
"...为什么当我比较两个 NAN 时,它在控制台中打印 true?..."
它们不是 NaN。
f = Infinity
h = Infinity
public static final double NaN = 0.0d / 0.0;
输出
false
评论
f
h
NaN
infinity
Double.NaN == Double.NaN
false
Double.POSITIVE_INFINITY == Double.POSITIVE_INFINITY
true