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