以下で、「IEEE Standard for Floating-Point Arithmetic」に関して要約し、それを特定のハードウェア・プラットフォームで XL Fortran に 適用する方法について詳述します。 ドラフトの Fortran 2003 IEEE Module と算術演算サポートについては、 「XL Fortran ランゲージ・リファレンス」を 参照してください。
デフォルトでは、XL Fortran は IEEE 標準にほぼ従いますが、すべての規則に従うわけではありません。 この標準を厳守するようコンパイルするには、次のようにします。
XL Fortran は、単精度および倍精度の値を IEEE 形式でエンコードします。 範囲および表示については、「XL Fortran ランゲージ・リファレンス」の『実数』を 参照してください。
IEEE 標準は、強制ではありませんが、拡張精度値用の形式を提唱しています。 XL Fortran ではこの形式を使用しません。 拡張精度値 は、XL Fortran が使用する形式についての説明です。
単精度の実数値の場合は、次のようになります。
倍精度の実数値の場合は、次のようになります。
これらの値は、Fortran の実定数とは対応しません。 これらの値はすべて、ビット・パターンを直接エンコードすることによって、または ieee_arithmetic モジュールに提供されている ieee_value 関数を使用することによって 生成できます。 ieee_value 関数は Fortran 2003 ドラフト標準で認められており、結果が 移植可能であるため、この関数を使用することは、プログラミング技法として好ましいことです。 ビット・パターンを直接エンコードすると、値によって異なるビット・パターンを使用しているマシンでは 移植上の問題が生じることがあります。 シグナル 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 NAN -NAN NAN Number too big for a REAL: INF Number divided by zero: -INF Nonsensical results: NAN NAN Does a quiet NaN equal itself: F Does a signaling NaN equal itself: F
IEEE 標準は、起こる可能性のあるいくつかの例外条件を定義しています。
XL Fortran では、これらの例外が発生したときに必ず検出されますが、
デフォルトでは特別な処置は行われません。
計算は続行され、通常、結果は NaN または無限大の値になります。
例外が発生したら自動的に通知してほしい場合は、
コンパイラー・オプションまたは組み込みサブプログラムの呼び出しを介して例外トラッピングをオンにします。
ただし、例外ハンドラーで処理されるはずであった、
次のようなさまざまな結果が生じます。
表 14. トラッピングを使用可能にした場合としない場合の IEEE 例外の結果
Overflow | Underflow | Zerodivide | Invalid | Inexact | |
---|---|---|---|---|---|
例外を使用可能にしない場合 (デフォルト) | INF | 非正規数 | INF | NaN | 丸めた結果 |
例外を使用可能にした場合 | バイアス指数を持つ正規化されない数 | バイアス指数を持つ正規化されない数 | 結果なし | 結果なし | 丸めた結果 |