TL

数値安定性と浮動小数点誤差(HPC文脈)

大規模シミュレーションが「動くのに答えが違う」原因の多くは丸め誤差の蓄積です。原理を押さえれば精度と速度の両取りができます。

応用HPC数値解析浮動小数点反復法並列計算最終更新: 2026-06-21
TL;DR要点だけ先に
  • 1.浮動小数点の丸め誤差はランダムではなく、演算順序と条件数次第で桁単位に増幅・蓄積します。
  • 2.Kahanの加算補正は総和計算の誤差蓄積をO(n·ε)からO(ε)に抑える古典的だが今も有効な技法です。
  • 3.混合精度は単純な高速化ではなく、反復法の収束判定・残差計算と組み合わせて初めて精度を保ったまま高速化できます。

丸め誤差はなぜ「蓄積」するのか

IEEE 754倍精度(double)は仮数部52ビットで、1回の演算がもたらす相対誤差は機械イプシロンε(約2.2×10^-16)程度に収まります。問題は、この誤差が大規模計算では単純な足し算では済まないことです。

n個の数を素朴に逐次加算すると、各ステップの丸め誤差が後続の計算にそのまま持ち越され、最悪誤差は演算回数nεの積、つまりn·εのオーダーで積み上がります。HPCで扱う配列やメッシュの要素数は数百万から数十億に及ぶため、n·εは無視できない大きさになり得ます。しかも誤差は完全にランダムではなく、加算順序(総和を大きい順にするか小さい順にするか)や、桁落ち(近い大きさの数を引き算して有効桁が失われる現象)が起きる箇所に依存して系統的に偏ります。

桁落ちが起きる典型パターン

二次方程式の解の公式で判別式の平方根が係数に近い値になる場合や、微分の差分近似で分子の引き算が非常に小さくなる場合は、有効桁の大部分が引き算で相殺され桁落ちが起きます。式変形(有理化や漸化式の書き換え)で引き算を避けるのが対策です。

条件数 ── 問題自体の悪条件性

丸め誤差がどれだけ結果に影響するかは、アルゴリズムだけでなく問題そのものの性質、すなわち条件数(condition number)に左右されます。条件数は「入力の相対的な微小変化が、出力の相対誤差として何倍に増幅されるか」を表す指標です。

条件数の直感的定義(関数 f、入力 x)

  κ ≈ |x·f'(x) / f(x)|

  κ が小さい(例: 1〜10)  → 良条件(well-conditioned)
  κ が非常に大きい          → 悪条件(ill-conditioned)

線形連立方程式Ax=bでは、行列Aの条件数κ(A)(最大特異値と最小特異値の比)が結果を支配します。κ(A)が大きい行列は、bのわずかな摂動や丸め誤差が解xに大きく増幅されて現れます。経験則として、κ(A)が10^kのとき、double精度で得られる解の有効桁は約16 - k桁まで落ちると見積もれます。これはアルゴリズムの実装をどれだけ工夫しても超えられない下限であり、悪条件性は問題固有の限界です。

安定なアルゴリズムでも悪条件は救えない

数値的に安定なアルゴリズム(誤差増幅がκ(A)相当に留まる)を使っても、κ(A)自体が大きければ得られる解の精度は本質的に制限されます。前処理(preconditioning)で実効的な条件数を下げるのが唯一の根本対策です。

Kahanの加算補正 ── 総和誤差を1桁分に抑える

大量の数値を合計する場面(内積、ノルム計算、統計量集計)で、素朴な逐次加算の誤差蓄積を大幅に抑える古典的手法がKahanの加算補正(Kahan summation、補正付き加算)です。仕組みは、各加算で失われた下位ビット(丸め誤差)を明示的に変数cに保持し、次の加算時に補正として足し戻すことです。

Kahanの加算補正(擬似コード)

  sum = 0.0
  c   = 0.0   // 失われた誤差の累積を保持する補正項
  for x in 配列:
      y = x - c        // 前回までの誤差を打ち消すよう補正
      t = sum + y
      c = (t - sum) - y  // 今回新たに切り捨てられた誤差を算出
      sum = t
  戻り値: sum

この補正により、総和の誤差上限はO(n·ε)からO(ε)、つまり演算回数nにほぼ依存しない水準まで低減されます。代償は加算1回あたりの演算数がおよそ4倍になることで、単純な総和にはオーバーヘッドが伴います。実務では、内積や分散のような桁落ちしやすい集計、あるいは長時間の時間発展シミュレーションで丸め誤差が蓄積し続ける場面に絞って適用するのが妥当です。並列総和(ツリー型リダクション)はKahan補正なしでも逐次加算よりO(log n)の深さで誤差蓄積を抑えられるため、両者を組み合わせる実装も一般的です。

総和方式誤差オーダー追加コスト
逐次加算(素朴)O(n・ε)なし(基準)
ツリー型並列リダクションO(log n・ε)並列化自体は必須要件
Kahanの加算補正O(ε)演算数が約4倍
倍々精度(doubleを2個で表現)O(ε²)相当演算数が数倍、実装が複雑

混合精度計算 ── 精度と性能のトレードオフ

GPUやAIアクセラレータの普及により、単精度(float32)や半精度(float16、bfloat16)の演算スループットが倍精度の数倍から十数倍に達するハードウェアが一般的になりました。これを活用するのが混合精度計算(mixed precision)で、演算の大部分を低精度で行い、精度が結果を左右する箇所だけ高精度を残す設計です。

HPCで代表的なのが混合精度反復精緻化(iterative refinement)です。連立方程式Ax=bの解法において、支配的なコストであるLU分解と行列積を単精度で実行し、残差r=b-Axの計算と解の更新だけを倍精度で行います。単精度の行列演算は速いが誤差が大きく、その誤差は倍精度で計算した残差を使った反復で徐々に補正されます。結果として、実行時間は単精度分解相当に近づきながら、最終的な解の精度は倍精度相当まで回復します。

混合精度がうまく効く条件

反復精緻化が有効に働くのは、行列Aの条件数κ(A)がそれほど大きくない場合に限られます。κ(A)が単精度の表現限界(有効桁約7桁)に近いほど大きいと、低精度分解から得られる初期解の誤差が反復で補正しきれず、収束しないか倍精度そのままより遅くなることがあります。適用前にκ(A)の見積もりが要ります。

低精度化は演算だけでなくメモリ帯域の節約にも直結します。HPCワークロードは多くの場合、演算律速ではなくメモリ帯域律速(メモリバウンド)であるため、float32やfloat16へのデータ削減はキャッシュ・帯域の両面で効き、演算精度そのものの低下以上に実効性能を押し上げることが少なくありません。

反復法の収束判定への影響

疎行列を扱う大規模計算では、直接法(LU分解など)ではなく共役勾配法(CG法)やGMRESのような反復法が使われます。反復法は「残差が十分小さくなったら停止する」という収束判定に依存しますが、この判定自体が浮動小数点誤差の影響を受けます。

理論上、CG法は丸め誤差がなければ高々n回(nは次元数)で厳密解に到達しますが、実際には丸め誤差により反復ベクトルの直交性が徐々に崩れ、理論上の反復回数を超えても収束しなかったり、逆に丸め誤差の蓄積で残差が振動して停止基準を満たさなくなったりします。さらに、行列Aの条件数κ(A)が大きいほど反復回数自体が増大するため(CG法の収束率は√κ(A)にほぼ比例して悪化する)、悪条件な問題では丸め誤差の影響を受ける反復回数も増え、両者が絡み合って収束を遅らせます。

停止基準を「残差ノルムが絶対値で閾値未満」と設定すると、問題のスケールによって閾値の妥当性が変わってしまうため、実務では相対残差(初期残差との比)や、前処理後の残差を用いるのが一般的です。前処理(不完全LU分解や多重格子法など)は反復回数を減らすだけでなく、実効的な条件数を下げることで丸め誤差に対する頑健性も同時に高めます。

まとめ

  • 丸め誤差は演算順序と桁落ちに依存して系統的に蓄積し、最悪ケースで演算回数に比例して増大する。
  • 条件数は問題固有の誤差増幅率であり、アルゴリズムの工夫では超えられない精度の下限を決める。
  • Kahanの加算補正は総和誤差をO(n・ε)からO(ε)へ抑える一方、演算コストは約4倍になるため適用箇所を選ぶ必要がある。
  • 混合精度計算は反復精緻化などの誤差補正機構と組み合わせて初めて、速度と精度を両立できる。
  • 反復法の収束判定は条件数と丸め誤差の双方に影響され、相対残差や前処理付き残差を使うことが実務上の基本となる。

HPC・科学技術計算 Article

数値安定性と浮動小数点誤差(HPC文脈)を実務で読む

TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。

解決すること

HPC

比較で見る軸

難易度: advanced / カテゴリ: HPC・科学技術計算 / タグ数: 5

導入後に効く点

Kahanの加算補正は総和計算の誤差蓄積をO(n·ε)からO(ε)に抑える古典的だが今も有効な技法です。

先に潰すリスク

用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。

数字・仕様の読み方
難易度
advanced
カテゴリ
HPC・科学技術計算
タグ数
5

判断チェックリスト

  • 自社の用途が「HPC / 数値解析」に近いか確認する。
  • 強みである「浮動小数点の丸め誤差はランダムではなく、演算順序と条件数次第で桁単位に増幅・蓄積します。」が本当に評価軸になるか確認する。
  • 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
  • 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
  • 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
  • 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。

次に確認する観点

HPC数値解析浮動小数点反復法並列計算HPC数値解析浮動小数点