パラメータ・ファイル /opt/intel_fc_80/include/fordef.for には、浮動小数点表現のクラスに対応するシンボルおよび INTEGER*4 の値が含まれています。これらのクラスには、正の正規化されていない数値を示すビットパターンなどの例外も含まれています。
シンボルが含まれたこのファイルと、FP_CLASS 組込み関数を使用することで、例外的な数値の識別が可能になります。例えば、これにより、正または負の正規化されていない数値を正のゼロに置換できます。
次は、浮動小数点のビット表現を識別する簡単な例です。
include 'fordef.for'
real*4 aこの例では、/opt/intel_fc_80/include/fordef.for ファイルのシンボル for_k_fp_pos_norm と、REAL*4 の値 57.0 数とした FP_CLASS 組込み関数の戻り値を比べた結果、最初の print 文が実行されます。
次の表では、/opt/intel_fc_80/include/fordef.for ファイル内のシンボルとその対応する浮動小数点表現について説明します。
fordef.for ファイルのシンボル
シンボル名 |
浮動小数点のビット表現のクラス |
FOR_K_FP_SNAN |
シグナル型 NaN |
FOR_K_FP_QNAN |
クワイエット型 NaN |
FOR_K_FP_POS_INF |
正の無限大 |
FOR_K_FP_NEG_INF |
負の無限大 |
FOR_K_FP_POS_NORM |
正の正規化された有限数 |
FOR_K_FP_NEG_NORM |
負の正規化された有限数 |
FOR_K_FP_POS_DENORM |
正の正規化されていない数 |
FOR_K_FP_NEG_DENORM |
負の正規化されていない数 |
FOR_K_FP_POS_ZERO |
正のゼロ |
FOR_K_FP_NEG_ZERO |
負のゼロ |
次に、fordef.for ファイルと組込み関数 FP_CLASS を使ったもう 1 つの例を示します。このプログラムの目的は、例外が発生しても報告を行わず、書式なしファイルから 32 ビットパターンを REAL*4 に、すばやく読み込み、正規化されていない数値を正のゼロに置換します。
include 'fordef.for'
real*4 a(100)
integer*4 class_of_bits
! open an unformatted file as unit 1
!...
read (1) a
do i = 1, 100
class_of_bits = fp_class(a(i))
if ( class_of_bits .eq.for_k_fp_pos_denorm .or. &
class_of_bits .eq.for_k_fp_neg_denorm ) then
a(i) = 0.0
end if
end do
close (1)
end
このプログラムは、任意の -fpen の値でコンパイルできます。組込み関数 FP_CLASS は、プログラムが正規化されていない数値で計算を実行しようとする前に、正規化されていない数値を検索して、ゼロに置換します。一方、プログラムが -fpe0 でコンパイルされていて、ユニット 1 から読み込まれた正規化されていない数値がゼロに置換されない場合、正規化されていない数値を使った最初の計算で浮動小数点例外が発生します。
fordef.for ファイルと組込み関数 FP_CLASS を一緒に使用することで、NaN を識別できます。上記の例のバリエーションとして、IF 文に for_k_fp_snan シンボルと for_k_fp_qnan シンボルを含むこともできます。より簡単にこの方法を行うには、組込み関数 ISNAN を使用できます。ISNAN を使用した、上記の例の修正は次のようになります。
! The ISNAN function does not need file fordef.for
real*4 a(100)
! open an unformatted file as unit 1
!...
read (1) a
do i = 1, 100
if ( isnan (a(i)) ) then
print *, 'Element ', i, ' contains a NaN'
end if
end do
close (1)
end
このプログラムは、任意の -fpen の値でコンパイルできます。