--- ipmpar.c.orig Tue Sep 8 14:19:45 1998 +++ ipmpar.c Tue Sep 8 14:11:24 1998 @@ -1,426 +1,24 @@ -int ipmpar(int*); -/* ------------------------------------------------------------------------ - - IPMPAR PROVIDES THE INTEGER MACHINE CONSTANTS FOR THE COMPUTER - THAT IS USED. IT IS ASSUMED THAT THE ARGUMENT I IS AN INTEGER - HAVING ONE OF THE VALUES 1-10. IPMPAR(I) HAS THE VALUE ... - - INTEGERS. - - ASSUME INTEGERS ARE REPRESENTED IN THE N-DIGIT, BASE-A FORM - - SIGN ( X(N-1)*A**(N-1) + ... + X(1)*A + X(0) ) - - WHERE 0 .LE. X(I) .LT. A FOR I=0,...,N-1. - - IPMPAR(1) = A, THE BASE. - - IPMPAR(2) = N, THE NUMBER OF BASE-A DIGITS. - - IPMPAR(3) = A**N - 1, THE LARGEST MAGNITUDE. - - FLOATING-POINT NUMBERS. - - IT IS ASSUMED THAT THE SINGLE AND DOUBLE PRECISION FLOATING - POINT ARITHMETICS HAVE THE SAME BASE, SAY B, AND THAT THE - NONZERO NUMBERS ARE REPRESENTED IN THE FORM - - SIGN (B**E) * (X(1)/B + ... + X(M)/B**M) - - WHERE X(I) = 0,1,...,B-1 FOR I=1,...,M, - X(1) .GE. 1, AND EMIN .LE. E .LE. EMAX. - - IPMPAR(4) = B, THE BASE. - - SINGLE-PRECISION - - IPMPAR(5) = M, THE NUMBER OF BASE-B DIGITS. - - IPMPAR(6) = EMIN, THE SMALLEST EXPONENT E. - - IPMPAR(7) = EMAX, THE LARGEST EXPONENT E. - - DOUBLE-PRECISION - - IPMPAR(8) = M, THE NUMBER OF BASE-B DIGITS. - - IPMPAR(9) = EMIN, THE SMALLEST EXPONENT E. - - IPMPAR(10) = EMAX, THE LARGEST EXPONENT E. - ------------------------------------------------------------------------ - - TO DEFINE THIS FUNCTION FOR THE COMPUTER BEING USED REMOVE - THE COMMENT DELIMITORS FROM THE DEFINITIONS DIRECTLY BELOW THE NAME - OF THE MACHINE - ------------------------------------------------------------------------ - - IPMPAR IS AN ADAPTATION OF THE FUNCTION I1MACH, WRITTEN BY - P.A. FOX, A.D. HALL, AND N.L. SCHRYER (BELL LABORATORIES). - IPMPAR WAS FORMED BY A.H. MORRIS (NSWC). THE CONSTANTS ARE - FROM BELL LABORATORIES, NSWC, AND OTHER SOURCES. - ------------------------------------------------------------------------ - .. Scalar Arguments .. -*/ -int ipmpar(int *i) -{ -static int imach[11]; -static int ipmpar; -/* MACHINE CONSTANTS FOR AMDAHL MACHINES. */ -/* - imach[1] = 2; - imach[2] = 31; - imach[3] = 2147483647; - imach[4] = 16; - imach[5] = 6; - imach[6] = -64; - imach[7] = 63; - imach[8] = 14; - imach[9] = -64; - imach[10] = 63; -*/ -/* MACHINE CONSTANTS FOR THE AT&T 3B SERIES, AT&T - PC 7300, AND AT&T 6300. */ -/* - imach[1] = 2; - imach[2] = 31; - imach[3] = 2147483647; - imach[4] = 2; - imach[5] = 24; - imach[6] = -125; - imach[7] = 128; - imach[8] = 53; - imach[9] = -1021; - imach[10] = 1024; -*/ -/* MACHINE CONSTANTS FOR THE BURROUGHS 1700 SYSTEM. */ -/* - imach[1] = 2; - imach[2] = 33; - imach[3] = 8589934591; - imach[4] = 2; - imach[5] = 24; - imach[6] = -256; - imach[7] = 255; - imach[8] = 60; - imach[9] = -256; - imach[10] = 255; -*/ -/* MACHINE CONSTANTS FOR THE BURROUGHS 5700 SYSTEM. */ -/* - imach[1] = 2; - imach[2] = 39; - imach[3] = 549755813887; - imach[4] = 8; - imach[5] = 13; - imach[6] = -50; - imach[7] = 76; - imach[8] = 26; - imach[9] = -50; - imach[10] = 76; -*/ -/* MACHINE CONSTANTS FOR THE BURROUGHS 6700/7700 SYSTEMS. */ -/* - imach[1] = 2; - imach[2] = 39; - imach[3] = 549755813887; - imach[4] = 8; - imach[5] = 13; - imach[6] = -50; - imach[7] = 76; - imach[8] = 26; - imach[9] = -32754; - imach[10] = 32780; -*/ -/* MACHINE CONSTANTS FOR THE CDC 6000/7000 SERIES - 60 BIT ARITHMETIC, AND THE CDC CYBER 995 64 BIT - ARITHMETIC (NOS OPERATING SYSTEM). */ -/* - imach[1] = 2; - imach[2] = 48; - imach[3] = 281474976710655; - imach[4] = 2; - imach[5] = 48; - imach[6] = -974; - imach[7] = 1070; - imach[8] = 95; - imach[9] = -926; - imach[10] = 1070; -*/ -/* MACHINE CONSTANTS FOR THE CDC CYBER 995 64 BIT - ARITHMETIC (NOS/VE OPERATING SYSTEM). */ -/* - imach[1] = 2; - imach[2] = 63; - imach[3] = 9223372036854775807; - imach[4] = 2; - imach[5] = 48; - imach[6] = -4096; - imach[7] = 4095; - imach[8] = 96; - imach[9] = -4096; - imach[10] = 4095; -*/ -/* MACHINE CONSTANTS FOR THE CRAY 1, XMP, 2, AND 3. */ -/* - imach[1] = 2; - imach[2] = 63; - imach[3] = 9223372036854775807; - imach[4] = 2; - imach[5] = 47; - imach[6] = -8189; - imach[7] = 8190; - imach[8] = 94; - imach[9] = -8099; - imach[10] = 8190; -*/ -/* MACHINE CONSTANTS FOR THE DATA GENERAL ECLIPSE S/200. */ -/* - imach[1] = 2; - imach[2] = 15; - imach[3] = 32767; - imach[4] = 16; - imach[5] = 6; - imach[6] = -64; - imach[7] = 63; - imach[8] = 14; - imach[9] = -64; - imach[10] = 63; -*/ -/* MACHINE CONSTANTS FOR THE HARRIS 220. */ -/* - imach[1] = 2; - imach[2] = 23; - imach[3] = 8388607; - imach[4] = 2; - imach[5] = 23; - imach[6] = -127; - imach[7] = 127; - imach[8] = 38; - imach[9] = -127; - imach[10] = 127; -*/ -/* MACHINE CONSTANTS FOR THE HONEYWELL 600/6000 - AND DPS 8/70 SERIES. */ -/* - imach[1] = 2; - imach[2] = 35; - imach[3] = 34359738367; - imach[4] = 2; - imach[5] = 27; - imach[6] = -127; - imach[7] = 127; - imach[8] = 63; - imach[9] = -127; - imach[10] = 127; -*/ -/* MACHINE CONSTANTS FOR THE HP 2100 - 3 WORD DOUBLE PRECISION OPTION WITH FTN4 */ -/* - imach[1] = 2; - imach[2] = 15; - imach[3] = 32767; - imach[4] = 2; - imach[5] = 23; - imach[6] = -128; - imach[7] = 127; - imach[8] = 39; - imach[9] = -128; - imach[10] = 127; -*/ -/* MACHINE CONSTANTS FOR THE HP 2100 - 4 WORD DOUBLE PRECISION OPTION WITH FTN4 */ -/* - imach[1] = 2; - imach[2] = 15; - imach[3] = 32767; - imach[4] = 2; - imach[5] = 23; - imach[6] = -128; - imach[7] = 127; - imach[8] = 55; - imach[9] = -128; - imach[10] = 127; -*/ -/* MACHINE CONSTANTS FOR THE HP 9000. */ -/* - imach[1] = 2; - imach[2] = 31; - imach[3] = 2147483647; - imach[4] = 2; - imach[5] = 24; - imach[6] = -126; - imach[7] = 128; - imach[8] = 53; - imach[9] = -1021; - imach[10] = 1024; -*/ -/* MACHINE CONSTANTS FOR THE IBM 360/370 SERIES, - THE ICL 2900, THE ITEL AS/6, THE XEROX SIGMA - 5/7/9 AND THE SEL SYSTEMS 85/86. */ -/* - imach[1] = 2; - imach[2] = 31; - imach[3] = 2147483647; - imach[4] = 16; - imach[5] = 6; - imach[6] = -64; - imach[7] = 63; - imach[8] = 14; - imach[9] = -64; - imach[10] = 63; -*/ -/* MACHINE CONSTANTS FOR THE IBM PC. */ -/* - imach[1] = 2; - imach[2] = 31; - imach[3] = 2147483647; - imach[4] = 2; - imach[5] = 24; - imach[6] = -125; - imach[7] = 128; - imach[8] = 53; - imach[9] = -1021; - imach[10] = 1024; -*/ -/* MACHINE CONSTANTS FOR THE MACINTOSH II - ABSOFT - MACFORTRAN II. */ -/* - imach[1] = 2; - imach[2] = 31; - imach[3] = 2147483647; - imach[4] = 2; - imach[5] = 24; - imach[6] = -125; - imach[7] = 128; - imach[8] = 53; - imach[9] = -1021; - imach[10] = 1024; -*/ -/* MACHINE CONSTANTS FOR THE MICROVAX - VMS FORTRAN. */ -/* - imach[1] = 2; - imach[2] = 31; - imach[3] = 2147483647; - imach[4] = 2; - imach[5] = 24; - imach[6] = -127; - imach[7] = 127; - imach[8] = 56; - imach[9] = -127; - imach[10] = 127; -*/ -/* MACHINE CONSTANTS FOR THE PDP-10 (KA PROCESSOR). */ -/* - imach[1] = 2; - imach[2] = 35; - imach[3] = 34359738367; - imach[4] = 2; - imach[5] = 27; - imach[6] = -128; - imach[7] = 127; - imach[8] = 54; - imach[9] = -101; - imach[10] = 127; -*/ -/* MACHINE CONSTANTS FOR THE PDP-10 (KI PROCESSOR). */ -/* - imach[1] = 2; - imach[2] = 35; - imach[3] = 34359738367; - imach[4] = 2; - imach[5] = 27; - imach[6] = -128; - imach[7] = 127; - imach[8] = 62; - imach[9] = -128; - imach[10] = 127; -*/ -/* MACHINE CONSTANTS FOR THE PDP-11 FORTRAN SUPPORTING - 32-BIT INTEGER ARITHMETIC. */ -/* - imach[1] = 2; - imach[2] = 31; - imach[3] = 2147483647; - imach[4] = 2; - imach[5] = 24; - imach[6] = -127; - imach[7] = 127; - imach[8] = 56; - imach[9] = -127; - imach[10] = 127; -*/ -/* MACHINE CONSTANTS FOR THE SEQUENT BALANCE 8000. */ -/* - imach[1] = 2; - imach[2] = 31; - imach[3] = 2147483647; - imach[4] = 2; - imach[5] = 24; - imach[6] = -125; - imach[7] = 128; - imach[8] = 53; - imach[9] = -1021; - imach[10] = 1024; -*/ -/* MACHINE CONSTANTS FOR THE SILICON GRAPHICS IRIS-4D - SERIES (MIPS R3000 PROCESSOR). */ -/* - imach[1] = 2; - imach[2] = 31; - imach[3] = 2147483647; - imach[4] = 2; - imach[5] = 24; - imach[6] = -125; - imach[7] = 128; - imach[8] = 53; - imach[9] = -1021; - imach[10] = 1024; -*/ -/* MACHINE CONSTANTS FOR IEEE ARITHMETIC MACHINES, SUCH AS THE AT&T - 3B SERIES, MOTOROLA 68000 BASED MACHINES (E.G. SUN 3 AND AT&T - PC 7300), AND 8087 BASED MICROS (E.G. IBM PC AND AT&T 6300). */ - - imach[1] = 2; - imach[2] = 31; - imach[3] = 2147483647; - imach[4] = 2; - imach[5] = 24; - imach[6] = -125; - imach[7] = 128; - imach[8] = 53; - imach[9] = -1021; - imach[10] = 1024; +#include +#include -/* MACHINE CONSTANTS FOR THE UNIVAC 1100 SERIES. */ -/* - imach[1] = 2; - imach[2] = 35; - imach[3] = 34359738367; - imach[4] = 2; - imach[5] = 27; - imach[6] = -128; - imach[7] = 127; - imach[8] = 60; - imach[9] = -1024; - imach[10] = 1023; -*/ -/* MACHINE CONSTANTS FOR THE VAX 11/780. */ -/* - imach[1] = 2; - imach[2] = 31; - imach[3] = 2147483647; - imach[4] = 2; - imach[5] = 24; - imach[6] = -127; - imach[7] = 127; - imach[8] = 56; - imach[9] = -127; - imach[10] = 127; -*/ - ipmpar = imach[*i]; - return ipmpar; +int ipmpar( int *i) +{ + static int imach[11] = { + 0, /* dummy zeroth index */ + /* integers */ + 2, /* base; you are on the binary machine, aren't you? */ + sizeof(int)*(CHAR_BIT)-1, + INT_MAX, + /* all floats */ + FLT_RADIX, + /* single precision floats */ + FLT_MANT_DIG, + FLT_MIN_EXP, + FLT_MAX_EXP, + /* double precision floats */ + DBL_MANT_DIG, + DBL_MIN_EXP, + DBL_MAX_EXP, + }; + return imach[*i]; }