計算機算術

多くのプログラミング言語で、倍精度の 0.1 + 0.2 == 0.3 という比較が偽になる理由として正しいものはどれか。

  1. A足し算の命令が、小数の足し算を正しく行えないことがあるから
  2. B0.3は浮動小数点数で表せない特別な値で、比較が常に偽になるから
  3. Cどれも丸めた近い値で表され、誤差で値がわずかに違うから
答えと解説を見る

正解:C. どれも丸めた近い値で表され、誤差で値がわずかに違うから

0.1、0.2、0.3はどれも2進数で正確に表せず、それぞれ最も近い値に丸めて記録されます。0.1と0.2の近似値を足して丸めた結果は 0.30000000000000004 となり、0.3の近似値 0.29999999999999998… とは最後の桁で一致しません。そのため浮動小数点数の比較は、差の絶対値が小さな許容値以下かどうかで判定するのが一般的です。足し算の命令は規格どおり正しく丸めており、0.3も近似値として表せます。

  • A. 足し算の命令は規格どおり正しく丸めています。
  • B. 0.3も、近い値として表せます。
  • C. 正しい。それぞれの丸め誤差のため、結果がわずかに違います。
この分野を解く 分野ページへ

計算機算術のほかの問題

  1. IEEE 754の単精度のマシンイプシロン(1と、1の次に大きい表せる数との差)はいくらか。
  2. 単精度と倍精度の浮動小数点数で信頼できる10進数の有効桁数の目安の組み合わせとして正しいものはどれか。
  3. IEEE 754の非正規化数(サブノーマル数)の役割として正しいものはどれか。
  4. 非正規化数を多く含む計算で、一部のプロセッサでは処理が大きく遅くなることがある。そのため性能を優先する場面で使われる設定はどれか。
  5. IEEE 754の浮動小数点数の演算で、正の数を0で割ったときの結果として規格で定められているものはどれか。