1. ホーム
  2. floating-point

[解決済み】Lisp: なぜ (- 1e16 1) は 999999999999 ではなく 1000000000000 になるのでしょうか?

2022-02-13 23:59:51

質問

というか、なぜ (= 1e16 (- 1e16 1)) が真を返すか?どうすればより正確な回答が得られるのでしょうか?

どのように解決するのですか?

1e16 は、Scheme的には不正確な数(より実用的な言い方をすれば浮動小数点数)である。2 以上の (倍精度の) 浮動小数点数では 53 (9007199254740992)であることから ウルップ は1より大きいので、1刻みの変化は小さすぎて表現できないことを意味します。

一方、1000000000000は整数である。もし、あなたが (- 10000000000000000 1) 999999999999と表示されます。Schemeでは、次のように書くこともできます。 #e1e16 は同じ量を表します。 #e をつけると正確な数になります(Schemeの用語で、実用的には整数か有理数という意味です)。

を評価してみてください。 (+ 9007199254740992.0 1)(- 9007199254740992.0 1) を評価し、次に (+ 9007199254740992 1)(- 9007199254740992 1) は整数との対比のため。