Sun Studio 12: Fortran プログラミングガイド

6.3.1.2 ieee_flags を使用して例外を検出する

次の例は、前の計算によってどの浮動小数点例外フラグが立ったかを決定する方法を示しています。システム 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%