001:       INTEGER          FUNCTION IEEECK( ISPEC, ZERO, ONE )
002: *
003: *  -- LAPACK auxiliary routine (version 3.2) --
004: *     Univ. of Tennessee, Univ. of California Berkeley and NAG Ltd..
005: *     November 2006
006: *
007: *     .. Scalar Arguments ..
008:       INTEGER            ISPEC
009:       REAL               ONE, ZERO
010: *     ..
011: *
012: *  Purpose
013: *  =======
014: *
015: *  IEEECK is called from the ILAENV to verify that Infinity and
016: *  possibly NaN arithmetic is safe (i.e. will not trap).
017: *
018: *  Arguments
019: *  =========
020: *
021: *  ISPEC   (input) INTEGER
022: *          Specifies whether to test just for inifinity arithmetic
023: *          or whether to test for infinity and NaN arithmetic.
024: *          = 0: Verify infinity arithmetic only.
025: *          = 1: Verify infinity and NaN arithmetic.
026: *
027: *  ZERO    (input) REAL
028: *          Must contain the value 0.0
029: *          This is passed to prevent the compiler from optimizing
030: *          away this code.
031: *
032: *  ONE     (input) REAL
033: *          Must contain the value 1.0
034: *          This is passed to prevent the compiler from optimizing
035: *          away this code.
036: *
037: *  RETURN VALUE:  INTEGER
038: *          = 0:  Arithmetic failed to produce the correct answers
039: *          = 1:  Arithmetic produced the correct answers
040: *
041: *     .. Local Scalars ..
042:       REAL               NAN1, NAN2, NAN3, NAN4, NAN5, NAN6, NEGINF,
043:      $                   NEGZRO, NEWZRO, POSINF
044: *     ..
045: *     .. Executable Statements ..
046:       IEEECK = 1
047: *
048:       POSINF = ONE / ZERO
049:       IF( POSINF.LE.ONE ) THEN
050:          IEEECK = 0
051:          RETURN
052:       END IF
053: *
054:       NEGINF = -ONE / ZERO
055:       IF( NEGINF.GE.ZERO ) THEN
056:          IEEECK = 0
057:          RETURN
058:       END IF
059: *
060:       NEGZRO = ONE / ( NEGINF+ONE )
061:       IF( NEGZRO.NE.ZERO ) THEN
062:          IEEECK = 0
063:          RETURN
064:       END IF
065: *
066:       NEGINF = ONE / NEGZRO
067:       IF( NEGINF.GE.ZERO ) THEN
068:          IEEECK = 0
069:          RETURN
070:       END IF
071: *
072:       NEWZRO = NEGZRO + ZERO
073:       IF( NEWZRO.NE.ZERO ) THEN
074:          IEEECK = 0
075:          RETURN
076:       END IF
077: *
078:       POSINF = ONE / NEWZRO
079:       IF( POSINF.LE.ONE ) THEN
080:          IEEECK = 0
081:          RETURN
082:       END IF
083: *
084:       NEGINF = NEGINF*POSINF
085:       IF( NEGINF.GE.ZERO ) THEN
086:          IEEECK = 0
087:          RETURN
088:       END IF
089: *
090:       POSINF = POSINF*POSINF
091:       IF( POSINF.LE.ONE ) THEN
092:          IEEECK = 0
093:          RETURN
094:       END IF
095: *
096: *
097: *
098: *
099: *     Return if we were only asked to check infinity arithmetic
100: *
101:       IF( ISPEC.EQ.0 )
102:      $   RETURN
103: *
104:       NAN1 = POSINF + NEGINF
105: *
106:       NAN2 = POSINF / NEGINF
107: *
108:       NAN3 = POSINF / POSINF
109: *
110:       NAN4 = POSINF*ZERO
111: *
112:       NAN5 = NEGINF*NEGZRO
113: *
114:       NAN6 = NAN5*0.0
115: *
116:       IF( NAN1.EQ.NAN1 ) THEN
117:          IEEECK = 0
118:          RETURN
119:       END IF
120: *
121:       IF( NAN2.EQ.NAN2 ) THEN
122:          IEEECK = 0
123:          RETURN
124:       END IF
125: *
126:       IF( NAN3.EQ.NAN3 ) THEN
127:          IEEECK = 0
128:          RETURN
129:       END IF
130: *
131:       IF( NAN4.EQ.NAN4 ) THEN
132:          IEEECK = 0
133:          RETURN
134:       END IF
135: *
136:       IF( NAN5.EQ.NAN5 ) THEN
137:          IEEECK = 0
138:          RETURN
139:       END IF
140: *
141:       IF( NAN6.EQ.NAN6 ) THEN
142:          IEEECK = 0
143:          RETURN
144:       END IF
145: *
146:       RETURN
147:       END
148: