1      REAL FUNCTION R1MACH(I)
2C***BEGIN PROLOGUE  R1MACH
3C***DATE WRITTEN   790101   (YYMMDD)
4C***REVISION DATE  860825   (YYMMDD)
5C***CATEGORY NO.  R1
6C***KEYWORDS  MACHINE CONSTANTS
7C***AUTHOR  FOX, P. A., (BELL LABS)
8C           HALL, A. D., (BELL LABS)
9C           SCHRYER, N. L., (BELL LABS)
10C***PURPOSE  Returns single precision machine dependent constants
11C***DESCRIPTION
12C
13C     This is the CMLIB version of R1MACH, the real machine
14C     constants subroutine originally developed for the PORT library.
15C
16C     R1MACH can be used to obtain machine-dependent parameters
17C     for the local machine environment.  It is a function
18C     subroutine with one (input) argument, and can be called
19C     as follows, for example
20C
21C          A = R1MACH(I)
22C
23C     where I=1,...,5.  The (output) value of A above is
24C     determined by the (input) value of I.  The results for
25C     various values of I are discussed below.
26C
27C  Single-Precision Machine Constants
28C  R1MACH(1) = B**(EMIN-1), the smallest positive magnitude.
29C  R1MACH(2) = B**EMAX*(1 - B**(-T)), the largest magnitude.
30C  R1MACH(3) = B**(-T), the smallest relative spacing.
31C  R1MACH(4) = B**(1-T), the largest relative spacing.
32C  R1MACH(5) = LOG10(B)
33C***REFERENCES  FOX, P.A., HALL, A.D., SCHRYER, N.L, *FRAMEWORK FOR
34C                 A PORTABLE LIBRARY*, ACM TRANSACTIONS ON MATHE-
35C                 MATICAL SOFTWARE, VOL. 4, NO. 2, JUNE 1978,
36C                 PP. 177-188.
37C***ROUTINES CALLED  XERROR
38C***END PROLOGUE  R1MACH
39C
40      INTEGER SMALL(2)
41      INTEGER LARGE(2)
42      INTEGER RIGHT(2)
43      INTEGER DIVER(2)
44      INTEGER LOG10(2)
45C
46      REAL RMACH(5)
47C
48      EQUIVALENCE (RMACH(1),SMALL(1))
49      EQUIVALENCE (RMACH(2),LARGE(1))
50      EQUIVALENCE (RMACH(3),RIGHT(1))
51      EQUIVALENCE (RMACH(4),DIVER(1))
52      EQUIVALENCE (RMACH(5),LOG10(1))
53C
54C
55C     MACHINE CONSTANTS FOR IEEE ARITHMETIC MACHINES, SUCH AS THE AT&T
56C     3B SERIES, MOTOROLA 68000 BASED MACHINES (E.G. SUN 3 AND AT&T
57C     PC 7300), SUN SPARCSTATIONS, SILICON GRAPHCS WORKSTATIONS, HP
58C     9000 WORKSTATIONS, IBM RS/6000 WORKSTATIONS, AND 8087 BASED
59C     MICROS (E.G. IBM PC AND AT&T 6300).
60C
61C === MACHINE = ATT.3B
62C === MACHINE = ATT.6300
63C === MACHINE = ATT.7300
64C === MACHINE = HP.9000
65C === MACHINE = IBM.PC
66C === MACHINE = IBM.RS6000
67C === MACHINE = IEEE.MOST-SIG-BYTE-FIRST
68C === MACHINE = IEEE.LEAST-SIG-BYTE-FIRST
69C === MACHINE = SGI
70C === MACHINE = SUN
71C === MACHINE = 68000
72C === MACHINE = 8087
73C      DATA SMALL(1) /     8388608 /
74C      DATA LARGE(1) /  2139095039 /
75C      DATA RIGHT(1) /   864026624 /
76C      DATA DIVER(1) /   872415232 /
77C      DATA LOG10(1) /  1050288283 /
78C
79C     MACHINE CONSTANTS FOR SUN WORKSTATIONS.  f77 WITH -r8 OPTION.
80C     MACHINE CONSTANTS FOR IBM RS/6000 WORKSTATIONS WITH -qautodbl=dblpad.
81C
82C === MACHINE = IBM.RS6000.XLF-WITH-AUTODBL-OPTION
83C === MACHINE = SUN.F77-WITH-R8-OPTION
84C === MACHINE = SGI.ORIGIN.F77-WITH-R8-D16-OPTIONS
85C      DATA RMACH(1) / 2.2250738585072E-307 /
86C      DATA RMACH(2) / 1.7976931348623E308  /
87C      DATA RMACH(3) / 1.1102230246252E-16  /
88C      DATA RMACH(4) / 2.2204460492503E-16  /
89C      DATA RMACH(5) / 0.30102999566398     /
90C
91C     MACHINE CONSTANTS FOR AMDAHL MACHINES.
92C
93C === MACHINE = AMDAHL
94C      DATA SMALL(1) /    1048576 /
95C      DATA LARGE(1) / 2147483647 /
96C      DATA RIGHT(1) /  990904320 /
97C      DATA DIVER(1) / 1007681536 /
98C      DATA LOG10(1) / 1091781651 /
99C
100C     MACHINE CONSTANTS FOR THE BURROUGHS 1700 SYSTEM.
101C
102C === MACHINE = BURROUGHS.1700
103C      DATA RMACH(1) / Z400800000 /
104C      DATA RMACH(2) / Z5FFFFFFFF /
105C      DATA RMACH(3) / Z4E9800000 /
106C      DATA RMACH(4) / Z4EA800000 /
107C      DATA RMACH(5) / Z500E730E8 /
108C
109C     MACHINE CONSTANTS FOR THE BURROUGHS 5700/6700/7700 SYSTEMS.
110C
111C === MACHINE = BURROUGHS.5700
112C === MACHINE = BURROUGHS.6700
113C === MACHINE = BURROUGHS.7700
114C      DATA RMACH(1) / O1771000000000000 /
115C      DATA RMACH(2) / O0777777777777777 /
116C      DATA RMACH(3) / O1311000000000000 /
117C      DATA RMACH(4) / O1301000000000000 /
118C      DATA RMACH(5) / O1157163034761675 /
119C
120C     MACHINE CONSTANTS FOR THE CONVEX C1, C2, C3 SERIES (NATIVE MODE)
121C
122C === MACHINE = CONVEX
123C      DATA RMACH(1) / 2.9387360E-39 /
124C      DATA RMACH(2) / 1.7014117E+38 /
125C      DATA RMACH(3) / 5.9604645E-08 /
126C      DATA RMACH(4) / 1.1920929E-07 /
127C      DATA RMACH(5) / 3.0102999E-01 /
128C
129C     MACHINE CONSTANTS FOR THE CONVEX C1, C2, C3 (NATIVE MODE)
130C     WITH -P8 OPTION
131C
132C === MACHINE = CONVEX.P8
133C      DATA RMACH(1) / 5.562684646268007E-309 /
134C      DATA RMACH(2) / 8.988465674311577E+307 /
135C      DATA RMACH(3) / 1.110223024625157E-016 /
136C      DATA RMACH(4) / 2.220446049250313E-016 /
137C      DATA RMACH(5) / 3.010299956639812E-001 /
138C
139C     MACHINE CONSTANTS FOR THE CONVEX C1, C2, C3 (IEEE MODE)
140C
141C === MACHINE = CONVEX.IEEE
142C      DATA RMACH(1) / 1.1754945E-38 /
143C      DATA RMACH(2) / 3.4028234E+38 /
144C      DATA RMACH(3) / 5.9604645E-08 /
145C      DATA RMACH(4) / 1.1920929E-07 /
146C      DATA RMACH(5) / 3.0102999E-01 /
147C
148C     MACHINE CONSTANTS FOR THE CONVEX C1, C2, C3 (IEEE MODE)
149C     WITH -P8 OPTION
150C
151C === MACHINE = CONVEX.IEEE.P8
152C      DATA RMACH(1) / 2.225073858507202E-308 /
153C      DATA RMACH(2) / 1.797693134862315E+308 /
154C      DATA RMACH(3) / 1.110223024625157E-016 /
155C      DATA RMACH(4) / 2.220446049250313E-016 /
156C      DATA RMACH(5) / 3.010299956639812E-001 /
157C
158C     MACHINE CONSTANTS FOR THE CYBER 170/180 SERIES USING NOS (FTN5).
159C
160C === MACHINE = CYBER.170.NOS
161C === MACHINE = CYBER.180.NOS
162C      DATA RMACH(1) / O"00014000000000000000" /
163C      DATA RMACH(2) / O"37767777777777777777" /
164C      DATA RMACH(3) / O"16404000000000000000" /
165C      DATA RMACH(4) / O"16414000000000000000" /
166C      DATA RMACH(5) / O"17164642023241175720" /
167C
168C     MACHINE CONSTANTS FOR THE CDC 180 SERIES USING NOS/VE
169C
170C === MACHINE = CYBER.180.NOS/VE
171C      DATA RMACH(1) / Z"3001800000000000" /
172C      DATA RMACH(2) / Z"4FFEFFFFFFFFFFFE" /
173C      DATA RMACH(3) / Z"3FD2800000000000" /
174C      DATA RMACH(4) / Z"3FD3800000000000" /
175C      DATA RMACH(5) / Z"3FFF9A209A84FBCF" /
176C
177C     MACHINE CONSTANTS FOR THE CYBER 205
178C
179C === MACHINE = CYBER.205
180C      DATA RMACH(1) / X'9000400000000000' /
181C      DATA RMACH(2) / X'6FFF7FFFFFFFFFFF' /
182C      DATA RMACH(3) / X'FFA3400000000000' /
183C      DATA RMACH(4) / X'FFA4400000000000' /
184C      DATA RMACH(5) / X'FFD04D104D427DE8' /
185C
186C     MACHINE CONSTANTS FOR THE CDC 6000/7000 SERIES.
187C
188C === MACHINE = CDC.6000
189C === MACHINE = CDC.7000
190C      DATA RMACH(1) / 00014000000000000000B /
191C      DATA RMACH(2) / 37767777777777777777B /
192C      DATA RMACH(3) / 16404000000000000000B /
193C      DATA RMACH(4) / 16414000000000000000B /
194C      DATA RMACH(5) / 17164642023241175720B /
195C
196C     MACHINE CONSTANTS FOR THE CRAY 1, XMP, 2, AND 3.
197C
198C === MACHINE = CRAY.46-BIT-INTEGER
199C === MACHINE = CRAY.64-BIT-INTEGER
200C      DATA RMACH(1) / 200034000000000000000B /
201C      DATA RMACH(2) / 577767777777777777776B /
202C      DATA RMACH(3) / 377224000000000000000B /
203C      DATA RMACH(4) / 377234000000000000000B /
204C      DATA RMACH(5) / 377774642023241175720B /
205C
206C     MACHINE CONSTANTS FOR THE DATA GENERAL ECLIPSE S/200
207C
208C     NOTE - IT MAY BE APPROPRIATE TO INCLUDE THE FOLLOWING LINE -
209C     STATIC RMACH(5)
210C
211C === MACHINE = DATA_GENERAL.ECLIPSE.S/200
212C      DATA SMALL/20K,0/,LARGE/77777K,177777K/
213C      DATA RIGHT/35420K,0/,DIVER/36020K,0/
214C      DATA LOG10/40423K,42023K/
215C
216C     ELXSI 6400
217C
218C === MACHINE = ELSXI.6400
219C      DATA SMALL(1) / '00800000'X /
220C      DATA LARGE(1) / '7F7FFFFF'X /
221C      DATA RIGHT(1) / '33800000'X /
222C      DATA DIVER(1) / '34000000'X /
223C      DATA LOG10(1) / '3E9A209B'X /
224C
225C     MACHINE CONSTANTS FOR THE HARRIS 220
226C     MACHINE CONSTANTS FOR THE HARRIS SLASH 6 AND SLASH 7
227C
228C === MACHINE = HARRIS.220
229C === MACHINE = HARRIS.SLASH6
230C === MACHINE = HARRIS.SLASH7
231C      DATA SMALL(1),SMALL(2) / '20000000, '00000201 /
232C      DATA LARGE(1),LARGE(2) / '37777777, '00000177 /
233C      DATA RIGHT(1),RIGHT(2) / '20000000, '00000352 /
234C      DATA DIVER(1),DIVER(2) / '20000000, '00000353 /
235C      DATA LOG10(1),LOG10(2) / '23210115, '00000377 /
236C
237C     MACHINE CONSTANTS FOR THE HONEYWELL 600/6000 SERIES.
238C     MACHINE CONSTANTS FOR THE HONEYWELL DPS 8/70 SERIES.
239C
240C === MACHINE = HONEYWELL.600/6000
241C === MACHINE = HONEYWELL.DPS.8/70
242C      DATA RMACH(1) / O402400000000 /
243C      DATA RMACH(2) / O376777777777 /
244C      DATA RMACH(3) / O714400000000 /
245C      DATA RMACH(4) / O716400000000 /
246C      DATA RMACH(5) / O776464202324 /
247C
248C     MACHINE CONSTANTS FOR THE HP 2100
249C     3 WORD DOUBLE PRECISION WITH FTN4
250C
251C === MACHINE = HP.2100.3_WORD_DP
252C      DATA SMALL(1), SMALL(2) / 40000B,       1 /
253C      DATA LARGE(1), LARGE(2) / 77777B, 177776B /
254C      DATA RIGHT(1), RIGHT(2) / 40000B,    325B /
255C      DATA DIVER(1), DIVER(2) / 40000B,    327B /
256C      DATA LOG10(1), LOG10(2) / 46420B,  46777B /
257C
258C     MACHINE CONSTANTS FOR THE HP 2100
259C     4 WORD DOUBLE PRECISION WITH FTN4
260C
261C === MACHINE = HP.2100.4_WORD_DP
262C      DATA SMALL(1), SMALL(2) / 40000B,       1 /
263C      DATA LARGE91), LARGE(2) / 77777B, 177776B /
264C      DATA RIGHT(1), RIGHT(2) / 40000B,    325B /
265C      DATA DIVER(1), DIVER(2) / 40000B,    327B /
266C      DATA LOG10(1), LOG10(2) / 46420B,  46777B /
267C
268C     MACHINE CONSTANTS FOR THE IBM 360/370 SERIES,
269C     THE XEROX SIGMA 5/7/9, THE SEL SYSTEMS 85/86 AND
270C     THE INTERDATA 3230 AND INTERDATA 7/32.
271C
272C === MACHINE = IBM.360
273C === MACHINE = IBM.370
274C === MACHINE = XEROX.SIGMA.5
275C === MACHINE = XEROX.SIGMA.7
276C === MACHINE = XEROX.SIGMA.9
277C === MACHINE = SEL.85
278C === MACHINE = SEL.86
279C === MACHINE = INTERDATA.3230
280C === MACHINE = INTERDATA.7/32
281C      DATA RMACH(1) / Z00100000 /
282C      DATA RMACH(2) / Z7FFFFFFF /
283C      DATA RMACH(3) / Z3B100000 /
284C      DATA RMACH(4) / Z3C100000 /
285C      DATA RMACH(5) / Z41134413 /
286C
287C     MACHINE CONSTANTS FOR THE INTERDATA 8/32
288C     WITH THE UNIX SYSTEM FORTRAN 77 COMPILER.
289C
290C     FOR THE INTERDATA FORTRAN VII COMPILER REPLACE
291C     THE Z'S SPECIFYING HEX CONSTANTS WITH Y'S.
292C
293C === MACHINE = INTERDATA.8/32.UNIX
294C      DATA RMACH(1) / Z'00100000' /
295C      DATA RMACH(2) / Z'7EFFFFFF' /
296C      DATA RMACH(3) / Z'3B100000' /
297C      DATA RMACH(4) / Z'3C100000' /
298C      DATA RMACH(5) / Z'41134413' /
299C
300C     MACHINE CONSTANTS FOR THE PDP-10 (KA OR KI PROCESSOR).
301C
302C === MACHINE = PDP-10.KA
303C === MACHINE = PDP-10.KI
304C      DATA RMACH(1) / "000400000000 /
305C      DATA RMACH(2) / "377777777777 /
306C      DATA RMACH(3) / "146400000000 /
307C      DATA RMACH(4) / "147400000000 /
308C      DATA RMACH(5) / "177464202324 /
309C
310C     MACHINE CONSTANTS FOR PDP-11 FORTRAN SUPPORTING
311C     32-BIT INTEGERS (EXPRESSED IN INTEGER AND OCTAL).
312C
313C === MACHINE = PDP-11.32-BIT
314C      DATA SMALL(1) /    8388608 /
315C      DATA LARGE(1) / 2147483647 /
316C      DATA RIGHT(1) /  880803840 /
317C      DATA DIVER(1) /  889192448 /
318C      DATA LOG10(1) / 1067065499 /
319C
320C      DATA RMACH(1) / O00040000000 /
321C      DATA RMACH(2) / O17777777777 /
322C      DATA RMACH(3) / O06440000000 /
323C      DATA RMACH(4) / O06500000000 /
324C      DATA RMACH(5) / O07746420233 /
325C
326C     MACHINE CONSTANTS FOR PDP-11 FORTRAN SUPPORTING
327C     16-BIT INTEGERS  (EXPRESSED IN INTEGER AND OCTAL).
328C
329C === MACHINE = PDP-11.16-BIT
330C      DATA SMALL(1),SMALL(2) /   128,     0 /
331C      DATA LARGE(1),LARGE(2) / 32767,    -1 /
332C      DATA RIGHT(1),RIGHT(2) / 13440,     0 /
333C      DATA DIVER(1),DIVER(2) / 13568,     0 /
334C      DATA LOG10(1),LOG10(2) / 16282,  8347 /
335C
336C      DATA SMALL(1),SMALL(2) / O000200, O000000 /
337C      DATA LARGE(1),LARGE(2) / O077777, O177777 /
338C      DATA RIGHT(1),RIGHT(2) / O032200, O000000 /
339C      DATA DIVER(1),DIVER(2) / O032400, O000000 /
340C      DATA LOG10(1),LOG10(2) / O037632, O020233 /
341C
342C     MACHINE CONSTANTS FOR THE SEQUENT BALANCE 8000.
343C
344C === MACHINE = SEQUENT.BALANCE.8000
345C      DATA SMALL(1) / $00800000 /
346C      DATA LARGE(1) / $7F7FFFFF /
347C      DATA RIGHT(1) / $33800000 /
348C      DATA DIVER(1) / $34000000 /
349C      DATA LOG10(1) / $3E9A209B /
350C
351C     MACHINE CONSTANTS FOR THE UNIVAC 1100 SERIES.
352C
353C === MACHINE = UNIVAC.1100
354C      DATA RMACH(1) / O000400000000 /
355C      DATA RMACH(2) / O377777777777 /
356C      DATA RMACH(3) / O146400000000 /
357C      DATA RMACH(4) / O147400000000 /
358C      DATA RMACH(5) / O177464202324 /
359C
360C     MACHINE CONSTANTS FOR THE VAX 11/780
361C    (EXPRESSED IN INTEGER AND HEXADECIMAL)
362C  *** THE INTEGER FORMAT SHOULD BE OK FOR UNIX SYSTEMS***
363C
364C === MACHINE = VAX.11/780
365C      DATA SMALL(1) /       128 /
366C      DATA LARGE(1) /    -32769 /
367C      DATA RIGHT(1) /     13440 /
368C      DATA DIVER(1) /     13568 /
369C      DATA LOG10(1) / 547045274 /
370C
371C  ***THE HEX FORMAT BELOW MAY NOT BE SUITABLE FOR UNIX SYSTEMS***
372C
373C      DATA SMALL(1) / Z00000080 /
374C      DATA LARGE(1) / ZFFFF7FFF /
375C      DATA RIGHT(1) / Z00003480 /
376C      DATA DIVER(1) / Z00003500 /
377C      DATA LOG10(1) / Z209B3F9A /
378C
379C
380C***FIRST EXECUTABLE STATEMENT  R1MACH
381C
382      R1MACH = RMACH(I)
383      RETURN
384C
385      END
386