IT Notes‎ > ‎Java‎ > ‎Java Language‎ > ‎《Java 解惑》笔记‎ > ‎

Puzzle 29: Bride of Looper

”相等“关系的自反性不成立


在一实际的语言实现中,如Java,它无法完全实现数学上的”相等“关系,这里要列举违反”自反性“的例子。

这个表达式的值可能为真吗?
i != i
当然,Java里有两个值可以让其为真,一为Double.NaN,二为Float.NaN。NaN不等于任何数,包括不等于NaN。

据JLS里的说法(附2),这是依据IEEE 754,只要表达式中含有操作数NaN (Not a Number),那么==便不成立,成立的是!=。因此,下面的代码也会输出false的:
double i = 0.0 / 0.0;
System.out.println(i - i == 0);

另外,一切NaN参与的浮点运算,结果都是NaN.

PS: 不理解为什么书中的标题是Birde of Looper.



  1. IEEE-754的最新版没有找到免费下载,不胜郁闷。
  2. JLS 15.21.1 Numerical Equality Operators == and != 
  3. 本文使用的代码可以在这里(TODO add a link for download)下载
Comments