PR

謎11.表計算ソフトなのに計算を誤る?

【現象】 「8.2-7.2」が「0.9999999……」?

⇒【解説】 小数における「演算誤差」は微小値で補正

 Excelを使っていて最も不可解なのは、まれに計算を間違うことだ。例えば「8.2-7.2」という引き算。画面上は「1.0」と正しい答えを表示するが、IF関数で「1以上かどうか」を判定すると、そうではないと判定される(図1)。そして答えのセルの表示桁数を増やしていくと、何と「0.9999999……」と間違った結果が表示されてくる(図2)。

図1 D3セルで「8.2-7.2=1.0」という計算をしていて、E3セルで「D3セルが1以上なら○と表示し、それ以外は空欄にする」という判定をIF関数で行っている。「○」が表示されるはずなのに、セルが空欄になってしまった
図2 ツールバーのボタンを押してD3セルの表示桁数を増やしてみると、何と「0.9999999……」と表示される。8.2-7.2という簡単な計算を、Excelが誤っているのだ

 実はこれ、Excelに限った問題ではない。「IEEE 754」という数値計算の標準規格に基づく多くのソフトウエアが抱える問題である。「演算誤差」や「丸め誤差」と呼ばれる。

 IEEE 754では、通常の10進数を2進数に変換して計算する。その際、整数は問題なく2進数に変換できるが、小数の多くはぴったり2進数に変換できない。例えば10進数の「0.1」は2進数で「0.000110011……」という循環小数になる(図3)。

図3 パソコンは内部で2進数を使って計算する。10進数の小数の多くは、2進数に変換すると循環小数や無限小数となるため、一定の桁で丸めて処理する。その結果、小数の計算に誤差が発生することがある

 そこでIEEE 754では、こうした2進数を一定の桁で丸めて処理する。その丸めによって発生するわずかな誤差が、演算誤差を招くわけだ。

 演算誤差は、ごくわずかな値なので、通常の計算で支障が出ることはまずない。問題になるのは、図1のように判定をする場合や、切り上げ、切り捨てなどの処理を行う場合だ。

 対策としては、誤差が発生しても結果が変わらない程度の“微小値”を足したり引いたりして、値を補正してから処理する方法がある(図4、図5)。微小値の大きさは、判定の基準となる単位(図1の例では0.1)よりも小さく、誤差の範囲よりも大きな値。通常は基準となる単位の10分の1や100分の1と考えればよい。

図4 対策として、誤差が発生しても判定結果が覆らないように、微小値を使って補正する。図1の例では、D3セルの結果に「0.01」を加えることで、誤差を含めても「1以上」と判定されるように補正した
図5 図4のように微小値を加えると、誤差が発生した場合でも、誤差の範囲が全て1以上になるので、図1のような判定ミスは起きない。加える微小値の大きさは、0.9の誤差範囲が1以上と判定されないようにする必要があるので、判定の基準となる単位0.1の10分の1となる0.01とした