IEEE 浮動小数点の概要

以下で、「IEEE Standard for Floating-Point Arithmetic」に関して要約し、それを特定のハードウェア・プラットフォームで XL Fortran に 適用する方法について詳述します。 ドラフトの Fortran 2003 IEEE Module と算術演算サポートについては、 「XL Fortran ランゲージ・リファレンス」を 参照してください。

IEEE を厳守するためのコンパイル方法

デフォルトでは、XL Fortran は IEEE 標準にほぼ従いますが、すべての規則に従うわけではありません。 この標準を厳守するようコンパイルするには、次のようにします。

IEEE 単精度値および倍精度値

XL Fortran は、単精度および倍精度の値を IEEE 形式でエンコードします。 範囲および表示については、「XL Fortran ランゲージ・リファレンス」の『実数』を 参照してください。

IEEE 拡張精度値

IEEE 標準は、強制ではありませんが、拡張精度値用の形式を提唱しています。 XL Fortran ではこの形式を使用しません。 拡張精度値 は、XL Fortran が使用する形式についての説明です。

無限大と NaN

単精度の実数値の場合は、次のようになります。

倍精度の実数値の場合は、次のようになります。

これらの値は、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 標準は、起こる可能性のあるいくつかの例外条件を定義しています。

OVERFLOW (オーバーフロー)
値の指数が大きすぎて表すことができません。

UNDERFLOW (アンダーフロー)
非ゼロ値が小さすぎるため、表現の精度が著しく低下します。 値は、ゼロまたは非正規数としてのみ表すことができます。

ZERODIVIDE (ゼロ除算)
有限のゼロ以外の値がゼロで割られました。

INVALID (無効)
結果が定義されていない値で演算が実行されています。 これには以下のものが含まれます。

INEXACT (不正確)
算出された値を正確に表すことはできないため、丸め誤差が生じた場合。 (この例外は非常によくあります。)

XL Fortran では、これらの例外が発生したときに必ず検出されますが、 デフォルトでは特別な処置は行われません。 計算は続行され、通常、結果は NaN または無限大の値になります。 例外が発生したら自動的に通知してほしい場合は、 コンパイラー・オプションまたは組み込みサブプログラムの呼び出しを介して例外トラッピングをオンにします。 ただし、例外ハンドラーで処理されるはずであった、 次のようなさまざまな結果が生じます。

表 14. トラッピングを使用可能にした場合としない場合の IEEE 例外の結果

  Overflow Underflow Zerodivide Invalid Inexact
例外を使用可能にしない場合 (デフォルト) INF 非正規数 INF NaN 丸めた結果
例外を使用可能にした場合 バイアス指数を持つ正規化されない数 バイアス指数を持つ正規化されない数 結果なし 結果なし 丸めた結果
注:
別の結果が生じることがあるので、生成された例外が正しく処理されることを確認することは非常に重要です。 この確認については、 浮動小数点演算例外の検出とトラッピングを参照してください。
IBM Copyright 2003