2329
|
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 |