有効数字と丸め誤差

この章の目標

有効数字の正しい数え方を理解し、桁落ち情報落ちの発生メカニズムと回避策(式の変形・Kahan 加算)を学ぶ。

前提知識

実数の四則演算、浮動小数点数の概念

目次

1. 有効数字

有効数字(significant digits / significant figures)とは、測定値や計算値において意味のある(信頼できる)数字の桁数のことである。

有効数字の数え方

最初の0でない数字から最後の数字まで数えた桁数が有効数字の桁数である。

  • 先頭のゼロは有効数字に含めない。(例: $0.0042$ は有効数字2桁)
  • 末尾のゼロは有効数字に含める。(例: $3.40$ は有効数字3桁)
  • 挟まれたゼロは有効数字に含める。(例: $1.03$ は有効数字3桁)

近似値 $\tilde{x}$ が真値 $x$ に対して $n$ 桁の有効数字をもつとは、正規化された形で

$$\left|\frac{\tilde{x} - x}{x}\right| \leq \frac{1}{2} \times 10^{1-n}$$

が成り立つことである。

数値有効数字桁数
$3.14159$3, 1, 4, 1, 5, 96桁
$0.00340$3, 4, 03桁
$1.200 \times 10^3$1, 2, 0, 04桁
$5000$曖昧(1〜4桁)文脈依存

2. 絶対誤差と相対誤差

近似値 $\tilde{x}$ が真値 $x$ をどの程度正確に表しているかを測る指標として、以下の2種類の誤差がある。

$$\text{絶対誤差} = |\tilde{x} - x|$$
$$\text{相対誤差} = \frac{|\tilde{x} - x|}{|x|} \quad (x \neq 0)$$

相対誤差は数値の大きさに依存しないため、精度の比較に適している。有効数字 $n$ 桁は相対誤差が $\frac{1}{2} \times 10^{1-n}$ 以下であることに相当する。

3. 丸めの種類

浮動小数点数への変換(丸め)にはいくつかの方式がある。

丸め方式規則例(3桁に丸め)
切り捨て(truncation)余分な桁を単純に捨てる$3.146 \to 3.14$
四捨五入(round half up)末尾が5以上なら切り上げ$3.145 \to 3.15$
最近接偶数丸め(banker's rounding)ちょうど半分なら偶数側に丸める$3.145 \to 3.14$, $3.155 \to 3.16$

IEEE 754 のデフォルトは最近接偶数丸め(round to nearest, ties to even)であり、統計的な偏りが最小になる。

4. 桁落ち

桁落ち(catastrophic cancellation)は、ほぼ等しい2つの数を引き算したとき、上位の有効数字が相殺されて有効数字が大幅に失われる現象である。

例: 桁落ちの発生

$a = 1.23456789$ と $b = 1.23456780$ がともに有効数字9桁であるとき

$$a - b = 0.00000009$$

差の有効数字はわずか1桁に激減する。9桁の精度をもつ2数の差から、信頼できる桁数が大幅に失われた。

桁落ちの回避策

  • 式の変形: $\sqrt{x+1} - \sqrt{x}$ を $\dfrac{1}{\sqrt{x+1} + \sqrt{x}}$ に有理化する。
  • Taylor 展開: $1 - \cos x \approx \dfrac{x^2}{2}$($x$ が小さいとき)を使う。
  • 二次方程式の解の公式: $\dfrac{-b + \sqrt{b^2-4ac}}{2a}$ で $b > 0$ のとき桁落ちが起こるので、$\dfrac{2c}{-b - \sqrt{b^2-4ac}}$ を代わりに使う。

5. 情報落ち

情報落ち(absorption / swamping)は、大きさが極端に異なる2つの数を加減算したとき、小さい方の数の情報が失われる現象である。

例: 情報落ち

倍精度(有効数字約16桁)で $10^{16} + 1$ を計算すると、$1$ の寄与は16桁目より下にあるため完全に無視される。

$$\mathrm{fl}(10^{16} + 1) = 10^{16}$$

多数の小さい値を大きい値に順次加算する場合に問題が顕著になる。対策として Kahan の補償加算アルゴリズムが有名である(疑似コードは情報落ちの章を参照)。

6. 誤差の伝播

入力値 $x_1, x_2, \ldots$ に誤差 $\Delta x_1, \Delta x_2, \ldots$ があるとき、関数 $f(x_1, x_2, \ldots)$ の出力の誤差はテイラー展開の1次近似で

$$\Delta f \approx \sum_{i} \frac{\partial f}{\partial x_i} \Delta x_i$$

と見積もることができる。各偏導関数が誤差の増幅係数の役割を果たす。

四則演算の誤差伝播

演算絶対誤差相対誤差
$f = x \pm y$$|\Delta f| \leq |\Delta x| + |\Delta y|$増大しうる(桁落ち)
$f = x \cdot y$$|\Delta f| \approx |y||\Delta x| + |x||\Delta y|$$\dfrac{|\Delta f|}{|f|} \leq \dfrac{|\Delta x|}{|x|} + \dfrac{|\Delta y|}{|y|}$
$f = x / y$複合的$\dfrac{|\Delta f|}{|f|} \leq \dfrac{|\Delta x|}{|x|} + \dfrac{|\Delta y|}{|y|}$

7. 具体例と対策

例1: 二次方程式の解(桁落ち回避)

$x^2 + 10000x + 1 = 0$ の解を求める。判別式 $\sqrt{b^2 - 4ac} = \sqrt{99999996} \approx 9999.9998$ である。

直接計算(桁落ち発生):

$$x_1 = \frac{-10000 + 9999.9998}{2} = \frac{-0.0002}{2} = -0.0001$$

回避策(有理化):

$$x_1 = \frac{2c}{-b - \sqrt{b^2-4ac}} = \frac{2}{-10000 - 9999.9998} = \frac{2}{-19999.9998} \approx -0.00010000$$

後者のほうが有効桁数が多く保たれる。

8. よくある質問

Q1. 桁落ちとは何ですか?

ほぼ等しい2つの数を引き算したとき、上位の有効数字が相殺されて有効数字が大幅に失われる現象である。式の変形や Taylor 展開を用いた代替計算で回避できることが多い。

Q2. 情報落ちとは何ですか?

大きさが極端に異なる2つの数を加減算したとき、小さい方の数の情報が失われる現象である。Kahan の補償加算アルゴリズムで対策できる。

Q3. 有効数字の数え方は?

最初の0でない数字から最後の数字まで数えた桁数が有効数字の桁数である。先頭のゼロは含めず、末尾のゼロと挟まれたゼロは含める。

9. 参考資料

  • Wikipedia「有効数字」(日本語版)
  • Wikipedia「Significant figures」(英語版)
  • Wikipedia「Round-off error」(英語版)
  • Wikipedia「Catastrophic cancellation」(英語版)
  • 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.