読者です 読者をやめる 読者になる 読者になる

機械イプシロン

はじめに

機械イプシロン。あまり聞かないワードですが、つまりは有効桁数の表現方法の一つです。

C言語による最新アルゴリズム事典 (ソフトウェアテクノロジー)

C言語による最新アルゴリズム事典 (ソフトウェアテクノロジー)

どんな存在

機械イプシロンの定義は、
「1より大きい最小の浮動小数点数と1との差」です。
 b 進数$ p $桁精度の浮動小数点数の機械イプシロンは$ b^{1 - p} $と表現されます。

これは言い換えると、「1に加えたとき1より大きくなる最小の数」とすることができます。

求めてみる

$ b^{1 - p} $はプログラムで簡単に求めることができます。
例えばpython浮動小数点数の機械イプシロンを求めてみましょう。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
e = 1
count = 0
print("'count'", "'e'", "'1 + e'", "'(1 + e) - 1'")
while 1 + e > 1:
  count += 1
  print(count, e, 1 + e, (1 + e) - 1)
  e /= 2

実行結果は以下になります。

'count' 'e' '1 + e' '(1 + e) - 1'
1 1 2 1
2 0.5 1.5 0.5
3 0.25 1.25 0.25
...
51 8.881784197001252e-16 1.0000000000000009 8.881784197001252e-16
52 4.440892098500626e-16 1.0000000000000004 4.440892098500626e-16
53 2.220446049250313e-16 1.0000000000000002 2.220446049250313e-16

最後の行の2.220446049250313e-16が機械イプシロンになります。
また、この値は、 $ 2^{1 - 53} $ であり、2進数53桁精度ということになります。

この値は、倍精度浮動小数点数の有効桁数となっていることがわかります。

ref

浮動小数点数型と誤差

おわりに

いちいち計算しなくても、浮動小数点数の仕組みを知っていれば精度自体はわかりますが、 実際に計算してみるのもたまにはいいですよね。