問題
X = 4.3 - 4.2
このとき、Xの値は?
解答
0.1
だがここで話が終わりではない
4.3 - 4.2 = 0.1
少なくとも筆者は、そう信じて今まで生きてきました。
ですが、そんな筆者の常識を打ち破るかのごとく、コンピュータがこの問題を「ふつうに」解くと、0.1にならない。
小数計算で発生する「誤差」
http://pc.nikkeibp.co.jp/pc21/special/gosa/eg1.shtml
上記は、EXCELについての記事ですが、EXCELに限った話ではないそうです。
試してみた
試しに、色々な言語で、計算をしてみました。
PowerShell
4.3 - 4.2
#0.0999999999999996
JavaScript
document.write(4.3 - 4.2);
//0.09999999999999964
Ruby
puts 4.3 - 4.2
#0.09999999999999964
F#
4.3 - 4.2;;
//val it : float = 0.1
//一見正しそうに見えるが・・・
4.3 - 4.2 = 0.1;;
//val it : bool = false
//比較演算してみると、実際には誤差が生じていることが分かる
Haskell
4.3 - 4.2
--9.999999999999964e-2
SWI-Prolog
?- X is 4.3 - 4.2.
%X = 0.09999999999999964.
C
printf("%f",4.3-4.2);
//0.100000
//一見正しそうに見えるが・・・
printf("%d",4.3-4.2==0.1);
//0(false)
//比較演算してみると、実際には誤差が生じていることが分かる
こんなにも、4.3 - 4.2 = 0.1にならないなんて。
もしかして、逆に、私たちが今まで受けてきた教育が間違っていたのでは・・・と思いそうになりますが、ここで挫けてはいけません。
何と言おうと、4.3 - 4.2 = 0.1なのです。
後編では、この誤差への対策を、色々と試してみようと思います。