次の条件のため、浮動小数点の合計や積の縮約操作が不正確になることがあります。
計算が並列実行されるときの順序が、1 つのプロセッサ上で逐次実行されるときの順序と違う場合
計算の順序が、浮動小数点数の合計や積に影響を与えた場合。ハードウェア浮動小数点の加算や乗算は結合則を満たしません。 どのように演算対象が関連付られているかによって、丸め、オーバーフロー、アンダーフローが発生する可能性があります。たとえば、(X*Y)*Z と X*(Y*Z) は、数値的には意味が違う可能性があります。
状況によって、エラーが受け付けられない場合があります。
例: 丸めの例です。-1 と +1 の間の 100,000 個の乱数を合計します。
demo% cat t4.f parameter ( n = 100000 ) double precision d_lcrans, lb / -1.0 /, s, ub / +1.0 /, v(n) s = d_lcrans ( v, n, lb, ub ) ! n 個の -1 と +1 の間の乱数を求める。 s = 0.0 do i = 1, n s = s + v(i) end do write(*, '(" s = ", e21.15)') s end demo% f95 -O4 -autopar -reduction t4.f |
結果は、プロセッサの数によって異なります。次の表に、-1 と +1 の間の 100,000 個の乱数の合計を示します。
プロセッサの数 |
出力 |
---|---|
1 |
s = 0.568582080884714E+02 |
2 |
s = 0.568582080884722E+02 |
3 |
s = 0.568582080884721E+02 |
4 |
s = 0.568582080884724E+02 |
この状況では、丸めの誤差はおよそ 10-14 なので、この乱数のデータは容認できます。詳細は、『数値計算ガイド』を参照してください。