コンパイラ
コンパイラが、浮動小数点数の足し算 (a + b) + c を、厳密な設定のもとでは a + (b + c) に勝手に並べ替えない理由として正しいものはどれか。
- A丸め誤差のため結合法則が成り立たず、結果が変わりうるから
- B並べ替えると、足し算の回数が増えてしまうから
- C浮動小数点数の足し算は、ハードウェアが順番を自動で決めるから
答えと解説を見る
正解:A. 丸め誤差のため結合法則が成り立たず、結果が変わりうるから
浮動小数点数の計算では、足し算のたびに結果が表せる桁に丸められるので、計算の順番を変えると結果がわずかに変わることがあります。例えば非常に大きな数と小さな数を先に足すと小さな数が丸めで消えますが、小さな数どうしを先に足せば残ることがあります。そのため厳密な設定のコンパイラは順番を保ちます。結果の違いを許す設定(高速な数学の設定など)を選ぶと、ベクトル化のために並べ替えることもあります。足し算の回数は変わりません。
- A. 正しい。丸めのため結合法則が成り立たず、結果が変わりえます。
- B. 並べ替えても足し算の回数は同じです。
- C. 計算の順番は命令の並びで決まり、ハードウェアが決めるわけではありません。