【发布时间】:2023-03-20 10:18:01
【问题描述】:
为什么无限比较不遵循应用于 NaN 的逻辑?这段代码打印了三遍false:
double a = Double.NaN;
double b = Double.NaN;
System.out.println(a == b); // false
System.out.println(a < b); // false
System.out.println(a > b); // false
但是,如果我将 Double.NaN 更改为 Double.POSITIVE_INFINITY,我得到 true 表示相等,但 false 表示大于和小于比较:
double a = Double.POSITIVE_INFINITY;
double b = Double.POSITIVE_INFINITY;
System.out.println(a == b); // true
System.out.println(a < b); // false
System.out.println(a > b); // false
这似乎很危险。假设无限值是由溢出产生的,我想两个以无穷大结尾的变量在完美算术中实际上并不相等。
【问题讨论】:
-
@giorashc 问题是
why is Double.POSITIVE_INFINITY == Double.POSITIVE_INFINITY true -
不同意它是重复的。这个问题涉及到它的 POSITIVE_INFINITY 方面,这个问题是有效的。两个无穷大不一定相等,尤其是在浮点溢出变为有符号无穷大的 Java 上下文中。可以基于此比较两个操作结果并返回 true(因为两者都是 POSITIVE INFINITY),但实际上结果会有所不同。
-
不管无穷大:使用
==比较浮点数或双精度总是危险的! -
@piet.t 事实是,人们不应该假设浮点计算的行为与其数学同义词一样,它总是以你的方式被双曲线和错误地陈述刚刚做了。浮点相等在很多情况下都很有用,而且它并不比赋值(也不同于数学中变量的行为方式)或显式内存管理(也不同于数学中的行为方式)更危险。
-
为什么任何事物的行为方式与完全不同的事物不同?为什么我们会期望一个不是数字的东西像数字一样具有可比性?伟大的哲学问题,糟糕的堆栈溢出问题。
标签: java floating-point comparison nan infinity