Help us understand the problem. What is going on with this article?

Pythonの計算機イプシロン

計算機イプシロンとは

計算機イプシロンとは,計算機の浮動小数点における「1より大きい最小の値」と1との差のことです。
有限の桁しか持たない浮動小数点での2つの値の一致判定などに使用されます。

よくある誤解

計算機イプシロンは,しばしば「浮動小数点で表せる0より大きい最小の数」と誤解されます。
もしこのような定義だと,指数部分を小さくすることで仮数部分の精度に関係なく小さな値を表現できてしまうことになります。
そのため,「1より大きい」という少しややこしそうな定義になっています。
(この記事を書こうと思ったきっかけも,「計算機イプシロン Python」でググった時に出てきた記事で誤った計算方法を使用しているのを発見したからです)

計算方法

EPS = 0.0
tmp = 1.0
while 1.0 + tmp > 1.0:
  EPS = tmp
  tmp /= 2
print(EPS)

実行結果

Win10のPython3.6.0で実行したところ,「2.220446049250313e-16」が表示されました。
これは,IEEE754のbinary64(倍精度)の計算機イプシロンです。

ライブラリとの比較

Pythonでは,sys.float_info.epsilonなる値が計算機イプシロンを表しています。(Cで言うFLT_EPSILON的なやつ)
先ほどと同じ環境で確認してみると,

>>> import sys
>>> sys.float_info.epsilon
2.220446049250313e-16

と表示され,自分で計算した値と一致しています。

利用例

冒頭で書いたように,計算機イプシロンは浮動小数点の一致判定などで役に立ちます。
この記事をここまで読んでくださった方はご存知の方も多いかと思いますが,コンピュータの浮動小数点では実数を正確に表現することはできません。
例えば,実数では0.1の10倍と0.1を10回足したものは一致しますが,これをPythonで表現すると

>>> a =  0.1*10
>>> b = sum(0.1 for _ in range(10))
>>> a, b
(1.0, 0.9999999999999999)
>>> a == b
False

となってしまいます。
コンテキストにもよりますが,一般的にこれは望まれざる挙動でしょう。

そこで,計算機イプシロンを使用して一致判定を行います。
具体的には,相対誤差が十分に小さいとき,2つの値が等しいとみなします。
これをPythonで表現すると

>>> import sys
>>> a =  0.1*10
>>> b = sum(0.1 for _ in range(10))
>>> a, b
(1.0, 0.9999999999999999)
>>> abs(a-b) < sys.float_info.epsilon * max(abs(a), abs(b))
True

となります。
相対誤差を使用する理由などの厳密な議論に興味がある方は,参考文献に挙げたページをご覧ください。

追加・変更点など

追加 (2019/08/30)

計算機イプシロンによる浮動小数点の一致判定の実例を追加しました。

参考文献

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away