まえがき
本記事では,数値計算を行う際に必ずと言っていいほど起こり得る丸め誤差について
簡単なプログラム(Python3)例を添えて紹介していこうと思います.
この記事を読んで少しでも誤差について興味を持っていただき,
シリーズ化予定の「高精度計算」や「精度保証付き数値計算」分野に興味を持っていただければいいなぁと思います。
誤差について記載されている記事は他にもあるので,本記事では以降掲載予定の記事の導入として簡単な紹介にとどめます。
追記
次の記事:エラーフリー変換あれこれ
丸め誤差とは
丸め誤差誤差とは実数を浮動小数点数で近似する際に生じる誤差です.
例えば 0.1 を小数点以下 20 桁で表示してみると以下のようになります.
print(format(0.1, '.20f'))
0.10000000000000000555
0.1 と記述しているのに 0.1 より少し大きな値が表示されてしまいました.
これは10進表現の 0.1 が 2 進表現では無限小数になってしまいコンピュータ上では正確に表せず,
有限桁に収まるように値を「丸める」ことで誤差が生じているために起こる現象です.
これを丸め誤差といいます.
また,面白いことにコンピュータ上では誤差により少し大きな値となる 0.1 を 100 回足すと...
a = 0.0
for _ in range(100):
a += 0.1
print(a)
9.99999999999998
今度は真の解である 10 より少し小さくなりました.
また,1 に非常に小さな数 $2^{-53}$ を 1 回以上足すと当然 1 より大きくなるはずですが...
a = 1.0
eps = pow(2, -53)
for _ in range(100):
a += eps
if a == 1.0:
print('a == 1.0')
elif a > 1.0:
print('a > 1.0')
else:
print('a < 1.0')
a == 1.0
結果は 1 となります.
サンプルプログラムでは 100 回足していますが,足す回数が 1000 回でも 10000 回でも結果は変わりません.
このような簡単な計算でも直観に反する結果が返ってくることがあります.
ここまでの例のように浮動小数点数を扱う数値計算では必ずと言っていいほど誤差が生じてしまうのですが誤差を減らすことはできます.
例えば,
- 浮動小数点数の精度を上げる
- 計算順序を変える
- エラーフリー変換を用いた高精度計算を行う
などです。
次回はエラーフリー変換を用いた高精度計算により誤差を減らす方法について記事を書こうと思います。
参考