今日も8時間睡眠
888文字のブログです

エクセルの計算誤差について

👓

突然ですが、「1.2-1.1」はいくらでしょうか。「0.1」ですよね。それ以外にないと思うんですよね。

例えば、エクセルで計算しても、ほら、やっぱり次のようにちゃんと0.1になってます。

20150716-01

しかし、小数点の桁を増やしていくと。

20150716-02

地味に、0.1じゃないんですよね。

「コンピュータは0と1で構成されている」みたいな話は、どこかで聞いたことがあると思います。実際、コンピュータの中で数字を扱う場合は、10進数ではなく2進数で処理されています。

小数についても、2進数で処理されています。つまり、2のマイナス1乗(=0.5)とか2のマイナス2乗(=0.25)などを組み合わせて、数字が作られています。しかし、10進数の小数を2進数の小数で表現する場合は、無限小数の形になってしまうことが多いため、仕方なく近似値を使うことになります。その結果、小数を扱うときに、実際に使いたい数字から誤差が出てしまうことがあります(こうした誤差を、コンピュータの世界では「丸め誤差」と呼びます)。

ただ、エクセルはビジネスで使うことが多いので、こうした誤差が頻繁に発生すると問題が起きてしまいます。そこで、エクセルでは誤差が発生しないように補正をかけているらしいんですね。実際、「0.2-0.1」や「0.3-0.2」などを計算すると、多くの場合は「0.1」となります。しかし、すべてが補正されているわけじゃなくて、たまに「1.2-1.1」みたいなことが起こってしまうんですね。こんな例は他にもたくさんあります。

桁数を増やさなければ、見た目には問題ありません。計算結果を印刷して使うだけなら気にしなくてもいいでしょう。しかし、if文などで使うとなると問題が発生してしまいます。例えば

=IF(1.2-1.1=0.1,TRUE,FALSE)

は"FALSE"となってしまいます。「差が0かどうか」ではなく「差の絶対値がすごく小さいかどうか」で場合分けをする必要があります。つまり、

=IF(ABS(1.2-1.1-0.1)<10^(-15),TRUE,FALSE)

というようなことをしないと、本当はダメなんですね。危険です。

(867文字)