The following example demonstrates how to determine which floating-point exceptions have been raised by earlier computations. Bit masks defined in the system include file f77_floatingpoint.h are applied to the value returned by ieee_flags.
In this example, DetExcFlg.F, the include file is introduced using the #include preprocessor directive, which requires us to name the source file with a .F suffix. Underflow is caused by dividing the smallest double-precision number by 2.
Example: Detect an exception using ieee_flags and decode it:
#include "f77_floatingpoint.h"
CHARACTER*16 out
DOUBLE PRECISION d_max_subnormal, x
INTEGER div, flgs, inv, inx, over, under
x = d_max_subnormal() / 2.0 ! Cause underflow
flgs=ieee_flags('get','exception','',out) ! Which are raised?
inx = and(rshift(flgs, fp_inexact) , 1) ! Decode
div = and(rshift(flgs, fp_division) , 1) ! the value
under = and(rshift(flgs, fp_underflow), 1) ! returned
over = and(rshift(flgs, fp_overflow) , 1) ! by
inv = and(rshift(flgs, fp_invalid) , 1) ! ieee_flags
PRINT *, "Highest priority exception is: ", out
PRINT *, ' invalid divide overflo underflo inexact'
PRINT '(5i8)', inv, div, over, under, inx
PRINT *, '(1 = exception is raised; 0 = it is not)'
i = ieee_flags('clear', 'exception', 'all', out) ! Clear all
END
Example: Compile and run the preceding example (DetExcFlg.F):
demo% f77 -silent DetExcFlg.F
demo% a.out
Highest priority exception is: underflow
invalid divide overflo underflo inexact
0 0 0 1 1
(1 = exception is raised; 0 = it is not)
demo%