[解決済み】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)
は整数との対比のため。
関連
-
[解決済み】Lisp: なぜ (- 1e16 1) は 999999999999 ではなく 1000000000000 になるのでしょうか?
-
[解決済み] なぜGCCはa*a*a*a*aを(a*a*a)*(a*a*a)に最適化しないのでしょうか?
-
[解決済み] 0.1fを0にすると、なぜ10倍もパフォーマンスが落ちるのですか?
-
[解決済み] 通貨を表すのにDoubleやFloatを使ってはいけないのですか?
-
[解決済み] Math.round(0.4999999999994) はなぜ1を返すのですか?
-
[解決済み】IEEE754のNaN値に対して、すべての比較がfalseを返す根拠は何ですか?
-
[解決済み】sumの順番を変えると違う結果になるのはなぜですか?
-
[解決済み] 単精度浮動小数点演算と倍精度浮動小数点演算はどう違うのですか?
-
[解決済み] なぜNaNはNaNと等しくないのですか?[重複あり]
-
[解決済み] 2つの不等な浮動小数点数の引き算で0を得ることは可能ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン