Oracle® Solaris Studio 12.4: 数値計算ガイド

印刷ビューの終了

更新: 2015 年 1 月
 
 

2.3.5 段階的アンダーフローと突発的アンダーフローを比較した 2 つの例

次に、2 つのよく知られた数学的な例を示します。最初の例は、内積を計算するコードです。

sum = 0; 
for (i = 0; i < n; i++) {
 sum = sum + a[i] * y[i]; 
} 
return sum;

段階的アンダーフローでは、結果は丸めによって許可される範囲で正確です。突発的アンダーフローでは、もっともらしく見えるが、はるかに不適切な、0 以外の小さい総計が提供される可能性があります。ただし、こうした問題を回避するために、賢いプログラマなら、数値が小さいために正確性が低下する場所を予測できる場合は計算をスケーリングするという点を認める必要があります。

複素数の商を導き出している 2 番目の例は、スケーリングには適していません。

image:a + i · b = (p + i · q)/(r + i · s) |r / s|≤1 と仮定する

image:=[ (p · (r / s) + q) + i(q · (r / s) - p) ] / [ s + r · (r / s) ] .

丸めにもかかわらず、計算された複素数の結果が正確な結果と異なり、その差は p + i · qr + i · s がそれぞれ数 ulp 程度を超えない不安定さだったとしたら正確な結果になっていた値を超えない程度であったことを示すことができます。この誤差分析は、ab の両方がアンダーフローした場合は、誤差が |a + i · b| の数 ulp で制限される点を除き、アンダーフローが発生した場合にも保持されます。アンダーフローが 0 にフラッシュされた場合は、どちらの結論も当てはまりません。

複素数の商を計算するためのこのアルゴリズムは堅牢であり、段階的アンダーフローが存在する場合の誤差分析に適しています。突発的アンダーフローが発生した場合に複素数の商を計算するための、同様に堅牢で、分析が容易であり、かつ効率的なアルゴリズムは存在しません。突発的アンダーフローでは、低レベルの複雑な詳細事項を気にすることによる負担は、浮動小数点環境の実装者からそのユーザーに移ります。

段階的アンダーフローが存在する場合は成功するが、突発的アンダーフローでは失敗する問題のクラスは、突発的アンダーフローのユーザーが認識しているより広範囲です。次に示すような、よく使用される数値技法の多くはこのクラスに分類されます。

  • 線形方程式の解法

  • 多項式の解法

  • 数値積分

  • 収束加速法

  • 複素数の除算