HP-UX Floating-Point Guide
110 Chapter 4
HP-UX Math Libraries on HP 9000 Systems
Math Library Basics
Sample Program: liberr77.f
C HP FORTRAN/9000 only
C Compile
C 1) As is;
C 2) With comment removed from ON EXTERNAL ERROR ABORT
C statement, and with +T
C 3) With comment removed from ON EXTERNAL ERROR CALL MYSUB
C statement, and with +T
PROGRAM LIBERR77
$ALIAS FETESTEXCEPT = ‘fetestexcept’ (%val)
$ALIAS FEGETTRAPENABLE = ‘fegettrapenable’
INTEGER FE_INEXACT, FE_UNDERFLOW, FE_OVERFLOW
INTEGER FE_DIVBYZERO, FE_INVALID, FE_ALL_EXCEPT
PARAMETER (FE_INEXACT = Z’08000000’)
PARAMETER (FE_UNDERFLOW = Z’10000000’)
PARAMETER (FE_OVERFLOW = Z’20000000’)
PARAMETER (FE_DIVBYZERO = Z’40000000’)
PARAMETER (FE_INVALID = Z’80000000’)
PARAMETER (FE_ALL_EXCEPT = Z’f8000000’)
EXTERNAL FETESTEXCEPT, FEGETTRAPENABLE
INTEGER FETESTEXCEPT, FEGETTRAPENABLE
DOUBLE PRECISION X, Y
LOGICAL TEST
INTEGER FLAGS, TRAPS
C Abort if a function results in an error
C ON EXTERNAL ERROR ABORT
C Call mysub if a function results in an error
C Other possible action is IGNORE
C Setting I to 0 aborts the program
C ON EXTERNAL ERROR CALL MYSUB
X = 1.2345D0
X = X*1.1D0
Y = DLOG(0.0D0-X)
FLAGS = FETESTEXCEPT(FE_ALL_EXCEPT)
TRAPS = FEGETTRAPENABLE()
WRITE(*,10) Y, FLAGS, TRAPS
TEST = FLAGS .AND. FE_INVALID
IF (TEST) THEN
PRINT *, ‘invalid operation occurred’
ENDIF
10 FORMAT(G, Z10.8, Z10.8)
END
SUBROUTINE MYSUB(I, A, X)
INTEGER I
DOUBLE PRECISION A, X
PRINT *, ‘error no. is ‘, I
PRINT *, ‘result is ‘, A
PRINT *, ‘arg is ‘, X
I = 0
RETURN
END