XL Fortran for AIX V8.1.1

ユーザーズ・ガイド


IEEE 浮動小数点の概要

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

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

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

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

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

IEEE 拡張精度値

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

無限大と NaN

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

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

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

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

UNDERFLOW (アンダーフロー)
ゼロではない値であるが、小さすぎてゼロ以外で表すことができません。

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

INVALID (無効)
結果が定義されていない値、たとえば、無限大 - 無限大、0.0/0.0、または負数の平方根のいずれかで演算が実行された場合。

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

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

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

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


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]