Puzzle 28: Looper

浮点数的不精确性

怎样让以下表达式为真?

d == d + 1;

很好办,声明 double d = Double.Double.POSITIVE_INFINITY 就可以了。因为,从数学上讲,无穷大加一还是无穷大。

infinity = infinity + 1 (TODO 化成数学式子,网速慢,回去弄)

其实,在Java中,并不需要无穷大,就可以做到 d == d + 1 为真,声明 double d = 1.0e40 即可。

Java中的浮点数表示的依据是IEEE 774(TODO 靠新版文档要钱,但Java依据的应该不是最新版,读下旧的看看)

Java中的浮点数是近似的,所以上面的情况成立。原理待研究。

  1. Puzzle 26: In the Loop
  2. IEEE 754 on wikipedia