計算機イプシロン
計算機イプシロン(けいさんきイプシロン、英: machine epsilon)は、浮動小数点数において、「1より大きい最小の数」と1との差のことである[1]。機械イプシロン(きかいイプシロン)とも言う。また、それぞれの「イプシロン」はエプシロンとも表記される。
概要[編集]
コンピュータで扱われる浮動小数点数は、指数部と仮数部に分かれており、単に小さい数を表すだけであれば指数部を小さくすれば表現が可能である。一方、「1より大きい最小の数」のような場合は、仮数部を使って微小な差を表現することとなる。その限界が計算機イプシロンである。
進法で 桁の浮動小数点数の場合、計算機イプシロンはとなる[1]。 例えば、IEEE 754のbinary32(単精度)では、、[2]なので、となる。 同様にIEEE 754のbinary64(倍精度)では となり,binary128(四倍精度)では となる。
定義の混乱[編集]
元来の定義では上述のとおりとなっているが、一部では「 となる最小の 」という定義、あるいは説明をしている例が存在する[3]。後者の定義では、浮動小数点演算の丸め処理の定義に依存して値が変化してしまう[1]ため、厳密には同じでない。
各プログラミング言語での対応[編集]
C言語[編集]
C言語においては、<float.h>
でFLT_EPSILON
、DBL_EPSILON
、LDBL_EPSILON
というマクロ定数が定義されており、それぞれfloat
型、double
型、long double
型の計算機イプシロンの値となっている[1]。
C++[編集]
C++ではテンプレートを利用したstd::numeric_limits<T>::epsilon()
関数が定義されている[4]。返却される値は前述のC言語の定数と同値である。
.NET[編集]
Microsoftの.NET Frameworkの基本クラスライブラリに、System.Double.Epsilon
という定数フィールドが定義されているが、これは浮動小数点方式で表現可能な最小の正の非正規化数であり、計算機イプシロンではない[5]。
Julia[編集]
Julia は標準で計算機イプシロンを取得する関数があり eps(Float32)
のように使用する。
脚注[編集]
- ^ a b c d 奥村晴彦『C言語による最新アルゴリズム事典』技術評論社、1991年、33頁。ISBN 4-87408-414-1。
- ^ データとしては23桁であるが、正規化数では先頭に1が補われ、24桁の値となる。
- ^ Data Type Constants | Microsoft Docs
- ^ std::numeric_limits<T>::epsilon - cppreference.com
- ^ Double.Epsilon Field (System) | Microsoft Docsに「The value of the Epsilon property is not equivalent to machine epsilon, ...」とある。