annotate libcruft/misc/machar.c @ 5171:dc706eb5be9f

[project @ 2005-03-01 18:01:54 by jwe]
author jwe
date Tue, 01 Mar 2005 18:01:54 +0000
parents 3486c62f2d62
children 66ec063e2f4f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2425
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
1 #ifdef HAVE_CONFIG_H
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
2 #include <config.h>
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
3 #endif
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
4
4605
c430e537efad [project @ 2003-11-13 04:46:25 by jwe]
jwe
parents: 4552
diff changeset
5 #include <float.h>
c430e537efad [project @ 2003-11-13 04:46:25 by jwe]
jwe
parents: 4552
diff changeset
6
2425
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
7 #include "f77-fcn.h"
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
8
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
9 /*
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
10
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
11 This file combines the single and double precision versions of machar,
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
12 selected by cc -DSP or cc -DDP. This feature provided by D. G. Hough,
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
13 August 3, 1988.
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
14
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
15 */
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
16
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
17 #ifdef SP
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
18 #define REAL float
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
19 #define ZERO 0.0
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
20 #define ONE 1.0
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
21 #define PREC "Single "
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
22 #define REALSIZE 1
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
23 #endif
2621
337a09dd1c06 [project @ 1997-01-24 21:49:41 by jwe]
jwe
parents: 2425
diff changeset
24
2425
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
25 #ifdef DP
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
26 #define REAL double
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
27 #define ZERO 0.0e0
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
28 #define ONE 1.0e0
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
29 #define PREC "Double "
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
30 #define REALSIZE 2
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
31 #endif
2621
337a09dd1c06 [project @ 1997-01-24 21:49:41 by jwe]
jwe
parents: 2425
diff changeset
32
2425
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
33 #include <math.h>
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
34 #include <stdio.h>
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
35
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
36 #define ABS(xxx) ((xxx>ZERO)?(xxx):(-xxx))
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
37
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
38 void
4971
3486c62f2d62 [project @ 2004-09-08 16:46:36 by jwe]
jwe
parents: 4605
diff changeset
39 rmachar(int *ibeta, int *it, int *irnd, int *ngrd, int *machep,
3486c62f2d62 [project @ 2004-09-08 16:46:36 by jwe]
jwe
parents: 4605
diff changeset
40 int *negep, int *iexp, int *minexp, int *maxexp, REAL *eps,
3486c62f2d62 [project @ 2004-09-08 16:46:36 by jwe]
jwe
parents: 4605
diff changeset
41 REAL *epsneg, REAL *xmin, REAL *xmax)
2425
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
42
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
43 /*
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
44
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
45 This subroutine is intended to determine the parameters of the
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
46 floating-point arithmetic system specified below. The
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
47 determination of the first three uses an extension of an algorithm
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
48 due to M. Malcolm, CACM 15 (1972), pp. 949-951, incorporating some,
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
49 but not all, of the improvements suggested by M. Gentleman and S.
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
50 Marovich, CACM 17 (1974), pp. 276-277. An earlier version of this
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
51 program was published in the book Software Manual for the
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
52 Elementary Functions by W. J. Cody and W. Waite, Prentice-Hall,
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
53 Englewood Cliffs, NJ, 1980. The present program is a
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
54 translation of the Fortran 77 program in W. J. Cody, "MACHAR:
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
55 A subroutine to dynamically determine machine parameters".
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
56 TOMS (14), 1988.
2621
337a09dd1c06 [project @ 1997-01-24 21:49:41 by jwe]
jwe
parents: 2425
diff changeset
57
2425
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
58 Parameter values reported are as follows:
2621
337a09dd1c06 [project @ 1997-01-24 21:49:41 by jwe]
jwe
parents: 2425
diff changeset
59
2425
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
60 ibeta - the radix for the floating-point representation
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
61 it - the number of base ibeta digits in the floating-point
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
62 significand
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
63 irnd - 0 if floating-point addition chops
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
64 1 if floating-point addition rounds, but not in the
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
65 IEEE style
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
66 2 if floating-point addition rounds in the IEEE style
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
67 3 if floating-point addition chops, and there is
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
68 partial underflow
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
69 4 if floating-point addition rounds, but not in the
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
70 IEEE style, and there is partial underflow
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
71 5 if floating-point addition rounds in the IEEE style,
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
72 and there is partial underflow
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
73 ngrd - the number of guard digits for multiplication with
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
74 truncating arithmetic. It is
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
75 0 if floating-point arithmetic rounds, or if it
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
76 truncates and only it base ibeta digits
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
77 participate in the post-normalization shift of the
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
78 floating-point significand in multiplication;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
79 1 if floating-point arithmetic truncates and more
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
80 than it base ibeta digits participate in the
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
81 post-normalization shift of the floating-point
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
82 significand in multiplication.
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
83 machep - the largest negative integer such that
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
84 1.0+FLOAT(ibeta)**machep .NE. 1.0, except that
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
85 machep is bounded below by -(it+3)
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
86 negeps - the largest negative integer such that
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
87 1.0-FLOAT(ibeta)**negeps .NE. 1.0, except that
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
88 negeps is bounded below by -(it+3)
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
89 iexp - the number of bits (decimal places if ibeta = 10)
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
90 reserved for the representation of the exponent
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
91 (including the bias or sign) of a floating-point
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
92 number
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
93 minexp - the largest in magnitude negative integer such that
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
94 FLOAT(ibeta)**minexp is positive and normalized
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
95 maxexp - the smallest positive power of BETA that overflows
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
96 eps - the smallest positive floating-point number such
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
97 that 1.0+eps .NE. 1.0. In particular, if either
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
98 ibeta = 2 or IRND = 0, eps = FLOAT(ibeta)**machep.
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
99 Otherwise, eps = (FLOAT(ibeta)**machep)/2
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
100 epsneg - A small positive floating-point number such that
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
101 1.0-epsneg .NE. 1.0. In particular, if ibeta = 2
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
102 or IRND = 0, epsneg = FLOAT(ibeta)**negeps.
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
103 Otherwise, epsneg = (ibeta**negeps)/2. Because
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
104 negeps is bounded below by -(it+3), epsneg may not
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
105 be the smallest number that can alter 1.0 by
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
106 subtraction.
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
107 xmin - the smallest non-vanishing normalized floating-point
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
108 power of the radix, i.e., xmin = FLOAT(ibeta)**minexp
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
109 xmax - the largest finite floating-point number. In
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
110 particular xmax = (1.0-epsneg)*FLOAT(ibeta)**maxexp
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
111 Note - on some machines xmax will be only the
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
112 second, or perhaps third, largest number, being
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
113 too small by 1 or 2 units in the last digit of
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
114 the significand.
2621
337a09dd1c06 [project @ 1997-01-24 21:49:41 by jwe]
jwe
parents: 2425
diff changeset
115
2425
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
116 Latest revision - August 4, 1988
2621
337a09dd1c06 [project @ 1997-01-24 21:49:41 by jwe]
jwe
parents: 2425
diff changeset
117
2425
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
118 Author - W. J. Cody
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
119 Argonne National Laboratory
2621
337a09dd1c06 [project @ 1997-01-24 21:49:41 by jwe]
jwe
parents: 2425
diff changeset
120
2425
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
121 */
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
122
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
123 {
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
124 int i,iz,j,k;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
125 int mx,itmp,nxres;
5171
dc706eb5be9f [project @ 2005-03-01 18:01:54 by jwe]
jwe
parents: 4971
diff changeset
126 volatile REAL a,b,beta,betain,one,y,z,zero;
dc706eb5be9f [project @ 2005-03-01 18:01:54 by jwe]
jwe
parents: 4971
diff changeset
127 volatile REAL betah,two,t,tmp,tmpa,tmp1;
2425
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
128
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
129 (*irnd) = 1;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
130 one = (REAL)(*irnd);
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
131 two = one + one;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
132 a = two;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
133 b = a;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
134 zero = 0.0e0;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
135
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
136 /*
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
137 determine ibeta,beta ala malcolm
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
138 */
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
139
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
140 tmp = ((a+one)-a)-one;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
141
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
142 while (tmp == zero) {
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
143 a = a+a;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
144 tmp = a+one;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
145 tmp1 = tmp-a;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
146 tmp = tmp1-one;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
147 }
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
148
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
149 tmp = a+b;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
150 itmp = (int)(tmp-a);
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
151 while (itmp == 0) {
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
152 b = b+b;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
153 tmp = a+b;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
154 itmp = (int)(tmp-a);
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
155 }
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
156
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
157 *ibeta = itmp;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
158 beta = (REAL)(*ibeta);
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
159
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
160 /*
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
161 determine irnd, it
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
162 */
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
163
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
164 (*it) = 0;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
165 b = one;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
166 tmp = ((b+one)-b)-one;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
167
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
168 while (tmp == zero) {
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
169 *it = *it+1;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
170 b = b*beta;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
171 tmp = b+one;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
172 tmp1 = tmp-b;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
173 tmp = tmp1-one;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
174 }
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
175
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
176 *irnd = 0;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
177 betah = beta/two;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
178 tmp = a+betah;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
179 tmp1 = tmp-a;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
180 if (tmp1 != zero) *irnd = 1;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
181 tmpa = a+beta;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
182 tmp = tmpa+betah;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
183 if ((*irnd == 0) && (tmp-tmpa != zero)) *irnd = 2;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
184
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
185 /*
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
186 determine negep, epsneg
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
187 */
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
188
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
189 (*negep) = (*it) + 3;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
190 betain = one / beta;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
191 a = one;
2621
337a09dd1c06 [project @ 1997-01-24 21:49:41 by jwe]
jwe
parents: 2425
diff changeset
192
2425
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
193 for (i = 1; i<=(*negep); i++) {
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
194 a = a * betain;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
195 }
2621
337a09dd1c06 [project @ 1997-01-24 21:49:41 by jwe]
jwe
parents: 2425
diff changeset
196
2425
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
197 b = a;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
198 tmp = (one-a);
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
199 tmp = tmp-one;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
200
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
201 while (tmp == zero) {
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
202 a = a*beta;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
203 *negep = *negep-1;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
204 tmp1 = one-a;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
205 tmp = tmp1-one;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
206 }
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
207
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
208 (*negep) = -(*negep);
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
209 (*epsneg) = a;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
210
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
211 /*
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
212 determine machep, eps
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
213 */
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
214
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
215 (*machep) = -(*it) - 3;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
216 a = b;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
217 tmp = one+a;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
218
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
219 while (tmp-one == zero) {
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
220 a = a*beta;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
221 *machep = *machep+1;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
222 tmp = one+a;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
223 }
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
224
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
225 *eps = a;
2621
337a09dd1c06 [project @ 1997-01-24 21:49:41 by jwe]
jwe
parents: 2425
diff changeset
226
2425
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
227 /*
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
228 determine ngrd
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
229 */
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
230
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
231 (*ngrd) = 0;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
232 tmp = one+*eps;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
233 tmp = tmp*one;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
234 if (((*irnd) == 0) && (tmp-one) != zero) (*ngrd) = 1;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
235
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
236 /*
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
237 determine iexp, minexp, xmin
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
238
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
239 loop to determine largest i such that
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
240 (1/beta) ** (2**(i))
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
241 does not underflow.
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
242 exit from loop is signaled by an underflow.
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
243 */
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
244
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
245 i = 0;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
246 k = 1;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
247 z = betain;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
248 t = one+*eps;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
249 nxres = 0;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
250
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
251 for (;;) {
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
252 y = z;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
253 z = y * y;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
254
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
255 /*
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
256 check for underflow
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
257 */
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
258
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
259 a = z * one;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
260 tmp = z*t;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
261 if ((a+a == zero) || (ABS(z) > y)) break;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
262 tmp1 = tmp*betain;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
263 if (tmp1*beta == z) break;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
264 i = i + 1;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
265 k = k+k;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
266 }
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
267
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
268 /*
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
269 determine k such that (1/beta)**k does not underflow
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
270 first set k = 2 ** i
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
271 */
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
272
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
273 (*iexp) = i + 1;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
274 mx = k + k;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
275 if (*ibeta == 10) {
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
276
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
277 /*
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
278 for decimal machines only
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
279 */
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
280
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
281 (*iexp) = 2;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
282 iz = *ibeta;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
283 while (k >= iz) {
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
284 iz = iz * (*ibeta);
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
285 (*iexp) = (*iexp) + 1;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
286 }
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
287 mx = iz + iz - 1;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
288 }
2621
337a09dd1c06 [project @ 1997-01-24 21:49:41 by jwe]
jwe
parents: 2425
diff changeset
289
2425
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
290 /*
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
291 loop to determine minexp, xmin.
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
292 exit from loop is signaled by an underflow.
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
293 */
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
294
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
295 for (;;) {
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
296 (*xmin) = y;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
297 y = y * betain;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
298 a = y * one;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
299 tmp = y*t;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
300 tmp1 = a+a;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
301 if ((tmp1 == zero) || (ABS(y) >= (*xmin))) break;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
302 k = k + 1;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
303 tmp1 = tmp*betain;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
304 tmp1 = tmp1*beta;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
305
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
306 if ((tmp1 == y) && (tmp != y)) {
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
307 nxres = 3;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
308 *xmin = y;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
309 break;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
310 }
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
311
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
312 }
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
313
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
314 (*minexp) = -k;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
315
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
316 /*
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
317 determine maxexp, xmax
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
318 */
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
319
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
320 if ((mx <= k+k-3) && ((*ibeta) != 10)) {
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
321 mx = mx + mx;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
322 (*iexp) = (*iexp) + 1;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
323 }
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
324
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
325 (*maxexp) = mx + (*minexp);
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
326
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
327 /*
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
328 Adjust *irnd to reflect partial underflow.
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
329 */
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
330
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
331 (*irnd) = (*irnd)+nxres;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
332
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
333 /*
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
334 Adjust for IEEE style machines.
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
335 */
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
336
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
337 if ((*irnd) >= 2) (*maxexp) = (*maxexp)-2;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
338
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
339 /*
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
340 adjust for machines with implicit leading bit in binary
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
341 significand and machines with radix point at extreme
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
342 right of significand.
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
343 */
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
344
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
345 i = (*maxexp) + (*minexp);
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
346 if (((*ibeta) == 2) && (i == 0)) (*maxexp) = (*maxexp) - 1;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
347 if (i > 20) (*maxexp) = (*maxexp) - 1;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
348 if (a != y) (*maxexp) = (*maxexp) - 2;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
349 (*xmax) = one - (*epsneg);
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
350 tmp = (*xmax)*one;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
351 if (tmp != (*xmax)) (*xmax) = one - beta * (*epsneg);
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
352 (*xmax) = (*xmax) / (beta * beta * beta * (*xmin));
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
353 i = (*maxexp) + (*minexp) + 3;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
354 if (i > 0) {
2621
337a09dd1c06 [project @ 1997-01-24 21:49:41 by jwe]
jwe
parents: 2425
diff changeset
355
2425
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
356 for (j = 1; j<=i; j++ ) {
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
357 if ((*ibeta) == 2) (*xmax) = (*xmax) + (*xmax);
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
358 if ((*ibeta) != 2) (*xmax) = (*xmax) * beta;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
359 }
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
360
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
361 }
2621
337a09dd1c06 [project @ 1997-01-24 21:49:41 by jwe]
jwe
parents: 2425
diff changeset
362
2425
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
363 return;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
364
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
365 }
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
366
4552
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 3887
diff changeset
367 F77_RET_T
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 3887
diff changeset
368 F77_FUNC (machar, MACHAR) (REAL *xmin, REAL *xmax, REAL *epsneg,
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 3887
diff changeset
369 REAL *eps, REAL *log10_ibeta)
2425
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
370 {
4605
c430e537efad [project @ 2003-11-13 04:46:25 by jwe]
jwe
parents: 4552
diff changeset
371 #if defined (_CRAY)
c430e537efad [project @ 2003-11-13 04:46:25 by jwe]
jwe
parents: 4552
diff changeset
372
c430e537efad [project @ 2003-11-13 04:46:25 by jwe]
jwe
parents: 4552
diff changeset
373 // XXX FIXME XXX -- make machar work for the Cray too.
c430e537efad [project @ 2003-11-13 04:46:25 by jwe]
jwe
parents: 4552
diff changeset
374
c430e537efad [project @ 2003-11-13 04:46:25 by jwe]
jwe
parents: 4552
diff changeset
375 int ibeta = FLT_RADIX;
c430e537efad [project @ 2003-11-13 04:46:25 by jwe]
jwe
parents: 4552
diff changeset
376 *xmin = DBL_MIN;
c430e537efad [project @ 2003-11-13 04:46:25 by jwe]
jwe
parents: 4552
diff changeset
377 *xmax = DBL_MAX;
c430e537efad [project @ 2003-11-13 04:46:25 by jwe]
jwe
parents: 4552
diff changeset
378 *epsneg = DBL_EPSILON;
c430e537efad [project @ 2003-11-13 04:46:25 by jwe]
jwe
parents: 4552
diff changeset
379 *eps = DBL_EPSILON;
c430e537efad [project @ 2003-11-13 04:46:25 by jwe]
jwe
parents: 4552
diff changeset
380
c430e537efad [project @ 2003-11-13 04:46:25 by jwe]
jwe
parents: 4552
diff changeset
381 #else
c430e537efad [project @ 2003-11-13 04:46:25 by jwe]
jwe
parents: 4552
diff changeset
382
2425
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
383 int ibeta, iexp, irnd, it, machep, maxexp, minexp, negep, ngrd;
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
384
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
385 rmachar (&ibeta, &it, &irnd, &ngrd, &machep, &negep, &iexp, &minexp,
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
386 &maxexp, eps, epsneg, xmin, xmax);
4605
c430e537efad [project @ 2003-11-13 04:46:25 by jwe]
jwe
parents: 4552
diff changeset
387 #endif
2425
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
388
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
389 *log10_ibeta = log10 ((REAL) ibeta);
4552
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 3887
diff changeset
390
6f3382e08a52 [project @ 2003-10-27 20:38:02 by jwe]
jwe
parents: 3887
diff changeset
391 F77_RETURN (0)
2425
679068a18eee [project @ 1996-10-25 01:24:59 by jwe]
jwe
parents:
diff changeset
392 }