次の例は、前の計算によってどの浮動小数点例外フラグが立ったかを決定する方法を示しています。システム include ファイル floatingpoint.h に定義されたビットマスクは、ieee_flags により返された値に適用されます。
この例 DetExcFlg.F では、インクルードファイルは #include 前処理部指令を使用して導入されます。 この指令には、.F 接尾辞のソースファイルを指定しなければいけません。アンダーフローの原因は、最小の倍精度数を 2 で除算しているためです。
例: ieee_flags を使用して例外を検出し、復号化します。
#include "floatingpoint.h" CHARACTER*16 out DOUBLE PRECISION d_max_subnormal, x INTEGER div, flgs, inv, inx, over, under x = d_max_subnormal() / 2.0 ! アンダーフローを発生 flgs=ieee_flags('get','exception','',out) ! どの例外が発生したのか ? inx = and(rshift(flgs, fp_inexact) , 1) ! ieee_flags div = and(rshift(flgs, fp_division) , 1) ! によって under = and(rshift(flgs, fp_underflow), 1) ! 返される over = and(rshift(flgs, fp_overflow) , 1) ! 値を inv = and(rshift(flgs, fp_invalid) , 1) ! 復号化 PRINT *, "もっとも優先順位が高い例外:", out PRINT *, ' invalid divide overflo underflo inexact' PRINT '(5i8)', inv, div, over, under, inx PRINT *, '(1 = 例外フラグが立っている; 0 = 立っていない)' i = ieee_flags('clear', 'exception', 'all', out) ! すべてクリアー END |
例: 前出の例 (DetExcFlg.F) をコンパイルして実行します。
demo% f95 DetExcFlg.F demo% a.out もっとも優先順位が高い例外: underflow invalid divide overflo underflo inexact 0 0 0 1 1 (1 = 例外フラグが立っている; 0 = 立っていない) demo% |