計算機イプシロンとは
計算機イプシロン(マシンイプシロン)とは、
浮動小数点数において、1より大きい最小の数と1との差のことです。これは、
コンピュータが数値を表現する際の精度限界を示す重要な指標となります。
概要
コンピュータで扱われる
浮動小数点数は、指数部と仮数部で構成されています。小さな数を表現する際には指数部を調整しますが、「1より大きい最小の数」のような微小な差を表現するには、仮数部を使用します。この仮数部で表現できる最小の差が計算機イプシロンとなります。
計算機イプシロンの算出
b進法で仮数部がp桁の
浮動小数点数の場合、計算機イプシロンは以下の式で求められます。
math
b^{1-p}
例えば、
IEEE 754規格の
単精度浮動小数点数(binary32)では、b=2、p=24なので、計算機イプシロンは以下のようになります。
math
2^{1-24} = 1.192 \times 10^{-7}
同様に、
倍精度浮動小数点数(binary64)では、b=2、p=53なので、計算機イプシロンは以下のようになります。
math
2^{1-53} = 2.220 \times 10^{-16}
四
倍精度浮動小数点数(binary128)では、b=2、p=113なので、計算機イプシロンは以下のようになります。
math
2^{1-113} = 1.926 \times 10^{-34}
また、一部の環境で利用可能な拡張
倍精度浮動小数点数(80ビット)では、b=2、p=64なので、計算機イプシロンは以下のようになります。
math
2^{1-64} = 1.084 \times 10^{-19}
計算機イプシロンの定義に関する注意点
本来の定義では、計算機イプシロンは「1より大きい最小の数」と1との差ですが、一部では「1 + x ≠ 1 となる最小の x」と定義または説明されることがあります。しかし、この定義は浮動小数点演算の丸め処理に依存するため、厳密には同一ではありません。計算機イプシロンを扱う際には、定義の違いに注意する必要があります。
Microsoft
.NET Framework および
.NET の
基本クラスライブラリには `System.Double.Epsilon` という定数フィールドがありますが、これは計算機イプシロンではなく、
浮動小数点数で表現可能な最小の正の非正規化数を表します。`System.Single.Epsilon` も同様です。これらの値は、
C言語における`DBL_TRUE_MIN`や `FLT_TRUE_MIN`に相当します。
「epsilon」という用語は、歴史的に様々な概念で使用されており、混乱やバグの原因になりやすいため、注意が必要です。
各プログラミング言語での対応
多くのプログラミング言語では、計算機イプシロンに相当する値や関数が提供されています。
- - C言語: `` で `FLT_EPSILON`、`DBL_EPSILON`、`LDBL_EPSILON` がそれぞれ float型、double型、long double型の計算機イプシロンとして定義されています。
- - C++: `std::numeric_limits::epsilon()` 関数で、各型の計算機イプシロンを取得できます。
- - Python: `sys.float_info.epsilon` で C の `DBL_EPSILON` に相当する値が取得できます。
- - JavaScript: `Number.EPSILON` が定義されています。
- - Julia: `eps(Float32)` のように、標準関数 `eps()` で各型の計算機イプシロンを取得できます。
- - Swift: `FloatingPoint` プロトコルの `ulpOfOne` プロパティで各型の計算機イプシロンを取得できます。例えば、`Float.ulpOfOne`、`Double.ulpOfOne`、`Float80.ulpOfOne` が相当します。
まとめ
計算機イプシロンは、
コンピュータにおける
浮動小数点数の精度限界を示す重要な概念です。プログラミングを行う際には、この概念を理解し、数値計算で発生する可能性のある
誤差に注意を払うことが重要です。また、プログラミング言語によって計算機イプシロンを表す定数や関数が異なる場合があるため、利用する際には適切な方法で取得するようにしてください。