計算機イプシロン

この章の目標

浮動小数点演算の精度の限界を示す計算機イプシロン $\varepsilon_{\mathrm{mach}}$ の定義と意味を理解する。IEEE 754 での具体的な値、丸めの単位との関係、収束判定や近似比較への応用を把握する。

前提知識

目次

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$ の浮動小数点数体系では

$$\varepsilon_{\mathrm{mach}} = \beta^{1-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}(a \circ b) = (a \circ b)(1 + \delta), \quad |\delta| \leq u$$

が成り立つ。ここで $\mathrm{fl}(\cdot)$ は最近接丸めを表す。この性質が誤差解析の出発点となる。

4. 計測アルゴリズム

計算機イプシロンは、以下の簡単なアルゴリズムで計測できる。

計算機イプシロン計測

  1. $\varepsilon = 1$ と初期化する。
  2. $\mathrm{fl}(1 + \varepsilon) > 1$ である間、$\varepsilon \leftarrow \varepsilon / 2$ とする。
  3. $\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 クラス で利用できる。