File indexing completed on 2025-08-05 08:15:12
0001
0002
0003 DOUBLE PRECISION FUNCTION D1MACH(I)
0004 INTEGER I
0005
0006
0007
0008
0009
0010
0011
0012
0013 INTEGER SMALL(2)
0014 INTEGER LARGE(2)
0015 INTEGER RIGHT(2)
0016 INTEGER DIVER(2)
0017 INTEGER LOG10(2)
0018 INTEGER SC, CRAY1(38), J
0019 COMMON /D9MACH/ CRAY1
0020 SAVE SMALL, LARGE, RIGHT, DIVER, LOG10, SC
0021 DOUBLE PRECISION DMACH(5)
0022 EQUIVALENCE (DMACH(1),SMALL(1))
0023 EQUIVALENCE (DMACH(2),LARGE(1))
0024 EQUIVALENCE (DMACH(3),RIGHT(1))
0025 EQUIVALENCE (DMACH(4),DIVER(1))
0026 EQUIVALENCE (DMACH(5),LOG10(1))
0027
0028
0029
0030
0031
0032
0033 DATA SC/0/
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063 IF (SC .NE. 987) THEN
0064 DMACH(1) = 1.D13
0065 IF ( SMALL(1) .EQ. 1117925532
0066 * .AND. SMALL(2) .EQ. -448790528) THEN
0067
0068 SMALL(1) = 1048576
0069 SMALL(2) = 0
0070 LARGE(1) = 2146435071
0071 LARGE(2) = -1
0072 RIGHT(1) = 1017118720
0073 RIGHT(2) = 0
0074 DIVER(1) = 1018167296
0075 DIVER(2) = 0
0076 LOG10(1) = 1070810131
0077 LOG10(2) = 1352628735
0078 ELSE IF ( SMALL(2) .EQ. 1117925532
0079 * .AND. SMALL(1) .EQ. -448790528) THEN
0080
0081 SMALL(2) = 1048576
0082 SMALL(1) = 0
0083 LARGE(2) = 2146435071
0084 LARGE(1) = -1
0085 RIGHT(2) = 1017118720
0086 RIGHT(1) = 0
0087 DIVER(2) = 1018167296
0088 DIVER(1) = 0
0089 LOG10(2) = 1070810131
0090 LOG10(1) = 1352628735
0091 ELSE IF ( SMALL(1) .EQ. -2065213935
0092 * .AND. SMALL(2) .EQ. 10752) THEN
0093
0094 SMALL(1) = 128
0095 SMALL(2) = 0
0096 LARGE(1) = -32769
0097 LARGE(2) = -1
0098 RIGHT(1) = 9344
0099 RIGHT(2) = 0
0100 DIVER(1) = 9472
0101 DIVER(2) = 0
0102 LOG10(1) = 546979738
0103 LOG10(2) = -805796613
0104 ELSE IF ( SMALL(1) .EQ. 1267827943
0105 * .AND. SMALL(2) .EQ. 704643072) THEN
0106
0107 SMALL(1) = 1048576
0108 SMALL(2) = 0
0109 LARGE(1) = 2147483647
0110 LARGE(2) = -1
0111 RIGHT(1) = 856686592
0112 RIGHT(2) = 0
0113 DIVER(1) = 873463808
0114 DIVER(2) = 0
0115 LOG10(1) = 1091781651
0116 LOG10(2) = 1352628735
0117 ELSE IF ( SMALL(1) .EQ. 1120022684
0118 * .AND. SMALL(2) .EQ. -448790528) THEN
0119
0120 SMALL(1) = 1048576
0121 SMALL(2) = 0
0122 LARGE(1) = 2147483647
0123 LARGE(2) = -1
0124 RIGHT(1) = 1019215872
0125 RIGHT(2) = 0
0126 DIVER(1) = 1020264448
0127 DIVER(2) = 0
0128 LOG10(1) = 1072907283
0129 LOG10(2) = 1352628735
0130 ELSE IF ( SMALL(1) .EQ. 815547074
0131 * .AND. SMALL(2) .EQ. 58688) THEN
0132
0133 SMALL(1) = 16
0134 SMALL(2) = 0
0135 LARGE(1) = -32769
0136 LARGE(2) = -1
0137 RIGHT(1) = 15552
0138 RIGHT(2) = 0
0139 DIVER(1) = 15568
0140 DIVER(2) = 0
0141 LOG10(1) = 1142112243
0142 LOG10(2) = 2046775455
0143 ELSE
0144 DMACH(2) = 1.D27 + 1
0145 DMACH(3) = 1.D27
0146 LARGE(2) = LARGE(2) - RIGHT(2)
0147 IF (LARGE(2) .EQ. 64 .AND. SMALL(2) .EQ. 0) THEN
0148 CRAY1(1) = 67291416
0149 DO 10 J = 1, 20
0150 CRAY1(J+1) = CRAY1(J) + CRAY1(J)
0151 10 CONTINUE
0152 CRAY1(22) = CRAY1(21) + 321322
0153 DO 20 J = 22, 37
0154 CRAY1(J+1) = CRAY1(J) + CRAY1(J)
0155 20 CONTINUE
0156 IF (CRAY1(38) .EQ. SMALL(1)) THEN
0157
0158 CALL I1MCRY(SMALL(1), J, 8285, 8388608, 0)
0159 SMALL(2) = 0
0160 CALL I1MCRY(LARGE(1), J, 24574, 16777215, 16777215)
0161 CALL I1MCRY(LARGE(2), J, 0, 16777215, 16777214)
0162 CALL I1MCRY(RIGHT(1), J, 16291, 8388608, 0)
0163 RIGHT(2) = 0
0164 CALL I1MCRY(DIVER(1), J, 16292, 8388608, 0)
0165 DIVER(2) = 0
0166 CALL I1MCRY(LOG10(1), J, 16383, 10100890, 8715215)
0167 CALL I1MCRY(LOG10(2), J, 0, 16226447, 9001388)
0168 ELSE
0169 WRITE(*,9000)
0170 STOP 779
0171 END IF
0172 ELSE
0173 WRITE(*,9000)
0174 STOP 779
0175 END IF
0176 END IF
0177 SC = 987
0178 END IF
0179
0180 IF (DMACH(4) .GE. 1.0D0) STOP 778
0181 IF (I .LT. 1 .OR. I .GT. 5) THEN
0182 WRITE(*,*) 'D1MACH(I): I =',I,' is out of bounds.'
0183 STOP
0184 END IF
0185 D1MACH = DMACH(I)
0186 RETURN
0187 9000 FORMAT(/' Adjust D1MACH by uncommenting data statements'/
0188 *' appropriate for your machine.')
0189
0190
0191
0192
0193
0194
0195
0196
0197
0198
0199
0200
0201
0202
0203
0204
0205 END
0206
0207 SUBROUTINE I1MCRY(A, A1, B, C, D)
0208
0209 INTEGER A, A1, B, C, D
0210 A1 = 16777216*B + C
0211 A = 16777216*A1 + D
0212 END