以下で、「IEEE Standard for Floating-Point Arithmetic 」に関して要約し、特定のハードウェア・プラットフォームで XL Fortran に対してそれを用いる方法について詳述します。 Fortran 2000 IEEE Module 草案と算術演算サポートについては、「XL Fortran for AIX ランゲージ・リファレンス 」を参照してください。
デフォルトでは、XL Fortran は IEEE 標準にほぼ従いますが、すべての規則に従うわけではありません。この標準を厳守するようコンパイルするには、次のようにします。
XL Fortran は、単精度および倍精度の値を IEEE 形式でエンコードします。範囲および表示については、「XL Fortran for AIX ランゲージ・リファレンス 」の『実数 』を参照してください。
IEEE 標準は、強制ではありませんが、拡張精度値用の形式を提唱しています。 XL Fortran ではこの形式を使用しません。 拡張精度値 は、XL Fortran が使用する形式についての説明です。
単精度の実数値の場合は、次のようになります。
倍精度の実数値の場合は、次のようになります。
これらの値は、Fortran の実定数とは対応しません。すべて、ビット・パターンを直接エンコードすることによって生成できます。ただし、多くの場合、このプログラミング技法は推奨されていません。この技法は、Fortran 標準では認められておらず、値によって異なるビット・パターンを使用するマシンでは移植上の問題が生じることがあるからです。シグナル NaN 値以外はすべて、算術演算の結果として生じることがあります。
$ cat fp_values.f real plus_inf, minus_inf, plus_nanq, minus_nanq, nans real large data plus_inf /z'7f800000'/ data minus_inf /z'ff800000'/ data plus_nanq /z'7fc00000'/ data minus_nanq /z'ffc00000'/ data nans /z'7f800001'/ print *, 'Special values:', plus_inf, minus_inf, plus_nanq, minus_nanq, nans ! They can also occur as the result of operations. large = 10.0 ** 200 print *, 'Number too big for a REAL:', large * large print *, 'Number divided by zero:', (-large) / 0.0 print *, 'Nonsensical results:', plus_inf - plus_inf, sqrt(-large) ! To find if something is a NaN, compare it to itself. print *, 'Does a quiet NaN equal itself:', plus_nanq .eq. plus_nanq print *, 'Does a signaling NaN equal itself:', nans .eq. nans ! Only for a NaN is this comparison false. end $ xlf95 -o fp_values fp_values.f ** _main === End of Compilation 1 === 1501-510 Compilation successful for file fp_values.f. $ fp_values Special values: INF -INF NaNQ -NaNQ NaNS Number too big for a REAL: INF Number divided by zero: -INF Nonsensical results: NaNQ NaNQ Does a quiet NaN equal itself: F Does a signaling NaN equal itself: F
IEEE 標準は、起こる可能性のあるいくつかの例外条件を定義しています。
XL Fortran では、これらの例外が発生したときに必ず検出されますが、デフォルトでは特別な処置は行われません。計算は続行され、通常、結果は NaN または無限大の値になります。例外が発生したら自動的に通知してほしい場合は、コンパイラー・オプションまたは組み込みサブプログラムの呼び出しを介して例外トラップをオンにします。ただし、例外ハンドラーで処理されるはずであった、次のようなさまざまな結果が生じます。
表 18. トラップを使用可能にした場合としない場合の IEEE 例外の結果
Overflow | Underflow | Zerodivide | Invalid | Inexact | |
---|---|---|---|---|---|
例外を使用可能にしない場合 (デフォルト) | INF | 非正規数 | INF | NaN | 丸めた結果 |
例外を使用可能にした場合 | 偏った指数を持つ正規化されない数 | 偏った指数を持つ正規化されない数 | 結果なし | 結果なし | 丸めた結果 |