コンパイラ

コンパイラが、浮動小数点数の足し算 (a + b) + c を、厳密な設定のもとでは a + (b + c) に勝手に並べ替えない理由として正しいものはどれか。

  1. A丸め誤差のため結合法則が成り立たず、結果が変わりうるから
  2. B並べ替えると、足し算の回数が増えてしまうから
  3. C浮動小数点数の足し算は、ハードウェアが順番を自動で決めるから
答えと解説を見る

正解:A. 丸め誤差のため結合法則が成り立たず、結果が変わりうるから

浮動小数点数の計算では、足し算のたびに結果が表せる桁に丸められるので、計算の順番を変えると結果がわずかに変わることがあります。例えば非常に大きな数と小さな数を先に足すと小さな数が丸めで消えますが、小さな数どうしを先に足せば残ることがあります。そのため厳密な設定のコンパイラは順番を保ちます。結果の違いを許す設定(高速な数学の設定など)を選ぶと、ベクトル化のために並べ替えることもあります。足し算の回数は変わりません。

  • A. 正しい。丸めのため結合法則が成り立たず、結果が変わりえます。
  • B. 並べ替えても足し算の回数は同じです。
  • C. 計算の順番は命令の並びで決まり、ハードウェアが決めるわけではありません。
この分野を解く 分野ページへ

コンパイラのほかの問題

  1. コンパイラの自動ベクトル化で使われる命令の種類として正しいものはどれか。
  2. コンパイラの最適化が守らなければならない基本的な条件として正しいものはどれか。
  3. コード生成の段階の一つである命令選択(インストラクションセレクション)の説明として正しいものはどれか。
  4. クロスコンパイラの説明として正しいものはどれか。
  5. 最適化をかけてコンパイルしたプログラムをデバッガで調べると、一部の変数の値が「表示できない」となることがある。主な理由はどれか。