C*********************************************************************** C C naninfchk.f C C ***************************************************************** C * * C * Absoft Corporation * C * 2781 Bond Street * C * Rochester Hills, MI 48309 * C * * C * This file contains example code for demonstration * C * purposes only. Absoft makes no warranty of the * C * suitability of this code for any purpose. * C * * C * In no event shall Absoft be liable for any incidental, * C * indirect, special, or consequential damages arising * C * out of the use of this code. * C * * C ***************************************************************** C C Routines to test real and double values against NaN and INF C C NANCHK(X) - tests REAL*4 value X against NaN C DNANCHK(X) - tests REAL*8 value X against NaN C INFCHK(X) - tests REAL*4 value X against INF C DINFCHK(X) - test REAL*8 value X against INF C C For little endian machines (Intel x86), compile with C C f77 -c -DBYTE_SWAPPED=1 naninfchk.f C or C f90 -c -DBYTE_SWAPPED=1 naninfchk.f -YBOZTYPE=INT C C For big endian machines (PowerPC), compile with C C f77 -c naninfchk.f C or C f90 -c naninfchk.f -YBOZTYPE=INT C C*********************************************************************** LOGICAL FUNCTION NANCHK(X) IMPLICIT NONE REAL X,Y INTEGER I EQUIVALENCE(Y,I) Y = X NANCHK = ((I .AND. z'7f80 0000') .EQ. z'7f80 0000') .AND. + ((I .AND. z'007f ffff') .NE. z'0000 0000') RETURN END LOGICAL FUNCTION DNANCHK(X) IMPLICIT NONE REAL*8 X,Y INTEGER I(2) EQUIVALENCE(Y,I) Y = X $IF (DEFINED(BYTE_SWAPPED)) DNANCHK = ((I(2) .AND. z'7ff0 0000') .EQ. z'7ff0 0000') .AND. + (((I(2) .AND. z'000f ffff') .NE. z'0000 0000') .OR. + (I(1) .NE. 0)) $ELSE DNANCHK = ((I(1) .AND. z'7ff0 0000') .EQ. z'7ff0 0000') .AND. + (((I(1) .AND. z'000f ffff') .NE. z'0000 0000') .OR. + (I(2) .NE. 0)) $ENDIF RETURN END LOGICAL FUNCTION INFCHK(X) IMPLICIT NONE REAL X,Y INTEGER I EQUIVALENCE(Y,I) Y = X INFCHK = ((I .AND. z'7f80 0000') .EQ. z'7f80 0000') .AND. + ((I .AND. z'007f ffff') .EQ. z'0000 0000') RETURN END LOGICAL FUNCTION DINFCHK(X) IMPLICIT NONE REAL*8 X,Y INTEGER I(2) EQUIVALENCE(Y,I) Y = X $IF (DEFINED(BYTE_SWAPPED)) DINFCHK = ((I(2) .AND. z'7ff0 0000') .EQ. z'7ff0 0000') .AND. + (((I(2) .AND. z'000f ffff') .EQ. z'0000 0000') .AND. + (I(1) .EQ. 0)) $ELSE DINFCHK = ((I(1) .AND. z'7ff0 0000') .EQ. z'7ff0 0000') .AND. + (((I(1) .AND. z'000f ffff') .EQ. z'0000 0000') .AND. + (I(2) .EQ. 0)) $ENDIF RETURN END