数値解析の誤差に関する次の記述のうち、最も適切なものはどれか。

  1. 浮動小数点演算において近接する2数の引き算では、有効桁数が失われる桁落ち誤差を生じることがある。
  2. 非線形現象を線形方程式系で近似しても、線形方程式の数値計算法が数学的に厳密であれば、得られる結果には数値誤差はないとみなせる。
  3. テイラー級数展開に基づき微分方程式を差分方程式に置き換えるときの近似誤差は、格子幅によらずにほぼ一定値となる。
  4. 有限要素法の要素分割を細かくすると近似誤差は大きくなる。
  5. 数値計算の誤差は対象となる物理現象の法則で定まるので、計算アルゴリズムを改良しても誤差は減少しない。

https://kakomonn.com/gijyutushi/questions/36514

最も適切なのは①です。

① 浮動小数点演算において近接する2数の引き算では、有効桁数が失われる桁落ち誤差を生じることがある。

  • 浮動小数点では有限桁で数を表現するため、例えば 1.0000001 – 1.0000000 のように差が非常に小さい場合、両者の先頭部分が打ち消されて有効桁数が大きく減少し、誤差が増幅されます(桁落ち、キャタストロフィック・キャンセレーション)
  • ②は誤り:線形化によるモデル化誤差(離散化誤差)は、どんなに数値解法が「厳密」でも残ります。
  • ③は誤り:テイラー展開による差分近似誤差は格子幅 hh の関数で、一般に O(h)O(h)O(h2)O(h^2) のように変化します。
  • ④は誤り:有限要素法ではメッシュを細かくすると近似精度が上がり(誤差は減少し)、荒くすると誤差が大きくなります。
  • ⑤は誤り:数値誤差はモデル化・離散化・丸めなど複合的に発生し、アルゴリズム改善(高次の差分スキームや安定化手法、適応メッシュなど)により誤差を低減できます。

 

両者の先頭部分が打ち消されて有効桁数が大きく減少するとはどういうことですか?

“両者の先頭部分が打ち消されて有効桁数が大きく減少する”とは、次のような意味です。


イメージ例(10進数の場合)

たとえば、次のような数を考えます。

  • a=1.0000001a = 1.0000001
  • b=1.0000000b = 1.0000000

これらを引き算すると本当の答えは

ab=0.0000001a – b = 0.0000001

ですが、10進で7桁しか保持できない有限の精度で計算すると、まず aabb は内部的に

1.000000

のように丸められてしまい、両者とも同じ数とみなされる場合があります。
すると

1.000000丸め後の a1.000000丸め後の b=0.000000\underbrace{1.000000}_{\text{丸め後の }a} – \underbrace{1.000000}_{\text{丸め後の }b} = 0.000000

という結果になり、本来あるはずの 0.00000010.0000001 が完全に消えてしまうか、あるいは極めて不正確にしか残らなくなるわけです。


なぜ“桁落ち”と言うのか

  1. 浮動小数点の構造
    浮動小数点数は「仮数部(mantissa)+指数部(exponent)」で表現され、仮数部には限られた数の有効桁しか格納できません。
  2. 引き算でのキャンセル
    似たような大きさの数同士を引くと、仮数部の上位桁(=先頭部分)が互いに打ち消し合い、残るのは下位桁だけになります。
  3. 有効桁数の“減少”
    上位桁が消えた分だけ、残る有効な桁の数が減ってしまい、元の仮数部で保持できる精度を使い切っても誤差が目立つようになります。

二進数での例

実際のコンピュータ内部では二進数なので、たとえば

  • a=1.00000012a = 1.0000001_2 (仮数部に“0000001”の1ビット分がある)
  • b=1.00000002b = 1.0000000_2

を引くと、本来は下位ビットだけが残りますが、仮数部がたとえば7ビットまでしか扱えないと

1.0000000₂  (丸め後の a)
-
1.0000000₂  (丸め後の b)
= 0.0000000₂

となり、すべての有効ビットが消えてしまいます。


ポイントまとめ

  • 似た大きさの数同士の引き算 では「桁落ち(catastrophic cancellation)」が起こりやすい
  • 有効桁数が一気に減るため、真正な差分に比べて大きな相対誤差が生じる
  • 対策としては、数値アルゴリズムで「差を直接計算しない」工夫(式の変形や高精度演算の利用など)が必要

こうした現象を理解しないと、小さな差を扱う数値計算で思わぬ大きな誤差を招くことがあります。

 

真正な差分に比べて大きな相対誤差が生じるとはどういうことですか?

 

“相対誤差が大きくなる”というのは、計算で得られた値と本当の(真の)値との差を、その本当の値の大きさで割ったときの割合が大きくなる、という意味です。以下で詳しく見てみましょう。


1. 相対誤差の定義

ある量の真の値を DD、計算で得られた値を D^\hat D とすると、

相対誤差=D^DD\text{相対誤差} = \frac{|\hat D – D|}{|D|}

で表されます。

  • 分子:計算誤差の「絶対誤差」
  • 分母:真の大きさ

2. 桁落ちが起こるとどうなるか

先ほどの例で言えば、

  • 本当の差分 D=ab=0.0000001D = a – b = 0.0000001
  • 計算結果 D^=0\hat D = 0 になってしまった

とすると、

相対誤差=00.00000010.0000001=0.00000010.0000001=1.0\text{相対誤差} = \frac{|0 – 0.0000001|}{0.0000001} = \frac{0.0000001}{0.0000001} = 1.0

つまり 100% の誤差です。

  • 真の差分が非常に小さい 10710^{-7} なのに、丸めのせいでゼロと “ほぼ同じ” という結果になったので、得られた値の信頼度がまったくない状態になります。

3. “大きな相対誤差” の例

| 真の差分 DD | 計算結果 D^\hat D | 絶対誤差 D^D|\hat D-D| | 相対誤差 D^DD\frac{|\hat D-D|}{|D|} |
|:————-:|:—————–:|:————————:|:———————————:|
| 1×1021\times10^{-2} | 9.9×1039.9\times10^{-3} | 1×1041\times10^{-4} | 104102=1%\frac{10^{-4}}{10^{-2}}=1\% |
| 1×1071\times10^{-7} | 9.9×1089.9\times10^{-8} | 1×1081\times10^{-8} | 108107=10%\frac{10^{-8}}{10^{-7}}=10\% |
| 1×1071\times10^{-7} | 00 | 1×1071\times10^{-7} | 107107=100%\frac{10^{-7}}{10^{-7}}=100\% |

  • 真の差分が小さくなるほど、同じ「絶対誤差」でも 相対誤差 はどんどん大きくなる
  • 桁落ちで差がほぼ消えてしまうと、相対誤差は 100% を超える(完全に値を失う)

4. なぜ問題になるのか

  • 相対誤差が大きいと、得られた数値結果にまったく信頼がおけなくなる
  • 特に物理量や微小変化を扱うシミュレーションでは、大きな相対誤差は解析結果を根本から誤らせる

5. 対策

  1. 式の変形
    •   ab\;a-b を直接引かずに、たとえば共通因子でくくり出すなどの工夫
  2. 高精度演算
    • 倍精度よりさらに精度の高い演算ライブラリを使う
  3. 誤差評価
    • 途中経過での誤差伝播を解析し、許容できない場合はアルゴリズムを変更

まとめ

  • 相対誤差=誤差の大きさ÷本当の値
  • 本当の値が小さいほど同じ絶対誤差でも相対誤差は大きくなる
  • 桁落ちでは本当の差分がほぼ消えるため、相対誤差が 100% を超えて「結果が無意味」になる

このように、“小さな差” を扱う計算では相対誤差が致命的になり得るため、桁落ちに注意して数値アルゴリズムを設計することが重要です。