計算機算術

x が非常に大きいとき、√(x + 1) − √x を浮動小数点で計算すると桁落ちが起こる。結果を精度よく求めるための書き換えとして正しいものはどれか。

  1. A1 ÷ (√(x + 1) + √x) として計算する
  2. B√(x + 1 − x) として計算する
  3. C√(x + 1) と √x をそれぞれ倍精度に変えてから、同じ式で引き算する
答えと解説を見る

正解:A. 1 ÷ (√(x + 1) + √x) として計算する

√(x + 1) と √x はほぼ等しいので、そのまま引くと上位の桁が打ち消し合います。分子と分母に √(x + 1) + √x を掛けると、(x + 1 − x) ÷ (√(x + 1) + √x) = 1 ÷ (√(x + 1) + √x) となり、近い数どうしの引き算がなくなって精度よく計算できます。√(x + 1 − x) は1となり、式として誤りです。倍精度にすると改善はしますが、xがさらに大きくなれば同じ問題が起こるので、根本の対策にはなりません。

  • A. 正しい。引き算をなくす変形で、桁落ちを避けられます。
  • B. √(x + 1 − x) は1になり、元の式と等しくありません。
  • C. 倍精度でも、xがさらに大きいと同じ問題が起こります。
この分野を解く 分野ページへ

計算機算術のほかの問題

  1. 単精度の浮動小数点数で、1億(10⁸)に1を足しても結果が1億のまま変わらない。この現象の説明として正しいものはどれか。
  2. 大量の浮動小数点数を足し合わせるときに使われるカハンの加算(補正つき加算)の目的として正しいものはどれか。
  3. FMA(融合積和演算)命令で a × b + c を計算する利点として正しいものはどれか。
  4. bfloat16がAIの学習で使われる主な理由はどれか。
  5. FP16(半精度:符号1・指数部5・仮数10ビット)でニューラルネットワークを学習させるときに問題になりやすく、損失の値を何倍かに拡大して計算する工夫(ロススケーリング)で対策するのはどれか。