1
REAL FUNCTION R1MACH(I)
4
C SINGLE-PRECISION MACHINE CONSTANTS
5
C R1MACH(1) = B**(EMIN-1), THE SMALLEST POSITIVE MAGNITUDE.
6
C R1MACH(2) = B**EMAX*(1 - B**(-T)), THE LARGEST MAGNITUDE.
7
C R1MACH(3) = B**(-T), THE SMALLEST RELATIVE SPACING.
8
C R1MACH(4) = B**(1-T), THE LARGEST RELATIVE SPACING.
16
C needs to be (2) for AUTODOUBLE, HARRIS SLASH 6, ...
18
SAVE SMALL, LARGE, RIGHT, DIVER, LOG10, SC
20
EQUIVALENCE (RMACH(1),SMALL(1))
21
EQUIVALENCE (RMACH(2),LARGE(1))
22
EQUIVALENCE (RMACH(3),RIGHT(1))
23
EQUIVALENCE (RMACH(4),DIVER(1))
24
EQUIVALENCE (RMACH(5),LOG10(1))
25
INTEGER J, K, L, T3E(3)
26
DATA T3E(1) / 9777664 /
27
DATA T3E(2) / 5323660 /
29
C THIS VERSION ADAPTS AUTOMATICALLY TO MOST CURRENT MACHINES,
30
C INCLUDING AUTO-DOUBLE COMPILERS.
31
C TO COMPILE ON OLDER MACHINES, ADD A C IN COLUMN 1
34
C AND REMOVE THE C FROM COLUMN 1 IN ONE OF THE SECTIONS BELOW.
35
C CONSTANTS FOR EVEN OLDER MACHINES CAN BE OBTAINED BY
36
C mail netlib@research.bell-labs.com
37
C send old1mach from blas
38
C PLEASE SEND CORRECTIONS TO dmg OR ehg@bell-labs.com.
40
C MACHINE CONSTANTS FOR THE HONEYWELL DPS 8/70 SERIES.
41
C DATA RMACH(1) / O402400000000 /
42
C DATA RMACH(2) / O376777777777 /
43
C DATA RMACH(3) / O714400000000 /
44
C DATA RMACH(4) / O716400000000 /
45
C DATA RMACH(5) / O776464202324 /, SC/987/
47
C MACHINE CONSTANTS FOR PDP-11 FORTRANS SUPPORTING
48
C 32-BIT INTEGERS (EXPRESSED IN INTEGER AND OCTAL).
49
C DATA SMALL(1) / 8388608 /
50
C DATA LARGE(1) / 2147483647 /
51
C DATA RIGHT(1) / 880803840 /
52
C DATA DIVER(1) / 889192448 /
53
C DATA LOG10(1) / 1067065499 /, SC/987/
54
C DATA RMACH(1) / O00040000000 /
55
C DATA RMACH(2) / O17777777777 /
56
C DATA RMACH(3) / O06440000000 /
57
C DATA RMACH(4) / O06500000000 /
58
C DATA RMACH(5) / O07746420233 /, SC/987/
60
C MACHINE CONSTANTS FOR THE UNIVAC 1100 SERIES.
61
C DATA RMACH(1) / O000400000000 /
62
C DATA RMACH(2) / O377777777777 /
63
C DATA RMACH(3) / O146400000000 /
64
C DATA RMACH(4) / O147400000000 /
65
C DATA RMACH(5) / O177464202324 /, SC/987/
68
* *** CHECK FOR AUTODOUBLE ***
71
IF (SMALL(2) .NE. 0) THEN
73
IF ( SMALL(1) .EQ. 1117925532
74
* .AND. SMALL(2) .EQ. -448790528) THEN
75
* *** IEEE BIG ENDIAN ***
86
ELSE IF ( SMALL(2) .EQ. 1117925532
87
* .AND. SMALL(1) .EQ. -448790528) THEN
88
* *** IEEE LITTLE ENDIAN ***
99
ELSE IF ( SMALL(1) .EQ. -2065213935
100
* .AND. SMALL(2) .EQ. 10752) THEN
101
* *** VAX WITH D_FLOATING ***
111
LOG10(2) = -805796613
112
ELSE IF ( SMALL(1) .EQ. 1267827943
113
* .AND. SMALL(2) .EQ. 704643072) THEN
114
* *** IBM MAINFRAME ***
117
LARGE(1) = 2147483647
123
LOG10(1) = 1091781651
124
LOG10(2) = 1352628735
131
IF (SMALL(1) .EQ. 1234613304) THEN
134
LARGE(1) = 2139095039
137
LOG10(1) = 1050288283
138
ELSE IF (SMALL(1) .EQ. -1271379306) THEN
145
ELSE IF (SMALL(1) .EQ. 1175639687) THEN
146
* *** IBM MAINFRAME ***
148
LARGE(1) = 2147483647
150
DIVER(1) = 1007681536
151
LOG10(1) = 1091781651
152
ELSE IF (SMALL(1) .EQ. 1251390520) THEN
155
LARGE(1) = 2147483647
158
LOG10(1) = 1067065499
161
J = SMALL(1) / 10000000
162
K = SMALL(1) - 10000000*J
163
IF (K .NE. T3E(L)) GO TO 20
167
CALL I1MCRA(SMALL, K, 16, 0, 0)
168
CALL I1MCRA(LARGE, K, 32751, 16777215, 16777215)
169
CALL I1MCRA(RIGHT, K, 15520, 0, 0)
170
CALL I1MCRA(DIVER, K, 15536, 0, 0)
171
CALL I1MCRA(LOG10, K, 16339, 4461392, 10451455)
173
20 CALL I1MCRA(J, K, 16405, 9876536, 0)
174
IF (SMALL(1) .NE. J) THEN
178
* *** CRAY 1, XMP, 2, AND 3 ***
179
CALL I1MCRA(SMALL(1), K, 8195, 8388608, 1)
180
CALL I1MCRA(LARGE(1), K, 24574, 16777215, 16777214)
181
CALL I1MCRA(RIGHT(1), K, 16338, 8388608, 0)
182
CALL I1MCRA(DIVER(1), K, 16339, 8388608, 0)
183
CALL I1MCRA(LOG10(1), K, 16383, 10100890, 8715216)
189
IF (RMACH(4) .GE. 1.0) STOP 776
190
IF (I .LT. 1 .OR. I .GT. 5) THEN
191
WRITE(*,*) 'R1MACH(I): I =',I,' is out of bounds.'
196
9010 FORMAT(/' Adjust autodoubled R1MACH by getting data'/
197
*' appropriate for your machine from D1MACH.')
198
9020 FORMAT(/' Adjust R1MACH by uncommenting data statements'/
199
*' appropriate for your machine.')
200
* /* C source for R1MACH -- remove the * in column 1 */
204
*float r1mach_(long *i)
207
* case 1: return FLT_MIN;
208
* case 2: return FLT_MAX;
209
* case 3: return FLT_EPSILON/FLT_RADIX;
210
* case 4: return FLT_EPSILON;
211
* case 5: return log10((double)FLT_RADIX);
213
* fprintf(stderr, "invalid argument: r1mach(%ld)\n", *i);
214
* exit(1); return 0; /* else complaint of missing return value */
217
SUBROUTINE I1MCRA(A, A1, B, C, D)
218
**** SPECIAL COMPUTATION FOR CRAY MACHINES ****
219
INTEGER A, A1, B, C, D