計算機イプシロン
この章の目標
浮動小数点演算の精度の限界を示す計算機イプシロン $\varepsilon_{\mathrm{mach}}$ の定義と意味を理解する。IEEE 754 での具体的な値、丸めの単位との関係、収束判定や近似比較への応用を把握する。
前提知識
- IEEE 754 浮動小数点数の基本構造
- 丸め誤差の概念(詳しくは第8章で扱う)
1. 定義
計算機イプシロン(machine epsilon)$\varepsilon_{\mathrm{mach}}$ は、浮動小数点数体系における精度の限界を示す基本的な量である。定義にはいくつかの流儀があるが、最も一般的な2つを紹介する。
定義1(差分の定義)
浮動小数点演算において、$\mathrm{fl}(1 + \varepsilon) > 1$ を満たす最小の浮動小数点数 $\varepsilon$ を計算機イプシロンと呼ぶ。
定義2(相対丸め誤差の上界)
任意の実数 $x$(浮動小数点数の範囲内)に対し、$x$ を最近接丸めで浮動小数点数 $\mathrm{fl}(x)$ に変換したとき
$$\left|\frac{\mathrm{fl}(x) - x}{x}\right| \leq u$$を満たす最小の $u$ を丸めの単位(unit roundoff)と呼ぶ。$u = \varepsilon_{\mathrm{mach}} / 2$ の関係がある。
基数 $\beta$、仮数部の桁数 $p$ の浮動小数点数体系では
である。IEEE 754 では $\beta = 2$ であるから $\varepsilon_{\mathrm{mach}} = 2^{1-p}$ となる。
2. IEEE 754 での値
| 形式 | 仮数部ビット $p$ | $\varepsilon_{\mathrm{mach}} = 2^{1-p}$ | 近似値 |
|---|---|---|---|
| 半精度(float16) | 11 | $2^{-10}$ | $\approx 9.77 \times 10^{-4}$ |
| 単精度(float32) | 24 | $2^{-23}$ | $\approx 1.19 \times 10^{-7}$ |
| 倍精度(float64) | 53 | $2^{-52}$ | $\approx 2.22 \times 10^{-16}$ |
| 四倍精度(float128) | 113 | $2^{-112}$ | $\approx 1.93 \times 10^{-34}$ |
多くのプログラミング言語で定数として提供されている。例えば C/C++ では DBL_EPSILON(<float.h>)、Python では sys.float_info.epsilon、MATLAB では eps である。
3. 丸めの単位
丸めの単位(unit roundoff)$u$ は、浮動小数点演算の誤差解析で中心的な役割を果たす量である。
$$u = \frac{\varepsilon_{\mathrm{mach}}}{2} = \frac{1}{2} \beta^{1-p}$$IEEE 754 倍精度では $u = 2^{-53} \approx 1.11 \times 10^{-16}$ である。
浮動小数点演算の基本定理として、四則演算 $\circ \in \{+, -, \times, /\}$ に対して
が成り立つ。ここで $\mathrm{fl}(\cdot)$ は最近接丸めを表す。この性質が誤差解析の出発点となる。
4. 計測アルゴリズム
計算機イプシロンは、以下の簡単なアルゴリズムで計測できる。
計算機イプシロン計測
- $\varepsilon = 1$ と初期化する。
- $\mathrm{fl}(1 + \varepsilon) > 1$ である間、$\varepsilon \leftarrow \varepsilon / 2$ とする。
- $\varepsilon_{\mathrm{mach}} = 2\varepsilon$ を返す(最後に下回った値の2倍)。
function computeMachineEpsilon():
eps = 1.0
while (1.0 + eps) > 1.0:
eps = eps / 2.0
return 2.0 * eps
注意: コンパイラの最適化(特に拡張精度レジスタの使用)によって正しい値が得られない場合がある。C/C++ では volatile 修飾子を付けるか、最適化レベルに注意が必要である。
5. 応用
収束判定の許容誤差
反復法の収束判定において、許容誤差は $\varepsilon_{\mathrm{mach}}$ に基づいて設定されることが多い。
- Newton 法の停止条件: $|f(x_n)| < \sqrt{\varepsilon_{\mathrm{mach}}}$ 程度
- 固有値の近似精度: $O(\varepsilon_{\mathrm{mach}} \|A\|)$
浮動小数点数の近似比較
浮動小数点数の等号比較は丸め誤差のため信頼できない。代わりに
$$|a - b| \leq \varepsilon_{\mathrm{mach}} \cdot \max(|a|, |b|)$$のような相対比較を用いる。
条件数との関係
数値問題の解の相対誤差は概ね $\kappa \cdot \varepsilon_{\mathrm{mach}}$ のオーダーであり、ここで $\kappa$ は問題の条件数である。$\kappa \cdot \varepsilon_{\mathrm{mach}} \approx 1$ のとき、結果は全く信頼できない。
6. 計算例
例1: 倍精度での1近傍の浮動小数点数
倍精度($\varepsilon_{\mathrm{mach}} = 2^{-52}$)では、$1$ の次の浮動小数点数は
$$1 + \varepsilon_{\mathrm{mach}} = 1 + 2^{-52} \approx 1.0000000000000002$$である。$1$ と $1 + \varepsilon_{\mathrm{mach}}$ の間には浮動小数点数が存在しない。
例2: 有効桁数の見積もり
倍精度 $\varepsilon_{\mathrm{mach}} \approx 2.22 \times 10^{-16}$ であるから、$\log_{10}(\varepsilon_{\mathrm{mach}}^{-1}) \approx 15.65$ より、約15〜16桁の十進有効数字が期待できる。
7. 注意点
- 定義の不統一: 文献によって $\varepsilon_{\mathrm{mach}}$ を丸めの単位 $u = \varepsilon_{\mathrm{mach}}/2$ の意味で使う場合がある。混同に注意すること。
- 最小の正の浮動小数点数との混同: 計算機イプシロンは「最小の正の浮動小数点数」($\approx 2^{-1074}$ for double)とは全く異なる概念である。
- 拡張精度の影響: x86 アーキテクチャでは FPU が80ビット拡張精度を使用する場合があり、計測値が期待値と異なることがある。
8. よくある質問
Q1. 計算機イプシロンとは何ですか?
$\mathrm{fl}(1 + \varepsilon) > 1$ を満たす最小の浮動小数点数 $\varepsilon$ である。浮動小数点数体系が表現できる相対精度の限界を示す。IEEE 754 倍精度では $\varepsilon_{\mathrm{mach}} \approx 2.22 \times 10^{-16}$ である。
Q2. 単精度と倍精度の値は?
単精度(float32)では $2^{-23} \approx 1.19 \times 10^{-7}$、倍精度(float64)では $2^{-52} \approx 2.22 \times 10^{-16}$ である。
Q3. 計算機イプシロンは何に使われますか?
浮動小数点計算の丸め誤差解析の基本単位として使われる。収束判定の許容誤差設定(例: $\mathrm{tol} = \sqrt{\varepsilon_{\mathrm{mach}}}$)や浮動小数点数の近似比較に用いられる。
9. 参考資料
- Wikipedia「計算機イプシロン」(日本語版)
- Wikipedia「Machine epsilon」(英語版)
- Wikipedia「IEEE 754」(英語版)
- D. Goldberg, "What Every Computer Scientist Should Know About Floating-Point Arithmetic," ACM Computing Surveys, 23(1), 1991.
- N. J. Higham, Accuracy and Stability of Numerical Algorithms, 2nd ed., SIAM, 2002.
calx での実装
この記事のアルゴリズムは calx の Float クラス で利用できる。