|
|
1.1 root 1: head 1.2;
2: access ;
3: symbols ;
4: locks bin:1.2;
5: comment @ * @;
6:
7:
8: 1.2
9: date 90.04.23.22.19.30; author bin; state Exp;
10: branches ;
11: next 1.1;
12:
13: 1.1
14: date 90.04.23.22.10.04; author bin; state Exp;
15: branches ;
16: next ;
17:
18:
19: desc
20: @Initial MWC RCS revision.
21: Renamed _pow10.c, used to be pow10.c.
22: @
23:
24:
25: 1.2
26: log
27: @steve 4/23/90
28: Replaced old COHERENT libc _pow10.c with modified version of MSDOS source.
29: The modifications are a conditionalization on IEEE; the range of DECVAX
30: exponents is much smaller than IEEE, so much of the big exponent table
31: is unnecessary for DECVAX.
32: @
33: text
34: @/*
35: * C general utilities library internals.
36: * _pow10()
37: * Compute 10.0^n.
38: * Assumes -319 <= DBL_MIN_10_EXP and DBL_MAX_10_EXP <= 319,
39: * which is true for IEEE-format doubles.
40: * Modified for MS-DOS from the standard ANSI library source.
41: */
42:
43: /*
44: * There are lots of ways to do this, with varying accuracy, size, and speed.
45: * This version is nonrecursive and fast but uses somewhat bulky tables.
46: * It does the common cases -16 < exp < 16 by table lookup with no fp arithmetic.
47: * It does 16 <= exp <= DBL_MAX_10_EXP with one fp multiply.
48: * It does DBL_MIN_10_EXP <= exp <= -16 with one fp divide.
49: */
50:
51: #include <math.h>
52:
53: #if IEEE
54: #define DBL_MAX_10_EXP 308
55: #define DBL_MIN_10_EXP -307
56: #else
57: #define DBL_MAX_10_EXP 38
58: #define DBL_MIN_10_EXP -38
59: #endif
60:
61: static const double powtab0[] = {
62: 1e0, 1e-1, 1e-2, 1e-3, 1e-4, 1e-5, 1e-6, 1e-7,
63: 1e-8, 1e-9, 1e-10, 1e-11, 1e-12, 1e-13, 1e-14, 1e-15
64: };
65:
66: static const double powtab1[] = {
67: 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7,
68: 1e8, 1e9, 1e10, 1e11, 1e12, 1e13, 1e14, 1e15
69: };
70:
71: static const double powtab2[] = {
72: #ifdef IEEE
73: 1e16, 1e32, 1e48, 1e64, 1e80, 1e96, 1e112, 1e128,
74: 1e144, 1e160, 1e176, 1e192, 1e208, 1e224, 1e240, 1e256,
75: 1e272, 1e288, 1e304
76: #else
77: 1e16, 1e32
78: #endif
79: };
80:
81: double
82: _pow10(exp) register int exp;
83: {
84: if (exp < 0) {
85: if ((exp = -exp) < 16)
86: return powtab0[exp];
87: else if (exp <= -DBL_MIN_10_EXP)
88: return powtab0[exp & 15] / powtab2[(exp >> 4) - 1];
89: else
90: return 0.0; /* exponent underflow */
91: }
92: else if (exp < 16)
93: return powtab1[exp];
94: else if (exp <= DBL_MAX_10_EXP)
95: return powtab1[exp & 15] * powtab2[(exp >> 4) - 1];
96: else
97: return HUGE_VAL; /* exponent overflow */
98: }
99: @
100:
101:
102: 1.1
103: log
104: @Initial revision
105: @
106: text
107: @d2 6
108: a7 3
109: * Compute 10**exp, as a double.
110: * Called from dtefg.c.
111: * This assumes that the exponent is in the range [-511,511].
112: d9 39
113: d49 1
114: a49 2
115: _pow10(exp)
116: register int exp;
117: a50 7
118: register double d;
119:
120: static readonly double _powtab[] = {
121: 1e0, 1e1, 1e2, 1e3, 1e4, 1e5,
122: 1e6, 1e7, 1e8, 1e9, 1e10, 1e11,
123: 1e12, 1e13, 1e14, 1e15 };
124:
125: d52 6
126: a57 1
127: return (1.0 / _pow10(-exp));
128: d59 6
129: a64 26
130: d = 1.0;
131: if (exp >= 256) {
132: exp -= 256;
133: d *= 1e256;
134: }
135: if (exp >= 128) {
136: exp -= 128;
137: d *= 1e128;
138: }
139: if (exp >= 64) {
140: exp -= 64;
141: d *= 1e64;
142: }
143: if (exp >= 32) {
144: exp -= 32;
145: d *= 1e32;
146: }
147: if (exp >= 16) {
148: exp -= 16;
149: d *= 1e16;
150: }
151: d *= _powtab[exp];
152: return (d);
153: /*
154: return (d * _powtab[ exp]);
155: */
156: @
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.