comparison libcruft/blas/dmach.f @ 2329:30c606bec7a8

[project @ 1996-07-19 01:29:05 by jwe] Initial revision
author jwe
date Fri, 19 Jul 1996 01:29:55 +0000
parents
children
comparison
equal deleted inserted replaced
2328:b44c3b2a5fce 2329:30c606bec7a8
1 DOUBLE PRECISION FUNCTION DMACH(JOB)
2 INTEGER JOB
3 C
4 C SMACH COMPUTES MACHINE PARAMETERS OF FLOATING POINT
5 C ARITHMETIC FOR USE IN TESTING ONLY. NOT REQUIRED BY
6 C LINPACK PROPER.
7 C
8 C IF TROUBLE WITH AUTOMATIC COMPUTATION OF THESE QUANTITIES,
9 C THEY CAN BE SET BY DIRECT ASSIGNMENT STATEMENTS.
10 C ASSUME THE COMPUTER HAS
11 C
12 C B = BASE OF ARITHMETIC
13 C T = NUMBER OF BASE B DIGITS
14 C L = SMALLEST POSSIBLE EXPONENT
15 C U = LARGEST POSSIBLE EXPONENT
16 C
17 C THEN
18 C
19 C EPS = B**(1-T)
20 C TINY = 100.0*B**(-L+T)
21 C HUGE = 0.01*B**(U-T)
22 C
23 C DMACH SAME AS SMACH EXCEPT T, L, U APPLY TO
24 C DOUBLE PRECISION.
25 C
26 C CMACH SAME AS SMACH EXCEPT IF COMPLEX DIVISION
27 C IS DONE BY
28 C
29 C 1/(X+I*Y) = (X-I*Y)/(X**2+Y**2)
30 C
31 C THEN
32 C
33 C TINY = SQRT(TINY)
34 C HUGE = SQRT(HUGE)
35 C
36 C
37 C JOB IS 1, 2 OR 3 FOR EPSILON, TINY AND HUGE, RESPECTIVELY.
38 C
39 DOUBLE PRECISION EPS,TINY,HUGE,S
40 C
41 EPS = 1.0D0
42 10 EPS = EPS/2.0D0
43 S = 1.0D0 + EPS
44 IF (S .GT. 1.0D0) GO TO 10
45 EPS = 2.0D0*EPS
46 C
47 S = 1.0D0
48 20 TINY = S
49 S = S/16.0D0
50 IF (S*1.0 .NE. 0.0D0) GO TO 20
51 TINY = (TINY/EPS)*100.0
52 HUGE = 1.0D0/TINY
53 C
54 IF (JOB .EQ. 1) DMACH = EPS
55 IF (JOB .EQ. 2) DMACH = TINY
56 IF (JOB .EQ. 3) DMACH = HUGE
57 RETURN
58 END