OpenLibm/amos/i1mach.f
2012-10-29 15:14:32 +05:30

113 lines
3.5 KiB
Fortran

*DECK I1MACH
INTEGER FUNCTION I1MACH(I)
C***BEGIN PROLOGUE I1MACH
C***DATE WRITTEN 750101 (YYMMDD)
C***REVISION DATE 890213 (YYMMDD)
C***CATEGORY NO. R1
C***KEYWORDS LIBRARY=SLATEC,TYPE=INTEGER(I1MACH-I),MACHINE CONSTANTS
C***AUTHOR FOX, P. A., (BELL LABS)
C HALL, A. D., (BELL LABS)
C SCHRYER, N. L., (BELL LABS)
C***PURPOSE Returns integer machine dependent constants
C***DESCRIPTION
C
C I1MACH can be used to obtain machine-dependent parameters
C for the local machine environment. It is a function
C subroutine with one (input) argument, and can be called
C as follows, for example
C
C K = I1MACH(I)
C
C where I=1,...,16. The (output) value of K above is
C determined by the (input) value of I. The results for
C various values of I are discussed below.
C
C I/O unit numbers.
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 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 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
C where 0 .LE. X(I) .LT. A for I=0,...,S-1.
C I1MACH( 7) = A, the base.
C I1MACH( 8) = S, the number of base-A digits.
C I1MACH( 9) = A**S - 1, the largest magnitude.
C
C Floating-Point Numbers.
C Assume floating-point numbers are represented in the T-digit,
C base-B form
C sign (B**E)*( (X(1)/B) + ... + (X(T)/B**T) )
C
C where 0 .LE. X(I) .LT. B for I=1,...,T,
C 0 .LT. X(1), and EMIN .LE. E .LE. EMAX.
C I1MACH(10) = B, the base.
C
C Single-Precision
C I1MACH(11) = T, the number of base-B digits.
C I1MACH(12) = EMIN, the smallest exponent E.
C I1MACH(13) = EMAX, the largest exponent E.
C
C Double-Precision
C I1MACH(14) = T, the number of base-B digits.
C I1MACH(15) = EMIN, the smallest exponent E.
C I1MACH(16) = EMAX, the largest exponent E.
C
C To alter this function for a particular environment,
C the desired set of DATA statements should be activated by
C removing the C from column 1. Also, the values of
C I1MACH(1) - I1MACH(4) should be checked for consistency
C with the local operating system.
C
C***REFERENCES FOX P.A., HALL A.D., SCHRYER N.L.,*FRAMEWORK FOR A
C PORTABLE LIBRARY*, ACM TRANSACTIONS ON MATHEMATICAL
C SOFTWARE, VOL. 4, NO. 2, JUNE 1978, PP. 177-188.
C***ROUTINES CALLED (NONE)
C***END PROLOGUE I1MACH
C
INTEGER IMACH(16),OUTPUT
SAVE IMACH
EQUIVALENCE (IMACH(4),OUTPUT)
C
C MACHINE CONSTANTS FOR THE IBM PC
C
DATA IMACH( 1) / 5 /
DATA IMACH( 2) / 6 /
DATA IMACH( 3) / 0 /
DATA IMACH( 4) / 0 /
DATA IMACH( 5) / 32 /
DATA IMACH( 6) / 4 /
DATA IMACH( 7) / 2 /
DATA IMACH( 8) / 31 /
DATA IMACH( 9) / 2147483647 /
DATA IMACH(10) / 2 /
DATA IMACH(11) / 24 /
DATA IMACH(12) / -125 /
DATA IMACH(13) / 127 /
DATA IMACH(14) / 53 /
DATA IMACH(15) / -1021 /
DATA IMACH(16) / 1023 /
C
C***FIRST EXECUTABLE STATEMENT I1MACH
IF (I .LT. 1 .OR. I .GT. 16) GO TO 10
C
I1MACH = IMACH(I)
RETURN
C
10 CONTINUE
WRITE (UNIT = OUTPUT, FMT = 9000)
9000 FORMAT ('1ERROR 1 IN I1MACH - I OUT OF BOUNDS')
C
C CALL FDUMP
C
C
STOP
END