##マシンイプシロンとは
マシン(計算機)イプシロンとは、浮動小数点数において、「1より大きい最小の数」と1との差のことである。
Wikipedia
つまり、コンピュータ(計算機)で扱える数の最小の数のことを指します。
コンピュータ・アーキテクチャ、OS、言語などによりこの値はまちまちです。
##マシンイプシロンが与える影響
ごく小さな数を含む浮動小数点数を利用した数値計算などで誤差が表出します。
非常にループの多い、つまり、浮動小数点数を扱った計算において誤差が溜まりやすい処理を行うと、数値計算によってえられる値の精度に影響を及ぼします。
##どうやってマシンイプシロンを導出するのか?
マシンイプシロンを求める方法は単純です。
変数(浮動小数点数)を永遠と1/2してゆくのです。
ループのたびに0と比較をしてゆくと、ある瞬間、コンピュータが1/2を繰り返した数と、0との差が認識できなくなり、コンピュータは変数=0と認識します。
つまり、そのループの一段前の変数が「コンピュータで扱える浮動小数点数」=マシンイプシロンとなります。
##実際にやってみた
今回利用した環境は以下のとおりです。
PC | Macbook Air 2015 Early |
---|---|
OS | OSX 10.13.2 |
言語 | Python 3.6.3 |
###ソース
inum = 1.0
tmpnum = 0.0
renum = 0.0
while inum != 0.0:
inum = inum/2.0
renum = tmpnum
tmpnum = inum
print("{0:09.8E}".format(renum))
###結果
4.94065646E-324
##おわりに
結果として「4.94065646E-324」というとても小さな値が得られました。
つまり、上記環境でのマシンイプシロンは「4.94065646E-324」ということになります。
因みに、以前筆者がWindows環境やLinux環境でも同様の実験をしたのですが、
Widnows環境(VisualStudio C言語)約20桁(E-20)
Linux環境(gcc C言語)約70桁(E-70)
Unix環境(gcc C言語)約80桁(E-80)
Mac環境 (xcode C言語) 約110桁(E-110)
(このMacの精度を目の当たりにして私は愕然としMacを購入を決めたのは無理もない。)
今回はPythonで実験を行ったが、その桁数はE-324であり、上記環境の遥かに高い精度で浮動小数点数を扱えるといえる。Pythonで扱う浮動小数点の変数は可変長なのだろうか・・・?(調査を行って後日加筆修正予定)
###2017/12/17 編集
友人から「PythonにはもともともマシンイプシロンのDefine値が設定されている」という指摘をうけ、後続の検証をすすめる。
参考サイト
sys.float_infoに「epsilon」に「1と、その次の表現可能なfloat値の差」と説明がある。
早速実装をし、本件の値と差異がないか検証する。
import sys
inum = 1.0
tmpnum = 0.0
renum = 0.0
while inum != 0.0:
inum = inum/2.0
renum = tmpnum
tmpnum = inum
print("本件 {0:09.8E}".format(renum))
print("sysパラメータ{0:09.8E}".format(sys.float_info.epsilon))
###結果
本件 4.94065646E-324
sysパラメータ 2.22044605E-16
上記結果の値に大きな差が見られた。数値計算などを行う場合は本件で扱う値を利用したほうがより誤差の少ない数値計算ができると思われる。