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)下载