c MACHINESGI.F 18 June 1993 c function d1mach(i) c c*********************************************************************** c c D1MACH returns double precision machine constants. c c Assuming that the internal representation of a double precision number is c in base B, with T the number of base-B digits in the mantissa, and EMIN the c smallest possible exponent and EMAX the largest possible exponent, then c c D1MACH(1) = B**(EMIN-1), the smallest positive magnitude. c D1MACH(2) = B**EMAX*(1-B**(-T)), the largest magnitude. c D1MACH(3) = B**(-T), the smallest relative spacing. c D1MACH(4) = B**(1-T), the largest relative spacing. c D1MACH(5) = log10(B). c c To alter this function for a particular environment, the desired set of DATA c statements should be activated by removing the C from column 1. On rare c machines, a STATIC statement may need to be added, but probably more systems c prohibit than require it. c c For IEEE-arithmetic machines (binary standard), one of the first two sets of c constants below should be appropriate. c c Where possible, octal or hexadecimal constants have been used to specify the c constants exactly, which has in some cases required the use of EQUIVALENCED c integer arrays. c double precision d1mach integer diver(4) double precision dmach(5) integer i integer large(4) integer log10(4) integer right(4) integer small(4) c equivalence (dmach(1),small(1)) equivalence (dmach(2),large(1)) equivalence (dmach(3),right(1)) equivalence (dmach(4),diver(1)) equivalence (dmach(5),log10(1)) c c IEEE arithmetic machines, such as the AT&T 3B series and c Motorola 68000 based machines such as the SUN 3 and AT&T PC c 7300, and the SGI Iris, in which the most significant byte is c stored first. c data small(1),small(2) / 1048576, 0 / data large(1),large(2) / 2146435071, -1 / data right(1),right(2) / 1017118720, 0 / data diver(1),diver(2) / 1018167296, 0 / data log10(1),log10(2) / 1070810131, 1352628735 / c c IEEE arithmetic machines and 8087-based micros, such as the IBM PC, c AT&T 6300, DEC PMAX, DEC ALPHA, NEXT, in which the most c significant byte is stored last. c c data small(1),small(2) / 0, 1048576 / c data large(1),large(2) / -1, 2146435071 / c data right(1),right(2) / 0, 1017118720 / c data diver(1),diver(2) / 0, 1018167296 / c data log10(1),log10(2) / 1352628735, 1070810131 / c c ALLIANT FX/8 UNIX FORTRAN compiler. c c data dmach(1) / 2.22507385850721D-308 / c data dmach(2) / 1.79769313486231D+308 / c data dmach(3) / 1.1101827117665D-16 / c data dmach(4) / 2.2203654423533D-16 / c data dmach(5) / 3.01029995663981E-1 / c c AMDAHL machines. c c data small(1),small(2) / 1048576, 0 / c data large(1),large(2) / 2147483647, -1 / c data right(1),right(2) / 856686592, 0 / c data diver(1),diver(2) / 873463808, 0 / c data log10(1),log10(2) / 1091781651, 1352628735 / c c BURROUGHS 1700 system. c c data small(1) / ZC00800000 / c data small(2) / Z000000000 / c c data large(1) / ZDFFFFFFFF / c data large(2) / ZFFFFFFFFF / c c data right(1) / ZCC5800000 / c data right(2) / Z000000000 / c c data diver(1) / ZCC6800000 / c data diver(2) / Z000000000 / c c data log10(1) / ZD00E730E7 / c data log10(2) / ZC77800DC0 / c c BURROUGHS 5700 system. c c data small(1) / O1771000000000000 / c data small(2) / O0000000000000000 / c c data large(1) / O0777777777777777 / c data large(2) / O0007777777777777 / c c data right(1) / O1461000000000000 / c data right(2) / O0000000000000000 / c c data diver(1) / O1451000000000000 / c data diver(2) / O0000000000000000 / c c data log10(1) / O1157163034761674 / c data log10(2) / O0006677466732724 / c c BURROUGHS 6700/7700 systems. c c data small(1) / O1771000000000000 / c data small(2) / O7770000000000000 / c c data large(1) / O0777777777777777 / c data large(2) / O7777777777777777 / c c data right(1) / O1461000000000000 / c data right(2) / O0000000000000000 / c c data diver(1) / O1451000000000000 / c data diver(2) / O0000000000000000 / c c data log10(1) / O1157163034761674 / c data log10(2) / O0006677466732724 / c c CDC CYBER 170/180 series using NOS c c data small(1) / O"00604000000000000000" / c data small(2) / O"00000000000000000000" / c c data large(1) / O"37767777777777777777" / c data large(2) / O"37167777777777777777" / c c data right(1) / O"15604000000000000000" / c data right(2) / O"15000000000000000000" / c c data diver(1) / O"15614000000000000000" / c data diver(2) / O"15010000000000000000" / c c data log10(1) / O"17164642023241175717" / c data log10(2) / O"16367571421742254654" / c c CDC CYBER 170/180 series using NOS/VE c c data small(1) / Z"3001800000000000" / c data small(2) / Z"3001000000000000" / c c data large(1) / Z"4FFEFFFFFFFFFFFE" / c data large(2) / Z"4FFE000000000000" / c c data right(1) / Z"3FD2800000000000" / c data right(2) / Z"3FD2000000000000" / c c data diver(1) / Z"3FD3800000000000" / c data diver(2) / Z"3FD3000000000000" / c c data log10(1) / Z"3FFF9A209A84FBCF" / c data log10(2) / Z"3FFFF7988F8959AC" / c c CDC CYBER 200 series c c data small(1) / X'9000400000000000' / c data small(2) / X'8FD1000000000000' / c c data large(1) / X'6FFF7FFFFFFFFFFF' / c data large(2) / X'6FD07FFFFFFFFFFF' / c c data right(1) / X'FF74400000000000' / c data right(2) / X'FF45000000000000' / c c data diver(1) / X'FF75400000000000' / c data diver(2) / X'FF46000000000000' / c c data log10(1) / X'FFD04D104D427DE7' / c data log10(2) / X'FFA17DE623E2566A' / c c CDC 6000/7000 series using FTN4. c c data small(1) / 00564000000000000000B / c data small(2) / 00000000000000000000B / c c data large(1) / 37757777777777777777B / c data large(2) / 37157777777777777774B / c c data right(1) / 15624000000000000000B / c data right(2) / 00000000000000000000B / c c data diver(1) / 15634000000000000000B / c data diver(2) / 00000000000000000000B / c c data log10(1) / 17164642023241175717B / c data log10(2) / 16367571421742254654B / c c CDC 6000/7000 series using FTN5. c c data small(1) / O"00564000000000000000" / c data small(2) / O"00000000000000000000" / c c data large(1) / O"37757777777777777777" / c data large(2) / O"37157777777777777774" / c c data right(1) / O"15624000000000000000" / c data right(2) / O"00000000000000000000" / c c data diver(1) / O"15634000000000000000" / c data diver(2) / O"00000000000000000000" / c c data log10(1) / O"17164642023241175717" / c data log10(2) / O"16367571421742254654" / c c CONVEX C-1 c c data small(1),small(2) / '00100000'X, '00000000'X / c data large(1),large(2) / '7FFFFFFF'X, 'FFFFFFFF'X / c data right(1),right(2) / '3CC00000'X, '00000000'X / c data diver(1),diver(2) / '3CD00000'X, '00000000'X / c data log10(1),log10(2) / '3FF34413'X, '509F79FF'X / c c CONVEX C-120 (native mode) with or without -R8 option c c data dmach(1) / 5.562684646268007D-309 / c data dmach(2) / 8.988465674311577D+307 / c data dmach(3) / 1.110223024625157D-016 / c data dmach(4) / 2.220446049250313D-016 / c data dmach(5) / 3.010299956639812D-001 / c c CONVEX C-120 (IEEE mode) with or without -R8 option c c data dmach(1) / 2.225073858507202D-308 / c data dmach(2) / 1.797693134862315D+308 / c data dmach(3) / 1.110223024625157D-016 / c data dmach(4) / 2.220446049250313D-016 / c data dmach(5) / 3.010299956639812D-001 / c c CRAY 1, 2, XMP and YMP. c c data small(1) / 201354000000000000000B / c data small(2) / 000000000000000000000B / c c data large(1) / 577767777777777777777B / c data large(2) / 000007777777777777776B / c c data right(1) / 376434000000000000000B / c data right(2) / 000000000000000000000B / c c data diver(1) / 376444000000000000000B / c data diver(2) / 000000000000000000000B / c c data log10(1) / 377774642023241175717B / c data log10(2) / 000007571421742254654B / c c DATA GENERAL ECLIPSE S/200 c Note - It may be appropriate to include the line: STATIC dmach(5) c c data small /20K,3*0/ c data large /77777K,3*177777K/ c data right /31420K,3*0/ c data diver /32020K,3*0/ c data log10 /40423K,42023K,50237K,74776K/ c c ELXSI 6400, assuming REAL*8 is the default DOUBLE PRECISION type. c c data small(1), small(2) / '00100000'X,'00000000'X / c data large(1), large(2) / '7FEFFFFF'X,'FFFFFFFF'X / c data right(1), right(2) / '3CB00000'X,'00000000'X / c data diver(1), diver(2) / '3CC00000'X,'00000000'X / c data log10(1), diver(2) / '3FD34413'X,'509F79FF'X / c c HARRIS 220 c c data small(1),small(2) / '20000000, '00000201 / c data large(1),large(2) / '37777777, '37777577 / c data right(1),right(2) / '20000000, '00000333 / c data diver(1),diver(2) / '20000000, '00000334 / c data log10(1),log10(2) / '23210115, '10237777 / c c HARRIS SLASH 6 and SLASH 7 c c data small(1),small(2) / '20000000, '00000201 / c data large(1),large(2) / '37777777, '37777577 / c data right(1),right(2) / '20000000, '00000333 / c data diver(1),diver(2) / '20000000, '00000334 / c data log10(1),log10(2) / '23210115, '10237777 / c c HONEYWELL DPS 8/70 and 600/6000 series. c c data small(1),small(2) / O402400000000, O000000000000 / c data large(1),large(2) / O376777777777, O777777777777 / c data right(1),right(2) / O604400000000, O000000000000 / c data diver(1),diver(2) / O606400000000, O000000000000 / c data log10(1),log10(2) / O776464202324, O117571775714 / c c HP 2100, three word double precision option with FTN4. c c data small(1), small(2), small(3) / 40000B, 0, 1 / c data large(1), large(2), large(3) / 77777B, 177777B, 177776B / c data right(1), right(2), right(3) / 40000B, 0, 265B / c data diver(1), diver(2), diver(3) / 40000B, 0, 276B / c data log10(1), log10(2), log10(3) / 46420B, 46502B, 77777B / c c HP 2100, four word double precision option with FTN4. c c data small(1), small(2) / 40000B, 0 / c data small(3), small(4) / 0, 1 / c data large(1), large(2) / 77777B, 177777B / c data large(3), large(4) / 177777B, 177776B / c data right(1), right(2) / 40000B, 0 / c data right(3), right(4) / 0, 225B / c data diver(1), diver(2) / 40000B, 0 / c data diver(3), diver(4) / 0, 227B / c data log10(1), log10(2) / 46420B, 46502B / c data log10(3), log10(4) / 76747B, 176377B / c c HP 9000 c c d1mach(1) = 2.8480954D-306 c d1mach(2) = 1.40444776D+306 c d1mach(3) = 2.22044605D-16 c d1mach(4) = 4.44089210D-16 c d1mach(5) = 3.01029996D-1 c c data small(1), small(2) / 00040000000B, 00000000000B / c data large(1), large(2) / 17737777777B, 37777777777B / c data right(1), right(2) / 07454000000B, 00000000000B / c data diver(1), diver(2) / 07460000000B, 00000000000B / c data log10(1), log10(2) / 07764642023B, 12047674777B / c c IBM 360/370 series, XEROX SIGMA 5/7/9, SEL SYSTEMS 85/86, PERKIN ELMER 3230, c and PERKIN ELMER (INTERDATA) 3230. c c data small(1),small(2) / Z00100000, Z00000000 / c data large(1),large(2) / Z7FFFFFFF, ZFFFFFFFF / c data right(1),right(2) / Z33100000, Z00000000 / c data diver(1),diver(2) / Z34100000, Z00000000 / c data log10(1),log10(2) / Z41134413, Z509F79FF / c c IBM PC - Microsoft FORTRAN c c data small(1), small(2) / #00000000, #00100000 / c data large(1), large(2) / #FFFFFFFF, #7FEFFFFF / c data right(1), right(2) / #00000000, #3CA00000 / c data diver(1), diver(2) / #00000000, #3CB00000 / c data log10(1), log10(2) / #509F79FF, #3FD34413 / c c IBM PC - Professional FORTRAN and Lahey FORTRAN c c data small(1), small(2) / Z'00000000', Z'00100000' / c data large(1), large(2) / Z'FFFFFFFF', Z'7FEFFFFF' / c data right(1), right(2) / Z'00000000', Z'3CA00000' / c data diver(1), diver(2) / Z'00000000', Z'3CB00000' / c data log10(1), log10(2) / Z'509F79FF', Z'3FD34413' / c c INTERDATA 8/32 with the UNIX system FORTRAN 77 compiler. c For the INTERDATA FORTRAN VII compiler, replace the Z's specifying hex c constants with Y's. c c data small(1),small(2) / Z'00100000', Z'00000000' / c data large(1),large(2) / Z'7EFFFFFF', Z'FFFFFFFF' / c data right(1),right(2) / Z'33100000', Z'00000000' / c data diver(1),diver(2) / Z'34100000', Z'00000000' / c data log10(1),log10(2) / Z'41134413', Z'509F79FF' / c c PDP-10 (KA processor). c c data small(1),small(2) / "033400000000, "000000000000 / c data large(1),large(2) / "377777777777, "344777777777 / c data right(1),right(2) / "113400000000, "000000000000 / c data diver(1),diver(2) / "114400000000, "000000000000 / c data log10(1),log10(2) / "177464202324, "144117571776 / c c PDP-10 (KI processor). c c data small(1),small(2) / "000400000000, "000000000000 / c data large(1),large(2) / "377777777777, "377777777777 / c data right(1),right(2) / "103400000000, "000000000000 / c data diver(1),diver(2) / "104400000000, "000000000000 / c data log10(1),log10(2) / "177464202324, "047674776746 / c c PDP-11 FORTRANS supporting 32-bit integers (integer version). c c data small(1),small(2) / 8388608, 0 / c data large(1),large(2) / 2147483647, -1 / c data right(1),right(2) / 612368384, 0 / c data diver(1),diver(2) / 620756992, 0 / c data log10(1),log10(2) / 1067065498, -2063872008 / c c PDP-11 FORTRANS supporting 32-bit integers (octal version) c c data small(1),small(2) / O00040000000, O00000000000 / c data large(1),large(2) / O17777777777, O37777777777 / c data right(1),right(2) / O04440000000, O00000000000 / c data diver(1),diver(2) / O04500000000, O00000000000 / c data log10(1),log10(2) / O07746420232, O20476747770 / c c PDP-11 FORTRANS supporting 16-bit integers (integer version). c c data small(1),small(2) / 128, 0 / c data small(3),small(4) / 0, 0 / c c data large(1),large(2) / 32767, -1 / c data large(3),large(4) / -1, -1 / c c data right(1),right(2) / 9344, 0 / c data right(3),right(4) / 0, 0 / c c data diver(1),diver(2) / 9472, 0 / c data diver(3),diver(4) / 0, 0 / c c data log10(1),log10(2) / 16282, 8346 / c data log10(3),log10(4) / -31493, -12296 / c c PDP-11 FORTRANS supporting 16-bit integers (octal version). c c data small(1),small(2) / O000200, O000000 / c data small(3),small(4) / O000000, O000000 / c c data large(1),large(2) / O077777, O177777 / c data large(3),large(4) / O177777, O177777 / c c data right(1),right(2) / O022200, O000000 / c data right(3),right(4) / O000000, O000000 / c c data diver(1),diver(2) / O022400, O000000 / c data diver(3),diver(4) / O000000, O000000 / c c data log10(1),log10(2) / O037632, O020232 / c data log10(3),log10(4) / O102373, O147770 / c c PRIME 50 series systems with 32-bit integers and 64V MODE instructions, c supplied by Igor Bray. c c data small(1),small(2) / :10000000000, :00000100001 / c data large(1),large(2) / :17777777777, :37777677775 / c data right(1),right(2) / :10000000000, :00000000122 / c data diver(1),diver(2) / :10000000000, :00000000123 / c data log10(1),log10(2) / :11504046501, :07674600177 / c c SEQUENT BALANCE 8000 c c data small(1),small(2) / $00000000, $00100000 / c data large(1),large(2) / $FFFFFFFF, $7FEFFFFF / c data right(1),right(2) / $00000000, $3CA00000 / c data diver(1),diver(2) / $00000000, $3CB00000 / c data log10(1),log10(2) / $509F79FF, $3FD34413 / c c SUN Microsystems UNIX F77 compiler. c c data dmach(1) / 2.22507385850720D-308 / c data dmach(2) / 1.79769313486231D+308 / c data dmach(3) / 1.1101827117665D-16 / c data dmach(4) / 2.2203654423533D-16 / c data dmach(5) / 3.01029995663981D-1 / c c SUN 3 (68881 or FPA) c c data small(1),small(2) / X'00100000', X'00000000' / c data large(1),large(2) / X'7FEFFFFF', X'FFFFFFFF' / c data right(1),right(2) / X'3CA00000', X'00000000' / c data diver(1),diver(2) / X'3CB00000', X'00000000' / c data log10(1),log10(2) / X'3FD34413', X'509F79FF' / c c UNIVAC 1100 series. c c data small(1),small(2) / O000040000000, O000000000000 / c data large(1),large(2) / O377777777777, O777777777777 / c data right(1),right(2) / O170540000000, O000000000000 / c data diver(1),diver(2) / O170640000000, O000000000000 / c data log10(1),log10(2) / O177746420232, O411757177572 / c c VAX/ULTRIX F77 compiler c c data small(1),small(2) / 128, 0 / c data large(1),large(2) / -32769, -1 / c data right(1),right(2) / 9344, 0 / c data diver(1),diver(2) / 9472, 0 / c data log10(1),log10(2) / 546979738, -805796613 / c c VAX/ULTRIX F77 compiler, G floating c c data small(1), small(2) / 16, 0 / c data large(1), large(2) / -32769, -1 / c data right(1), right(2) / 15552, 0 / c data diver(1), diver(2) / 15568, 0 / c data log10(1), log10(2) / 1142112243, 2046775455 / c c VAX-11 with FORTRAN IV-PLUS compiler c c data small(1),small(2) / Z00000080, Z00000000 / c data large(1),large(2) / ZFFFF7FFF, ZFFFFFFFF / c data right(1),right(2) / Z00002480, Z00000000 / c data diver(1),diver(2) / Z00002500, Z00000000 / c data log10(1),log10(2) / Z209A3F9A, ZCFF884FB / c c VAX/VMS version 2.2 c c data small(1),small(2) / '80'X, '0'X / c data large(1),large(2) / 'FFFF7FFF'X, 'FFFFFFFF'X / c data right(1),right(2) / '2480'X, '0'X / c data diver(1),diver(2) / '2500'X, '0'X / c data log10(1),log10(2) / '209A3F9A'X, 'CFF884FB'X / c c VAX/VMS 11/780 c c data small(1), small(2) / Z00000080, Z00000000 / c data large(1), large(2) / ZFFFF7FFF, ZFFFFFFFF / c data right(1), right(2) / Z00002480, Z00000000 / c data diver(1), diver(2) / Z00002500, Z00000000 / c data log10(1), log10(2) / Z209A3F9A, ZCFF884FB / c c VAX/VMS 11/780 (G-FLOATING) c c data small(1), small(2) / Z00000010, Z00000000 / c data large(1), large(2) / ZFFFF7FFF, ZFFFFFFFF / c data right(1), right(2) / Z00003CC0, Z00000000 / c data diver(1), diver(2) / Z00003CD0, Z00000000 / c data log10(1), log10(2) / Z44133FF3, Z79FF509F / c if(i.lt.1.or.i.gt.5)then write(*,*)'D1MACH - Error, I out of bounds:',i d1mach=0.0d0 stop else d1mach = dmach(i) endif return end function i1mach(i) c c*********************************************************************** c c I1MACH returns integer machine constants. c c I/O unit numbers. c c I1MACH(1) = the standard input unit. c I1MACH(2) = the standard output unit. c I1MACH(3) = the standard punch unit. c I1MACH(4) = the standard error message unit. c c Words. c c I1MACH(5) = the number of bits per integer storage unit. c I1MACH(6) = the number of characters per integer storage unit. c c Integers. c c Assume integers are represented in the S digit base A form: c c Sign * (X(S-1)*A**(S-1) + ... + X(1)*A + X(0)) c where 0<=X(I)