ここでは、Fortran 95 に移植したプログラムが予想どおりに動かないときに何をすればいいのかを提案します。
サイズと工学上の単位に注意してください。ゼロに非常に近い数が異なる場合がありますが、この差異はあまり問題ではありません。特にこの数が 2 つの巨大数の差である場合などは問題ではありません。たとえば、1.9999999e-30 と -9.9992112e-33 は異なりますが、差異はほとんどありません。
VAX の数学演算は IEEE の数学演算ほど正確ではありません。IEEE プロセッサ間でも結果が異なる場合があります。特に、これは三角関数を多く含んでいる場合に顕著です。複雑な要因がからんでおり、また、標準仕様が厳密に定義するのは基本的な算術関数だけです。このため、IEEE マシンの間にさえ微妙に差異があります。浮動小数点の問題については、第 6 章「浮動小数点演算」を確認してください。
call nonstandard_arithmetic() を使用して実行してみてください。これもパフォーマンスをかなり向上させ、Sun のワークステーションをより VAX システムに似せて動作させます。VAX またはほかのシステムが手近にある場合、その上でも実行してみてください。多くの数値アプリケーションが、浮動小数点の実装により多少異なる結果を生成するのは、ごく一般的なことです。
NaN、+Inf やそのほかの考えられるエラーがないか検査してください。さまざまな例外のトラップ方法についての説明は、第 6 章「浮動小数点演算」、または ieee_handler(3m) のマニュアルページを参照してください。ほとんどのマシンでは、これらの例外は単に実行を中止させるだけです。
2 つの数が 6 x 1029 だけ異なっていても、浮動小数点の表現は同じになることもあります。次に、違う数であるのに同じ表現の例を示します。
real*4 x,y x=99999990e+29 y=99999996e+29 write (*,10) x, x 10 format('99,999,990 x 10^29 = ', e14.8, ' = ', z8) write(*,20) y, y 20 format('99,999,996 x 10^29 = ', e14.8, ' = ', z8) end |
出力は次のように表示されます。
99,999,990 x 10^29 = 0.99999993E+37 = 7CF0BDC1 99,999,996 x 10^29 = 0.99999993E+37 = 7CF0BDC1 |
この例では、差は 6 x 1029 です。このような大きな差異が生じる理由は、IEEE の単精度で保証されているのは 10 進 - 2 進変換に対して 10 進の 6 桁だけだからです。7 桁や 8 桁を正しく変換できる場合もありますが、これは値によって異なります。
警告なしにプログラムが異常終了する場合で、実行のたびに異常が発生するまでの時間が異なる場合は、次のように対処してください。
最低の最適化 (-O1) でコンパイルしてください。プログラムが動作するようであれば、いくつかのルーチンを選んで、最適化レベルを上げてコンパイルしてください。
オプティマイザは、プログラムに関して前提条件を付けなければならないことを理解しておいてください。ユーザーが標準以外の処理を行なった場合は、問題を引き起こす可能性があります。すべてのオプティマイザが、プログラムに対してあらゆるレベルの最適化を行うわけではありません。「7.6.2 別名参照と -xalias オプション」を参照してください。