第2章: 誤差の基礎

この章の目標

数値計算における誤差の測り方(絶対誤差・相対誤差)と発生原因(丸め誤差・打ち切り誤差・入力誤差)を理解し、有効数字と、誤差が計算を通じてどう伝わるか(誤差の伝播と桁落ち)の基本を学ぶ。

前提知識

  • 四則演算の基礎
  • 小数・分数の概念
  • 無限級数と階乗(§4 の 1 つ目の例で使う)
  • 微分の定義(極限)とテイラー展開の初歩(§4 の 2 つ目の例で使う)
目次

§1 なぜ誤差が生じるのか

数値計算では、様々な原因で「誤差」が生じる。誤差を理解し、管理することは数値計算の基本である。

誤差の主な原因

  • 数を有限の桁数で表現する(丸め誤差。10 進では有限の小数 $0.1$ も、2 進では無限小数になる)
  • 無限の計算を有限回で打ち切る・極限を有限の値で置き換える(打ち切り誤差)
  • 測定値や入力データの不正確さ(入力誤差。入力の誤差が計算を通じてどう伝わるかは §5 で見る)

§2 絶対誤差と相対誤差

定義:絶対誤差

真の値を $x$、近似値を $\tilde{x}$ とするとき、絶対誤差は

$$E = |x - \tilde{x}|$$

定義:相対誤差

真の値 $x \neq 0$ に対する相対誤差は

$$E_r = \dfrac{|x - \tilde{x}|}{|x|}$$

パーセントで表すこともある:$E_r \times 100\%$

例:円周率の近似

$\pi = 3.14159265...$ を $\tilde{\pi} = 3.14$ で近似すると:

  • 絶対誤差:$|3.14159... - 3.14| \approx 0.00159$
  • 相対誤差:$\dfrac{0.00159...}{3.14159...} \approx 0.00051 = 0.051\%$

例:大きな数と小さな数

ケース1:$x = 1000000$、$\tilde{x} = 1000001$

  • 絶対誤差:$1$
  • 相対誤差:$10^{-6} = 0.0001\%$

ケース2:$x = 0.001$、$\tilde{x} = 0.002$

  • 絶対誤差:$0.001$
  • 相対誤差:$1 = 100\%$

絶対誤差は小さくても、相対誤差は大きい場合がある。

ケース1: 大きな数 x = 10⁶ x̃ = 10⁶+1 相対誤差: 0.0001% ✓ ケース2: 小さな数 x = 0.001 x̃ = 0.002 差 = 0.001 相対誤差: 100% ✗
図1. 上の例の 2 つのケース。上下の数直線は縮尺が違う。2 点の隔たりは上が $1$、下が $0.001$ で、絶対誤差は下が上の $1/1000$ である。下の隔たりが大きく見えるのは相対誤差(上 $0.0001\%$、下 $100\%$)の大小を表すためで、絶対誤差の比ではない。

§3 丸め誤差

丸め誤差(rounding error)は、数値を有限の桁数で表現するときに生じる誤差である。

例:小数の丸め

$\dfrac{1}{3} = 0.33333...$ を4桁で表すと $0.3333$

絶対誤差:$\dfrac{1}{3} - 0.3333 = 0.00003...$

丸めの方法

  • 切り捨て:$3.146 \to 3.14$
  • 切り上げ:$3.141 \to 3.15$
  • 四捨五入:$3.145 \to 3.15$、$3.144 \to 3.14$
  • 偶数丸め:$3.145 \to 3.14$、$3.155 \to 3.16$(銀行丸め)

コンピュータは通常、2進数で計算するため、10進数の小数でも丸め誤差が生じることがある。

例:$0.1$ の2進数表現

10進数の $0.1$ は、2進数では無限小数になる:

$$0.1_{10} = 0.0001100110011..._{2}$$

そのため、一般的な2進浮動小数点では $0.1$ を正確に表現できず、小さな誤差が生じる。

§4 打ち切り誤差

打ち切り誤差(truncation error)は、無限の計算(級数の和など)を有限回で打ち切ったり、極限($h \to 0$ など)を有限の値で置き換えたりすることで生じる誤差である。

例:$e$ のテイラー展開

$e$ は無限級数で表される:

$$e = \displaystyle\sum_{n=0}^{\infty} \dfrac{1}{n!} = 1 + 1 + \dfrac{1}{2} + \dfrac{1}{6} + \dfrac{1}{24} + \cdots$$

最初の5項で打ち切ると:

$$e \approx 1 + 1 + \dfrac{1}{2} + \dfrac{1}{6} + \dfrac{1}{24} = \dfrac{65}{24} = 2.70833\ldots$$

真の値 $e = 2.71828...$ との差 $e - \dfrac{65}{24} \approx 0.00995$ が打ち切り誤差である。

例:微分の近似

導関数の定義 $\displaystyle f'(x) = \lim_{h \to 0} \dfrac{f(x+h) - f(x)}{h}$ を有限の $h$ で近似すると:

$$f'(x) \approx \dfrac{f(x+h) - f(x)}{h}$$

$f$ が 2 回微分可能なら、これはテイラー展開 $f(x+h) = f(x) + hf'(x) + \dfrac{h^2}{2}f''(\xi)$($\xi$ は $x$ と $x+h$ の間の点)を 1 次の項で打ち切ったことにあたり、残りの項から $\dfrac{h}{2}f''(\xi)$ の誤差が残る。これが打ち切り誤差で、大きさは $O(h)$($h$ に比例)である。

ただし $h$ を極端に小さくすると、ほぼ等しい $f(x+h)$ と $f(x)$ の引き算で桁落ち(§5)が起き、両者の値がもともと含む丸め誤差が、差に対して相対的に大きくなる。さらにその差を $h$ で割るので、丸め誤差の影響は $h$ に反比例して増える。打ち切り誤差は $h$ に比例して減るので、この前進差分では両者がバランスする最適な $h$ が存在する($f$ が滑らかで、その値の計算に丸め誤差があるとき)。

§5 誤差の伝播

計算を繰り返すと、誤差が蓄積・拡大することがある。

例:足し算での誤差伝播

$\tilde{x} = x + \epsilon_1$、$\tilde{y} = y + \epsilon_2$ のとき($\epsilon_1, \epsilon_2$ は符号つきの誤差。§2 の絶対誤差とは $E = |\epsilon|$ の関係)

$$\tilde{x} + \tilde{y} = (x + y) + (\epsilon_1 + \epsilon_2)$$

誤差はそのまま足し合わされる。ただし符号つきなので、符号が逆なら打ち消し合うこともある。大きさの上界は $|\epsilon_1 + \epsilon_2| \le |\epsilon_1| + |\epsilon_2|$ である。

例:掛け算での誤差伝播

相対誤差で表すと $\tilde{x} = x(1+\delta_1)$、$\tilde{y} = y(1+\delta_2)$ のとき($\delta_1, \delta_2$ は符号つきの相対誤差。上の $\epsilon$ とは別の量)

$$\tilde{x} \cdot \tilde{y} = xy\,(1 + \delta_1 + \delta_2 + \delta_1 \delta_2) \approx xy\,(1 + \delta_1 + \delta_2)$$

$\delta_1 \delta_2$ は二次の微小量として無視すると、相対誤差はほぼ足し合わされる。

割り算では

$$\dfrac{\tilde{x}}{\tilde{y}} = \dfrac{x}{y}\cdot\dfrac{1+\delta_1}{1+\delta_2} \approx \dfrac{x}{y}\,(1 + \delta_1 - \delta_2)$$

となり、相対誤差は引かれる($\delta_1 = \delta_2$ なら打ち消し合う)。掛け算・割り算とも、結果の相対誤差の大きさはおおよそ $|\delta_1| + |\delta_2|$ 以下である。

例:引き算での誤差拡大

$x$ と $y$ がそれぞれ誤差を含むとき、$x \approx y$ なら $x - y$ の相対誤差は非常に大きくなる(引き算そのものは誤差を作らず、入力の誤差の相対的な重みが増える)。

例:$x = 1.0001$、$y = 1.0000$(各5桁精度。有効数字の数え方は §6)

$x - y = 0.0001$ であるが、有効桁数は1桁に減少。各値の丸め誤差は最大 $0.00005$(相対誤差で約 $0.005\%$)なのに、差 $0.0001$ に対しては最大 $0.0001$、つまり相対誤差 $100\%$ にもなりうる。

これを桁落ち(cancellation)という。

§6 有効数字

有効数字は、測定や計算で信頼できる桁数のことである。

例:有効数字の数え方

  • $123.45$ → 有効数字5桁
  • $0.00123$ → 有効数字3桁(先頭のゼロは数えない)
  • $1.23 \times 10^5$ → 有効数字3桁

有効数字と相対誤差の関係

$n$ 桁の有効数字を持つ数値の相対誤差は、おおよそ $10^{-n}$ のオーダーである。

§7 まとめ

  • 絶対誤差 $= |x - \tilde{x}|$、相対誤差 $= \dfrac{|x - \tilde{x}|}{|x|}$($x \neq 0$)
  • 丸め誤差:有限桁での表現による誤差
  • 打ち切り誤差:無限の計算を有限回で止めたり、極限を有限の値で置き換えたりすることによる誤差
  • 誤差は計算を通じて伝播・拡大する可能性がある
  • 桁落ち:誤差を含むほぼ等しい数どうしの引き算で、誤差の相対的な重みが大きくなり有効桁数が減る
  • 有効数字は信頼できる桁数を表す