strtod.c revision 1.1 1 1.1 kleink /* $NetBSD: strtod.c,v 1.1 2006/01/25 15:18:51 kleink Exp $ */
2 1.1 kleink
3 1.1 kleink /****************************************************************
4 1.1 kleink
5 1.1 kleink The author of this software is David M. Gay.
6 1.1 kleink
7 1.1 kleink Copyright (C) 1998-2001 by Lucent Technologies
8 1.1 kleink All Rights Reserved
9 1.1 kleink
10 1.1 kleink Permission to use, copy, modify, and distribute this software and
11 1.1 kleink its documentation for any purpose and without fee is hereby
12 1.1 kleink granted, provided that the above copyright notice appear in all
13 1.1 kleink copies and that both that the copyright notice and this
14 1.1 kleink permission notice and warranty disclaimer appear in supporting
15 1.1 kleink documentation, and that the name of Lucent or any of its entities
16 1.1 kleink not be used in advertising or publicity pertaining to
17 1.1 kleink distribution of the software without specific, written prior
18 1.1 kleink permission.
19 1.1 kleink
20 1.1 kleink LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
21 1.1 kleink INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
22 1.1 kleink IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
23 1.1 kleink SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
24 1.1 kleink WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
25 1.1 kleink IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
26 1.1 kleink ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
27 1.1 kleink THIS SOFTWARE.
28 1.1 kleink
29 1.1 kleink ****************************************************************/
30 1.1 kleink
31 1.1 kleink /* Please send bug reports to David M. Gay (dmg at acm dot org,
32 1.1 kleink * with " at " changed at "@" and " dot " changed to "."). */
33 1.1 kleink
34 1.1 kleink #include "gdtoaimp.h"
35 1.1 kleink #ifndef NO_FENV_H
36 1.1 kleink #include <fenv.h>
37 1.1 kleink #endif
38 1.1 kleink
39 1.1 kleink #ifdef USE_LOCALE
40 1.1 kleink #include "locale.h"
41 1.1 kleink #endif
42 1.1 kleink
43 1.1 kleink #ifdef IEEE_Arith
44 1.1 kleink #ifndef NO_IEEE_Scale
45 1.1 kleink #define Avoid_Underflow
46 1.1 kleink #undef tinytens
47 1.1 kleink /* The factor of 2^53 in tinytens[4] helps us avoid setting the underflow */
48 1.1 kleink /* flag unnecessarily. It leads to a song and dance at the end of strtod. */
49 1.1 kleink static CONST double tinytens[] = { 1e-16, 1e-32, 1e-64, 1e-128,
50 1.1 kleink 9007199254740992.e-256
51 1.1 kleink };
52 1.1 kleink #endif
53 1.1 kleink #endif
54 1.1 kleink
55 1.1 kleink #ifdef Honor_FLT_ROUNDS
56 1.1 kleink #define Rounding rounding
57 1.1 kleink #undef Check_FLT_ROUNDS
58 1.1 kleink #define Check_FLT_ROUNDS
59 1.1 kleink #else
60 1.1 kleink #define Rounding Flt_Rounds
61 1.1 kleink #endif
62 1.1 kleink
63 1.1 kleink double
64 1.1 kleink strtod
65 1.1 kleink #ifdef KR_headers
66 1.1 kleink (s00, se) CONST char *s00; char **se;
67 1.1 kleink #else
68 1.1 kleink (CONST char *s00, char **se)
69 1.1 kleink #endif
70 1.1 kleink {
71 1.1 kleink #ifdef Avoid_Underflow
72 1.1 kleink int scale;
73 1.1 kleink #endif
74 1.1 kleink int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, decpt, dsign,
75 1.1 kleink e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign;
76 1.1 kleink CONST char *s, *s0, *s1;
77 1.1 kleink double aadj, aadj1, adj, rv, rv0;
78 1.1 kleink Long L;
79 1.1 kleink ULong y, z;
80 1.1 kleink Bigint *bb, *bb1, *bd, *bd0, *bs, *delta;
81 1.1 kleink #ifdef SET_INEXACT
82 1.1 kleink int inexact, oldinexact;
83 1.1 kleink #endif
84 1.1 kleink #ifdef Honor_FLT_ROUNDS
85 1.1 kleink int rounding;
86 1.1 kleink #endif
87 1.1 kleink
88 1.1 kleink sign = nz0 = nz = decpt = 0;
89 1.1 kleink dval(rv) = 0.;
90 1.1 kleink for(s = s00;;s++) switch(*s) {
91 1.1 kleink case '-':
92 1.1 kleink sign = 1;
93 1.1 kleink /* no break */
94 1.1 kleink case '+':
95 1.1 kleink if (*++s)
96 1.1 kleink goto break2;
97 1.1 kleink /* no break */
98 1.1 kleink case 0:
99 1.1 kleink goto ret0;
100 1.1 kleink case '\t':
101 1.1 kleink case '\n':
102 1.1 kleink case '\v':
103 1.1 kleink case '\f':
104 1.1 kleink case '\r':
105 1.1 kleink case ' ':
106 1.1 kleink continue;
107 1.1 kleink default:
108 1.1 kleink goto break2;
109 1.1 kleink }
110 1.1 kleink break2:
111 1.1 kleink if (*s == '0') {
112 1.1 kleink #ifndef NO_HEX_FP
113 1.1 kleink {
114 1.1 kleink static FPI fpi = { 53, 1-1023-53+1, 2046-1023-53+1, 1, SI };
115 1.1 kleink Long exp;
116 1.1 kleink ULong bits[2];
117 1.1 kleink switch(s[1]) {
118 1.1 kleink case 'x':
119 1.1 kleink case 'X':
120 1.1 kleink {
121 1.1 kleink #if defined(FE_DOWNWARD) && defined(FE_TONEAREST) && defined(FE_TOWARDZERO) && defined(FE_UPWARD)
122 1.1 kleink FPI fpi1 = fpi;
123 1.1 kleink switch(fegetround()) {
124 1.1 kleink case FE_TOWARDZERO: fpi1.rounding = 0; break;
125 1.1 kleink case FE_UPWARD: fpi1.rounding = 2; break;
126 1.1 kleink case FE_DOWNWARD: fpi1.rounding = 3;
127 1.1 kleink }
128 1.1 kleink #else
129 1.1 kleink #define fpi1 fpi
130 1.1 kleink #endif
131 1.1 kleink switch((i = gethex(&s, &fpi1, &exp, &bb, sign)) & STRTOG_Retmask) {
132 1.1 kleink case STRTOG_NoNumber:
133 1.1 kleink s = s00;
134 1.1 kleink sign = 0;
135 1.1 kleink case STRTOG_Zero:
136 1.1 kleink break;
137 1.1 kleink default:
138 1.1 kleink if (bb) {
139 1.1 kleink copybits(bits, fpi.nbits, bb);
140 1.1 kleink Bfree(bb);
141 1.1 kleink }
142 1.1 kleink ULtod(((U*)&rv)->L, bits, exp, i);
143 1.1 kleink }}
144 1.1 kleink goto ret;
145 1.1 kleink }
146 1.1 kleink }
147 1.1 kleink #endif
148 1.1 kleink nz0 = 1;
149 1.1 kleink while(*++s == '0') ;
150 1.1 kleink if (!*s)
151 1.1 kleink goto ret;
152 1.1 kleink }
153 1.1 kleink s0 = s;
154 1.1 kleink y = z = 0;
155 1.1 kleink for(nd = nf = 0; (c = *s) >= '0' && c <= '9'; nd++, s++)
156 1.1 kleink if (nd < 9)
157 1.1 kleink y = 10*y + c - '0';
158 1.1 kleink else if (nd < 16)
159 1.1 kleink z = 10*z + c - '0';
160 1.1 kleink nd0 = nd;
161 1.1 kleink #ifdef USE_LOCALE
162 1.1 kleink if (c == *localeconv()->decimal_point)
163 1.1 kleink #else
164 1.1 kleink if (c == '.')
165 1.1 kleink #endif
166 1.1 kleink {
167 1.1 kleink decpt = 1;
168 1.1 kleink c = *++s;
169 1.1 kleink if (!nd) {
170 1.1 kleink for(; c == '0'; c = *++s)
171 1.1 kleink nz++;
172 1.1 kleink if (c > '0' && c <= '9') {
173 1.1 kleink s0 = s;
174 1.1 kleink nf += nz;
175 1.1 kleink nz = 0;
176 1.1 kleink goto have_dig;
177 1.1 kleink }
178 1.1 kleink goto dig_done;
179 1.1 kleink }
180 1.1 kleink for(; c >= '0' && c <= '9'; c = *++s) {
181 1.1 kleink have_dig:
182 1.1 kleink nz++;
183 1.1 kleink if (c -= '0') {
184 1.1 kleink nf += nz;
185 1.1 kleink for(i = 1; i < nz; i++)
186 1.1 kleink if (nd++ < 9)
187 1.1 kleink y *= 10;
188 1.1 kleink else if (nd <= DBL_DIG + 1)
189 1.1 kleink z *= 10;
190 1.1 kleink if (nd++ < 9)
191 1.1 kleink y = 10*y + c;
192 1.1 kleink else if (nd <= DBL_DIG + 1)
193 1.1 kleink z = 10*z + c;
194 1.1 kleink nz = 0;
195 1.1 kleink }
196 1.1 kleink }
197 1.1 kleink }
198 1.1 kleink dig_done:
199 1.1 kleink e = 0;
200 1.1 kleink if (c == 'e' || c == 'E') {
201 1.1 kleink if (!nd && !nz && !nz0) {
202 1.1 kleink goto ret0;
203 1.1 kleink }
204 1.1 kleink s00 = s;
205 1.1 kleink esign = 0;
206 1.1 kleink switch(c = *++s) {
207 1.1 kleink case '-':
208 1.1 kleink esign = 1;
209 1.1 kleink case '+':
210 1.1 kleink c = *++s;
211 1.1 kleink }
212 1.1 kleink if (c >= '0' && c <= '9') {
213 1.1 kleink while(c == '0')
214 1.1 kleink c = *++s;
215 1.1 kleink if (c > '0' && c <= '9') {
216 1.1 kleink L = c - '0';
217 1.1 kleink s1 = s;
218 1.1 kleink while((c = *++s) >= '0' && c <= '9')
219 1.1 kleink L = 10*L + c - '0';
220 1.1 kleink if (s - s1 > 8 || L > 19999)
221 1.1 kleink /* Avoid confusion from exponents
222 1.1 kleink * so large that e might overflow.
223 1.1 kleink */
224 1.1 kleink e = 19999; /* safe for 16 bit ints */
225 1.1 kleink else
226 1.1 kleink e = (int)L;
227 1.1 kleink if (esign)
228 1.1 kleink e = -e;
229 1.1 kleink }
230 1.1 kleink else
231 1.1 kleink e = 0;
232 1.1 kleink }
233 1.1 kleink else
234 1.1 kleink s = s00;
235 1.1 kleink }
236 1.1 kleink if (!nd) {
237 1.1 kleink if (!nz && !nz0) {
238 1.1 kleink #ifdef INFNAN_CHECK
239 1.1 kleink /* Check for Nan and Infinity */
240 1.1 kleink ULong bits[2];
241 1.1 kleink static FPI fpinan = /* only 52 explicit bits */
242 1.1 kleink { 52, 1-1023-53+1, 2046-1023-53+1, 1, SI };
243 1.1 kleink if (!decpt)
244 1.1 kleink switch(c) {
245 1.1 kleink case 'i':
246 1.1 kleink case 'I':
247 1.1 kleink if (match(&s,"nf")) {
248 1.1 kleink --s;
249 1.1 kleink if (!match(&s,"inity"))
250 1.1 kleink ++s;
251 1.1 kleink word0(rv) = 0x7ff00000;
252 1.1 kleink word1(rv) = 0;
253 1.1 kleink goto ret;
254 1.1 kleink }
255 1.1 kleink break;
256 1.1 kleink case 'n':
257 1.1 kleink case 'N':
258 1.1 kleink if (match(&s, "an")) {
259 1.1 kleink #ifndef No_Hex_NaN
260 1.1 kleink if (*s == '(' /*)*/
261 1.1 kleink && hexnan(&s, &fpinan, bits)
262 1.1 kleink == STRTOG_NaNbits) {
263 1.1 kleink word0(rv) = 0x7ff00000 | bits[1];
264 1.1 kleink word1(rv) = bits[0];
265 1.1 kleink }
266 1.1 kleink else {
267 1.1 kleink #endif
268 1.1 kleink word0(rv) = NAN_WORD0;
269 1.1 kleink word1(rv) = NAN_WORD1;
270 1.1 kleink #ifndef No_Hex_NaN
271 1.1 kleink }
272 1.1 kleink #endif
273 1.1 kleink goto ret;
274 1.1 kleink }
275 1.1 kleink }
276 1.1 kleink #endif /* INFNAN_CHECK */
277 1.1 kleink ret0:
278 1.1 kleink s = s00;
279 1.1 kleink sign = 0;
280 1.1 kleink }
281 1.1 kleink goto ret;
282 1.1 kleink }
283 1.1 kleink e1 = e -= nf;
284 1.1 kleink
285 1.1 kleink /* Now we have nd0 digits, starting at s0, followed by a
286 1.1 kleink * decimal point, followed by nd-nd0 digits. The number we're
287 1.1 kleink * after is the integer represented by those digits times
288 1.1 kleink * 10**e */
289 1.1 kleink
290 1.1 kleink if (!nd0)
291 1.1 kleink nd0 = nd;
292 1.1 kleink k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1;
293 1.1 kleink dval(rv) = y;
294 1.1 kleink if (k > 9) {
295 1.1 kleink #ifdef SET_INEXACT
296 1.1 kleink if (k > DBL_DIG)
297 1.1 kleink oldinexact = get_inexact();
298 1.1 kleink #endif
299 1.1 kleink dval(rv) = tens[k - 9] * dval(rv) + z;
300 1.1 kleink }
301 1.1 kleink bd0 = 0;
302 1.1 kleink if (nd <= DBL_DIG
303 1.1 kleink #ifndef RND_PRODQUOT
304 1.1 kleink #ifndef Honor_FLT_ROUNDS
305 1.1 kleink && Flt_Rounds == 1
306 1.1 kleink #endif
307 1.1 kleink #endif
308 1.1 kleink ) {
309 1.1 kleink if (!e)
310 1.1 kleink goto ret;
311 1.1 kleink if (e > 0) {
312 1.1 kleink if (e <= Ten_pmax) {
313 1.1 kleink #ifdef VAX
314 1.1 kleink goto vax_ovfl_check;
315 1.1 kleink #else
316 1.1 kleink #ifdef Honor_FLT_ROUNDS
317 1.1 kleink /* round correctly FLT_ROUNDS = 2 or 3 */
318 1.1 kleink if (sign) {
319 1.1 kleink rv = -rv;
320 1.1 kleink sign = 0;
321 1.1 kleink }
322 1.1 kleink #endif
323 1.1 kleink /* rv = */ rounded_product(dval(rv), tens[e]);
324 1.1 kleink goto ret;
325 1.1 kleink #endif
326 1.1 kleink }
327 1.1 kleink i = DBL_DIG - nd;
328 1.1 kleink if (e <= Ten_pmax + i) {
329 1.1 kleink /* A fancier test would sometimes let us do
330 1.1 kleink * this for larger i values.
331 1.1 kleink */
332 1.1 kleink #ifdef Honor_FLT_ROUNDS
333 1.1 kleink /* round correctly FLT_ROUNDS = 2 or 3 */
334 1.1 kleink if (sign) {
335 1.1 kleink rv = -rv;
336 1.1 kleink sign = 0;
337 1.1 kleink }
338 1.1 kleink #endif
339 1.1 kleink e -= i;
340 1.1 kleink dval(rv) *= tens[i];
341 1.1 kleink #ifdef VAX
342 1.1 kleink /* VAX exponent range is so narrow we must
343 1.1 kleink * worry about overflow here...
344 1.1 kleink */
345 1.1 kleink vax_ovfl_check:
346 1.1 kleink word0(rv) -= P*Exp_msk1;
347 1.1 kleink /* rv = */ rounded_product(dval(rv), tens[e]);
348 1.1 kleink if ((word0(rv) & Exp_mask)
349 1.1 kleink > Exp_msk1*(DBL_MAX_EXP+Bias-1-P))
350 1.1 kleink goto ovfl;
351 1.1 kleink word0(rv) += P*Exp_msk1;
352 1.1 kleink #else
353 1.1 kleink /* rv = */ rounded_product(dval(rv), tens[e]);
354 1.1 kleink #endif
355 1.1 kleink goto ret;
356 1.1 kleink }
357 1.1 kleink }
358 1.1 kleink #ifndef Inaccurate_Divide
359 1.1 kleink else if (e >= -Ten_pmax) {
360 1.1 kleink #ifdef Honor_FLT_ROUNDS
361 1.1 kleink /* round correctly FLT_ROUNDS = 2 or 3 */
362 1.1 kleink if (sign) {
363 1.1 kleink rv = -rv;
364 1.1 kleink sign = 0;
365 1.1 kleink }
366 1.1 kleink #endif
367 1.1 kleink /* rv = */ rounded_quotient(dval(rv), tens[-e]);
368 1.1 kleink goto ret;
369 1.1 kleink }
370 1.1 kleink #endif
371 1.1 kleink }
372 1.1 kleink e1 += nd - k;
373 1.1 kleink
374 1.1 kleink #ifdef IEEE_Arith
375 1.1 kleink #ifdef SET_INEXACT
376 1.1 kleink inexact = 1;
377 1.1 kleink if (k <= DBL_DIG)
378 1.1 kleink oldinexact = get_inexact();
379 1.1 kleink #endif
380 1.1 kleink #ifdef Avoid_Underflow
381 1.1 kleink scale = 0;
382 1.1 kleink #endif
383 1.1 kleink #ifdef Honor_FLT_ROUNDS
384 1.1 kleink if ((rounding = Flt_Rounds) >= 2) {
385 1.1 kleink if (sign)
386 1.1 kleink rounding = rounding == 2 ? 0 : 2;
387 1.1 kleink else
388 1.1 kleink if (rounding != 2)
389 1.1 kleink rounding = 0;
390 1.1 kleink }
391 1.1 kleink #endif
392 1.1 kleink #endif /*IEEE_Arith*/
393 1.1 kleink
394 1.1 kleink /* Get starting approximation = rv * 10**e1 */
395 1.1 kleink
396 1.1 kleink if (e1 > 0) {
397 1.1 kleink if ( (i = e1 & 15) !=0)
398 1.1 kleink dval(rv) *= tens[i];
399 1.1 kleink if (e1 &= ~15) {
400 1.1 kleink if (e1 > DBL_MAX_10_EXP) {
401 1.1 kleink ovfl:
402 1.1 kleink #ifndef NO_ERRNO
403 1.1 kleink errno = ERANGE;
404 1.1 kleink #endif
405 1.1 kleink /* Can't trust HUGE_VAL */
406 1.1 kleink #ifdef IEEE_Arith
407 1.1 kleink #ifdef Honor_FLT_ROUNDS
408 1.1 kleink switch(rounding) {
409 1.1 kleink case 0: /* toward 0 */
410 1.1 kleink case 3: /* toward -infinity */
411 1.1 kleink word0(rv) = Big0;
412 1.1 kleink word1(rv) = Big1;
413 1.1 kleink break;
414 1.1 kleink default:
415 1.1 kleink word0(rv) = Exp_mask;
416 1.1 kleink word1(rv) = 0;
417 1.1 kleink }
418 1.1 kleink #else /*Honor_FLT_ROUNDS*/
419 1.1 kleink word0(rv) = Exp_mask;
420 1.1 kleink word1(rv) = 0;
421 1.1 kleink #endif /*Honor_FLT_ROUNDS*/
422 1.1 kleink #ifdef SET_INEXACT
423 1.1 kleink /* set overflow bit */
424 1.1 kleink dval(rv0) = 1e300;
425 1.1 kleink dval(rv0) *= dval(rv0);
426 1.1 kleink #endif
427 1.1 kleink #else /*IEEE_Arith*/
428 1.1 kleink word0(rv) = Big0;
429 1.1 kleink word1(rv) = Big1;
430 1.1 kleink #endif /*IEEE_Arith*/
431 1.1 kleink if (bd0)
432 1.1 kleink goto retfree;
433 1.1 kleink goto ret;
434 1.1 kleink }
435 1.1 kleink e1 >>= 4;
436 1.1 kleink for(j = 0; e1 > 1; j++, e1 >>= 1)
437 1.1 kleink if (e1 & 1)
438 1.1 kleink dval(rv) *= bigtens[j];
439 1.1 kleink /* The last multiplication could overflow. */
440 1.1 kleink word0(rv) -= P*Exp_msk1;
441 1.1 kleink dval(rv) *= bigtens[j];
442 1.1 kleink if ((z = word0(rv) & Exp_mask)
443 1.1 kleink > Exp_msk1*(DBL_MAX_EXP+Bias-P))
444 1.1 kleink goto ovfl;
445 1.1 kleink if (z > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) {
446 1.1 kleink /* set to largest number */
447 1.1 kleink /* (Can't trust DBL_MAX) */
448 1.1 kleink word0(rv) = Big0;
449 1.1 kleink word1(rv) = Big1;
450 1.1 kleink }
451 1.1 kleink else
452 1.1 kleink word0(rv) += P*Exp_msk1;
453 1.1 kleink }
454 1.1 kleink }
455 1.1 kleink else if (e1 < 0) {
456 1.1 kleink e1 = -e1;
457 1.1 kleink if ( (i = e1 & 15) !=0)
458 1.1 kleink dval(rv) /= tens[i];
459 1.1 kleink if (e1 >>= 4) {
460 1.1 kleink if (e1 >= 1 << n_bigtens)
461 1.1 kleink goto undfl;
462 1.1 kleink #ifdef Avoid_Underflow
463 1.1 kleink if (e1 & Scale_Bit)
464 1.1 kleink scale = 2*P;
465 1.1 kleink for(j = 0; e1 > 0; j++, e1 >>= 1)
466 1.1 kleink if (e1 & 1)
467 1.1 kleink dval(rv) *= tinytens[j];
468 1.1 kleink if (scale && (j = 2*P + 1 - ((word0(rv) & Exp_mask)
469 1.1 kleink >> Exp_shift)) > 0) {
470 1.1 kleink /* scaled rv is denormal; zap j low bits */
471 1.1 kleink if (j >= 32) {
472 1.1 kleink word1(rv) = 0;
473 1.1 kleink if (j >= 53)
474 1.1 kleink word0(rv) = (P+2)*Exp_msk1;
475 1.1 kleink else
476 1.1 kleink word0(rv) &= 0xffffffff << j-32;
477 1.1 kleink }
478 1.1 kleink else
479 1.1 kleink word1(rv) &= 0xffffffff << j;
480 1.1 kleink }
481 1.1 kleink #else
482 1.1 kleink for(j = 0; e1 > 1; j++, e1 >>= 1)
483 1.1 kleink if (e1 & 1)
484 1.1 kleink dval(rv) *= tinytens[j];
485 1.1 kleink /* The last multiplication could underflow. */
486 1.1 kleink dval(rv0) = dval(rv);
487 1.1 kleink dval(rv) *= tinytens[j];
488 1.1 kleink if (!dval(rv)) {
489 1.1 kleink dval(rv) = 2.*dval(rv0);
490 1.1 kleink dval(rv) *= tinytens[j];
491 1.1 kleink #endif
492 1.1 kleink if (!dval(rv)) {
493 1.1 kleink undfl:
494 1.1 kleink dval(rv) = 0.;
495 1.1 kleink #ifndef NO_ERRNO
496 1.1 kleink errno = ERANGE;
497 1.1 kleink #endif
498 1.1 kleink if (bd0)
499 1.1 kleink goto retfree;
500 1.1 kleink goto ret;
501 1.1 kleink }
502 1.1 kleink #ifndef Avoid_Underflow
503 1.1 kleink word0(rv) = Tiny0;
504 1.1 kleink word1(rv) = Tiny1;
505 1.1 kleink /* The refinement below will clean
506 1.1 kleink * this approximation up.
507 1.1 kleink */
508 1.1 kleink }
509 1.1 kleink #endif
510 1.1 kleink }
511 1.1 kleink }
512 1.1 kleink
513 1.1 kleink /* Now the hard part -- adjusting rv to the correct value.*/
514 1.1 kleink
515 1.1 kleink /* Put digits into bd: true value = bd * 10^e */
516 1.1 kleink
517 1.1 kleink bd0 = s2b(s0, nd0, nd, y);
518 1.1 kleink
519 1.1 kleink for(;;) {
520 1.1 kleink bd = Balloc(bd0->k);
521 1.1 kleink Bcopy(bd, bd0);
522 1.1 kleink bb = d2b(dval(rv), &bbe, &bbbits); /* rv = bb * 2^bbe */
523 1.1 kleink bs = i2b(1);
524 1.1 kleink
525 1.1 kleink if (e >= 0) {
526 1.1 kleink bb2 = bb5 = 0;
527 1.1 kleink bd2 = bd5 = e;
528 1.1 kleink }
529 1.1 kleink else {
530 1.1 kleink bb2 = bb5 = -e;
531 1.1 kleink bd2 = bd5 = 0;
532 1.1 kleink }
533 1.1 kleink if (bbe >= 0)
534 1.1 kleink bb2 += bbe;
535 1.1 kleink else
536 1.1 kleink bd2 -= bbe;
537 1.1 kleink bs2 = bb2;
538 1.1 kleink #ifdef Honor_FLT_ROUNDS
539 1.1 kleink if (rounding != 1)
540 1.1 kleink bs2++;
541 1.1 kleink #endif
542 1.1 kleink #ifdef Avoid_Underflow
543 1.1 kleink j = bbe - scale;
544 1.1 kleink i = j + bbbits - 1; /* logb(rv) */
545 1.1 kleink if (i < Emin) /* denormal */
546 1.1 kleink j += P - Emin;
547 1.1 kleink else
548 1.1 kleink j = P + 1 - bbbits;
549 1.1 kleink #else /*Avoid_Underflow*/
550 1.1 kleink #ifdef Sudden_Underflow
551 1.1 kleink #ifdef IBM
552 1.1 kleink j = 1 + 4*P - 3 - bbbits + ((bbe + bbbits - 1) & 3);
553 1.1 kleink #else
554 1.1 kleink j = P + 1 - bbbits;
555 1.1 kleink #endif
556 1.1 kleink #else /*Sudden_Underflow*/
557 1.1 kleink j = bbe;
558 1.1 kleink i = j + bbbits - 1; /* logb(rv) */
559 1.1 kleink if (i < Emin) /* denormal */
560 1.1 kleink j += P - Emin;
561 1.1 kleink else
562 1.1 kleink j = P + 1 - bbbits;
563 1.1 kleink #endif /*Sudden_Underflow*/
564 1.1 kleink #endif /*Avoid_Underflow*/
565 1.1 kleink bb2 += j;
566 1.1 kleink bd2 += j;
567 1.1 kleink #ifdef Avoid_Underflow
568 1.1 kleink bd2 += scale;
569 1.1 kleink #endif
570 1.1 kleink i = bb2 < bd2 ? bb2 : bd2;
571 1.1 kleink if (i > bs2)
572 1.1 kleink i = bs2;
573 1.1 kleink if (i > 0) {
574 1.1 kleink bb2 -= i;
575 1.1 kleink bd2 -= i;
576 1.1 kleink bs2 -= i;
577 1.1 kleink }
578 1.1 kleink if (bb5 > 0) {
579 1.1 kleink bs = pow5mult(bs, bb5);
580 1.1 kleink bb1 = mult(bs, bb);
581 1.1 kleink Bfree(bb);
582 1.1 kleink bb = bb1;
583 1.1 kleink }
584 1.1 kleink if (bb2 > 0)
585 1.1 kleink bb = lshift(bb, bb2);
586 1.1 kleink if (bd5 > 0)
587 1.1 kleink bd = pow5mult(bd, bd5);
588 1.1 kleink if (bd2 > 0)
589 1.1 kleink bd = lshift(bd, bd2);
590 1.1 kleink if (bs2 > 0)
591 1.1 kleink bs = lshift(bs, bs2);
592 1.1 kleink delta = diff(bb, bd);
593 1.1 kleink dsign = delta->sign;
594 1.1 kleink delta->sign = 0;
595 1.1 kleink i = cmp(delta, bs);
596 1.1 kleink #ifdef Honor_FLT_ROUNDS
597 1.1 kleink if (rounding != 1) {
598 1.1 kleink if (i < 0) {
599 1.1 kleink /* Error is less than an ulp */
600 1.1 kleink if (!delta->x[0] && delta->wds <= 1) {
601 1.1 kleink /* exact */
602 1.1 kleink #ifdef SET_INEXACT
603 1.1 kleink inexact = 0;
604 1.1 kleink #endif
605 1.1 kleink break;
606 1.1 kleink }
607 1.1 kleink if (rounding) {
608 1.1 kleink if (dsign) {
609 1.1 kleink adj = 1.;
610 1.1 kleink goto apply_adj;
611 1.1 kleink }
612 1.1 kleink }
613 1.1 kleink else if (!dsign) {
614 1.1 kleink adj = -1.;
615 1.1 kleink if (!word1(rv)
616 1.1 kleink && !(word0(rv) & Frac_mask)) {
617 1.1 kleink y = word0(rv) & Exp_mask;
618 1.1 kleink #ifdef Avoid_Underflow
619 1.1 kleink if (!scale || y > 2*P*Exp_msk1)
620 1.1 kleink #else
621 1.1 kleink if (y)
622 1.1 kleink #endif
623 1.1 kleink {
624 1.1 kleink delta = lshift(delta,Log2P);
625 1.1 kleink if (cmp(delta, bs) <= 0)
626 1.1 kleink adj = -0.5;
627 1.1 kleink }
628 1.1 kleink }
629 1.1 kleink apply_adj:
630 1.1 kleink #ifdef Avoid_Underflow
631 1.1 kleink if (scale && (y = word0(rv) & Exp_mask)
632 1.1 kleink <= 2*P*Exp_msk1)
633 1.1 kleink word0(adj) += (2*P+1)*Exp_msk1 - y;
634 1.1 kleink #else
635 1.1 kleink #ifdef Sudden_Underflow
636 1.1 kleink if ((word0(rv) & Exp_mask) <=
637 1.1 kleink P*Exp_msk1) {
638 1.1 kleink word0(rv) += P*Exp_msk1;
639 1.1 kleink dval(rv) += adj*ulp(dval(rv));
640 1.1 kleink word0(rv) -= P*Exp_msk1;
641 1.1 kleink }
642 1.1 kleink else
643 1.1 kleink #endif /*Sudden_Underflow*/
644 1.1 kleink #endif /*Avoid_Underflow*/
645 1.1 kleink dval(rv) += adj*ulp(dval(rv));
646 1.1 kleink }
647 1.1 kleink break;
648 1.1 kleink }
649 1.1 kleink adj = ratio(delta, bs);
650 1.1 kleink if (adj < 1.)
651 1.1 kleink adj = 1.;
652 1.1 kleink if (adj <= 0x7ffffffe) {
653 1.1 kleink /* adj = rounding ? ceil(adj) : floor(adj); */
654 1.1 kleink y = adj;
655 1.1 kleink if (y != adj) {
656 1.1 kleink if (!((rounding>>1) ^ dsign))
657 1.1 kleink y++;
658 1.1 kleink adj = y;
659 1.1 kleink }
660 1.1 kleink }
661 1.1 kleink #ifdef Avoid_Underflow
662 1.1 kleink if (scale && (y = word0(rv) & Exp_mask) <= 2*P*Exp_msk1)
663 1.1 kleink word0(adj) += (2*P+1)*Exp_msk1 - y;
664 1.1 kleink #else
665 1.1 kleink #ifdef Sudden_Underflow
666 1.1 kleink if ((word0(rv) & Exp_mask) <= P*Exp_msk1) {
667 1.1 kleink word0(rv) += P*Exp_msk1;
668 1.1 kleink adj *= ulp(dval(rv));
669 1.1 kleink if (dsign)
670 1.1 kleink dval(rv) += adj;
671 1.1 kleink else
672 1.1 kleink dval(rv) -= adj;
673 1.1 kleink word0(rv) -= P*Exp_msk1;
674 1.1 kleink goto cont;
675 1.1 kleink }
676 1.1 kleink #endif /*Sudden_Underflow*/
677 1.1 kleink #endif /*Avoid_Underflow*/
678 1.1 kleink adj *= ulp(dval(rv));
679 1.1 kleink if (dsign)
680 1.1 kleink dval(rv) += adj;
681 1.1 kleink else
682 1.1 kleink dval(rv) -= adj;
683 1.1 kleink goto cont;
684 1.1 kleink }
685 1.1 kleink #endif /*Honor_FLT_ROUNDS*/
686 1.1 kleink
687 1.1 kleink if (i < 0) {
688 1.1 kleink /* Error is less than half an ulp -- check for
689 1.1 kleink * special case of mantissa a power of two.
690 1.1 kleink */
691 1.1 kleink if (dsign || word1(rv) || word0(rv) & Bndry_mask
692 1.1 kleink #ifdef IEEE_Arith
693 1.1 kleink #ifdef Avoid_Underflow
694 1.1 kleink || (word0(rv) & Exp_mask) <= (2*P+1)*Exp_msk1
695 1.1 kleink #else
696 1.1 kleink || (word0(rv) & Exp_mask) <= Exp_msk1
697 1.1 kleink #endif
698 1.1 kleink #endif
699 1.1 kleink ) {
700 1.1 kleink #ifdef SET_INEXACT
701 1.1 kleink if (!delta->x[0] && delta->wds <= 1)
702 1.1 kleink inexact = 0;
703 1.1 kleink #endif
704 1.1 kleink break;
705 1.1 kleink }
706 1.1 kleink if (!delta->x[0] && delta->wds <= 1) {
707 1.1 kleink /* exact result */
708 1.1 kleink #ifdef SET_INEXACT
709 1.1 kleink inexact = 0;
710 1.1 kleink #endif
711 1.1 kleink break;
712 1.1 kleink }
713 1.1 kleink delta = lshift(delta,Log2P);
714 1.1 kleink if (cmp(delta, bs) > 0)
715 1.1 kleink goto drop_down;
716 1.1 kleink break;
717 1.1 kleink }
718 1.1 kleink if (i == 0) {
719 1.1 kleink /* exactly half-way between */
720 1.1 kleink if (dsign) {
721 1.1 kleink if ((word0(rv) & Bndry_mask1) == Bndry_mask1
722 1.1 kleink && word1(rv) == (
723 1.1 kleink #ifdef Avoid_Underflow
724 1.1 kleink (scale && (y = word0(rv) & Exp_mask) <= 2*P*Exp_msk1)
725 1.1 kleink ? (0xffffffff & (0xffffffff << (2*P+1-(y>>Exp_shift)))) :
726 1.1 kleink #endif
727 1.1 kleink 0xffffffff)) {
728 1.1 kleink /*boundary case -- increment exponent*/
729 1.1 kleink word0(rv) = (word0(rv) & Exp_mask)
730 1.1 kleink + Exp_msk1
731 1.1 kleink #ifdef IBM
732 1.1 kleink | Exp_msk1 >> 4
733 1.1 kleink #endif
734 1.1 kleink ;
735 1.1 kleink word1(rv) = 0;
736 1.1 kleink #ifdef Avoid_Underflow
737 1.1 kleink dsign = 0;
738 1.1 kleink #endif
739 1.1 kleink break;
740 1.1 kleink }
741 1.1 kleink }
742 1.1 kleink else if (!(word0(rv) & Bndry_mask) && !word1(rv)) {
743 1.1 kleink drop_down:
744 1.1 kleink /* boundary case -- decrement exponent */
745 1.1 kleink #ifdef Sudden_Underflow /*{{*/
746 1.1 kleink L = word0(rv) & Exp_mask;
747 1.1 kleink #ifdef IBM
748 1.1 kleink if (L < Exp_msk1)
749 1.1 kleink #else
750 1.1 kleink #ifdef Avoid_Underflow
751 1.1 kleink if (L <= (scale ? (2*P+1)*Exp_msk1 : Exp_msk1))
752 1.1 kleink #else
753 1.1 kleink if (L <= Exp_msk1)
754 1.1 kleink #endif /*Avoid_Underflow*/
755 1.1 kleink #endif /*IBM*/
756 1.1 kleink goto undfl;
757 1.1 kleink L -= Exp_msk1;
758 1.1 kleink #else /*Sudden_Underflow}{*/
759 1.1 kleink #ifdef Avoid_Underflow
760 1.1 kleink if (scale) {
761 1.1 kleink L = word0(rv) & Exp_mask;
762 1.1 kleink if (L <= (2*P+1)*Exp_msk1) {
763 1.1 kleink if (L > (P+2)*Exp_msk1)
764 1.1 kleink /* round even ==> */
765 1.1 kleink /* accept rv */
766 1.1 kleink break;
767 1.1 kleink /* rv = smallest denormal */
768 1.1 kleink goto undfl;
769 1.1 kleink }
770 1.1 kleink }
771 1.1 kleink #endif /*Avoid_Underflow*/
772 1.1 kleink L = (word0(rv) & Exp_mask) - Exp_msk1;
773 1.1 kleink #endif /*Sudden_Underflow}*/
774 1.1 kleink word0(rv) = L | Bndry_mask1;
775 1.1 kleink word1(rv) = 0xffffffff;
776 1.1 kleink #ifdef IBM
777 1.1 kleink goto cont;
778 1.1 kleink #else
779 1.1 kleink break;
780 1.1 kleink #endif
781 1.1 kleink }
782 1.1 kleink #ifndef ROUND_BIASED
783 1.1 kleink if (!(word1(rv) & LSB))
784 1.1 kleink break;
785 1.1 kleink #endif
786 1.1 kleink if (dsign)
787 1.1 kleink dval(rv) += ulp(dval(rv));
788 1.1 kleink #ifndef ROUND_BIASED
789 1.1 kleink else {
790 1.1 kleink dval(rv) -= ulp(dval(rv));
791 1.1 kleink #ifndef Sudden_Underflow
792 1.1 kleink if (!dval(rv))
793 1.1 kleink goto undfl;
794 1.1 kleink #endif
795 1.1 kleink }
796 1.1 kleink #ifdef Avoid_Underflow
797 1.1 kleink dsign = 1 - dsign;
798 1.1 kleink #endif
799 1.1 kleink #endif
800 1.1 kleink break;
801 1.1 kleink }
802 1.1 kleink if ((aadj = ratio(delta, bs)) <= 2.) {
803 1.1 kleink if (dsign)
804 1.1 kleink aadj = aadj1 = 1.;
805 1.1 kleink else if (word1(rv) || word0(rv) & Bndry_mask) {
806 1.1 kleink #ifndef Sudden_Underflow
807 1.1 kleink if (word1(rv) == Tiny1 && !word0(rv))
808 1.1 kleink goto undfl;
809 1.1 kleink #endif
810 1.1 kleink aadj = 1.;
811 1.1 kleink aadj1 = -1.;
812 1.1 kleink }
813 1.1 kleink else {
814 1.1 kleink /* special case -- power of FLT_RADIX to be */
815 1.1 kleink /* rounded down... */
816 1.1 kleink
817 1.1 kleink if (aadj < 2./FLT_RADIX)
818 1.1 kleink aadj = 1./FLT_RADIX;
819 1.1 kleink else
820 1.1 kleink aadj *= 0.5;
821 1.1 kleink aadj1 = -aadj;
822 1.1 kleink }
823 1.1 kleink }
824 1.1 kleink else {
825 1.1 kleink aadj *= 0.5;
826 1.1 kleink aadj1 = dsign ? aadj : -aadj;
827 1.1 kleink #ifdef Check_FLT_ROUNDS
828 1.1 kleink switch(Rounding) {
829 1.1 kleink case 2: /* towards +infinity */
830 1.1 kleink aadj1 -= 0.5;
831 1.1 kleink break;
832 1.1 kleink case 0: /* towards 0 */
833 1.1 kleink case 3: /* towards -infinity */
834 1.1 kleink aadj1 += 0.5;
835 1.1 kleink }
836 1.1 kleink #else
837 1.1 kleink if (Flt_Rounds == 0)
838 1.1 kleink aadj1 += 0.5;
839 1.1 kleink #endif /*Check_FLT_ROUNDS*/
840 1.1 kleink }
841 1.1 kleink y = word0(rv) & Exp_mask;
842 1.1 kleink
843 1.1 kleink /* Check for overflow */
844 1.1 kleink
845 1.1 kleink if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) {
846 1.1 kleink dval(rv0) = dval(rv);
847 1.1 kleink word0(rv) -= P*Exp_msk1;
848 1.1 kleink adj = aadj1 * ulp(dval(rv));
849 1.1 kleink dval(rv) += adj;
850 1.1 kleink if ((word0(rv) & Exp_mask) >=
851 1.1 kleink Exp_msk1*(DBL_MAX_EXP+Bias-P)) {
852 1.1 kleink if (word0(rv0) == Big0 && word1(rv0) == Big1)
853 1.1 kleink goto ovfl;
854 1.1 kleink word0(rv) = Big0;
855 1.1 kleink word1(rv) = Big1;
856 1.1 kleink goto cont;
857 1.1 kleink }
858 1.1 kleink else
859 1.1 kleink word0(rv) += P*Exp_msk1;
860 1.1 kleink }
861 1.1 kleink else {
862 1.1 kleink #ifdef Avoid_Underflow
863 1.1 kleink if (scale && y <= 2*P*Exp_msk1) {
864 1.1 kleink if (aadj <= 0x7fffffff) {
865 1.1 kleink if ((z = aadj) <= 0)
866 1.1 kleink z = 1;
867 1.1 kleink aadj = z;
868 1.1 kleink aadj1 = dsign ? aadj : -aadj;
869 1.1 kleink }
870 1.1 kleink word0(aadj1) += (2*P+1)*Exp_msk1 - y;
871 1.1 kleink }
872 1.1 kleink adj = aadj1 * ulp(dval(rv));
873 1.1 kleink dval(rv) += adj;
874 1.1 kleink #else
875 1.1 kleink #ifdef Sudden_Underflow
876 1.1 kleink if ((word0(rv) & Exp_mask) <= P*Exp_msk1) {
877 1.1 kleink dval(rv0) = dval(rv);
878 1.1 kleink word0(rv) += P*Exp_msk1;
879 1.1 kleink adj = aadj1 * ulp(dval(rv));
880 1.1 kleink dval(rv) += adj;
881 1.1 kleink #ifdef IBM
882 1.1 kleink if ((word0(rv) & Exp_mask) < P*Exp_msk1)
883 1.1 kleink #else
884 1.1 kleink if ((word0(rv) & Exp_mask) <= P*Exp_msk1)
885 1.1 kleink #endif
886 1.1 kleink {
887 1.1 kleink if (word0(rv0) == Tiny0
888 1.1 kleink && word1(rv0) == Tiny1)
889 1.1 kleink goto undfl;
890 1.1 kleink word0(rv) = Tiny0;
891 1.1 kleink word1(rv) = Tiny1;
892 1.1 kleink goto cont;
893 1.1 kleink }
894 1.1 kleink else
895 1.1 kleink word0(rv) -= P*Exp_msk1;
896 1.1 kleink }
897 1.1 kleink else {
898 1.1 kleink adj = aadj1 * ulp(dval(rv));
899 1.1 kleink dval(rv) += adj;
900 1.1 kleink }
901 1.1 kleink #else /*Sudden_Underflow*/
902 1.1 kleink /* Compute adj so that the IEEE rounding rules will
903 1.1 kleink * correctly round rv + adj in some half-way cases.
904 1.1 kleink * If rv * ulp(rv) is denormalized (i.e.,
905 1.1 kleink * y <= (P-1)*Exp_msk1), we must adjust aadj to avoid
906 1.1 kleink * trouble from bits lost to denormalization;
907 1.1 kleink * example: 1.2e-307 .
908 1.1 kleink */
909 1.1 kleink if (y <= (P-1)*Exp_msk1 && aadj > 1.) {
910 1.1 kleink aadj1 = (double)(int)(aadj + 0.5);
911 1.1 kleink if (!dsign)
912 1.1 kleink aadj1 = -aadj1;
913 1.1 kleink }
914 1.1 kleink adj = aadj1 * ulp(dval(rv));
915 1.1 kleink dval(rv) += adj;
916 1.1 kleink #endif /*Sudden_Underflow*/
917 1.1 kleink #endif /*Avoid_Underflow*/
918 1.1 kleink }
919 1.1 kleink z = word0(rv) & Exp_mask;
920 1.1 kleink #ifndef SET_INEXACT
921 1.1 kleink #ifdef Avoid_Underflow
922 1.1 kleink if (!scale)
923 1.1 kleink #endif
924 1.1 kleink if (y == z) {
925 1.1 kleink /* Can we stop now? */
926 1.1 kleink L = (Long)aadj;
927 1.1 kleink aadj -= L;
928 1.1 kleink /* The tolerances below are conservative. */
929 1.1 kleink if (dsign || word1(rv) || word0(rv) & Bndry_mask) {
930 1.1 kleink if (aadj < .4999999 || aadj > .5000001)
931 1.1 kleink break;
932 1.1 kleink }
933 1.1 kleink else if (aadj < .4999999/FLT_RADIX)
934 1.1 kleink break;
935 1.1 kleink }
936 1.1 kleink #endif
937 1.1 kleink cont:
938 1.1 kleink Bfree(bb);
939 1.1 kleink Bfree(bd);
940 1.1 kleink Bfree(bs);
941 1.1 kleink Bfree(delta);
942 1.1 kleink }
943 1.1 kleink #ifdef SET_INEXACT
944 1.1 kleink if (inexact) {
945 1.1 kleink if (!oldinexact) {
946 1.1 kleink word0(rv0) = Exp_1 + (70 << Exp_shift);
947 1.1 kleink word1(rv0) = 0;
948 1.1 kleink dval(rv0) += 1.;
949 1.1 kleink }
950 1.1 kleink }
951 1.1 kleink else if (!oldinexact)
952 1.1 kleink clear_inexact();
953 1.1 kleink #endif
954 1.1 kleink #ifdef Avoid_Underflow
955 1.1 kleink if (scale) {
956 1.1 kleink word0(rv0) = Exp_1 - 2*P*Exp_msk1;
957 1.1 kleink word1(rv0) = 0;
958 1.1 kleink dval(rv) *= dval(rv0);
959 1.1 kleink #ifndef NO_ERRNO
960 1.1 kleink /* try to avoid the bug of testing an 8087 register value */
961 1.1 kleink if (word0(rv) == 0 && word1(rv) == 0)
962 1.1 kleink errno = ERANGE;
963 1.1 kleink #endif
964 1.1 kleink }
965 1.1 kleink #endif /* Avoid_Underflow */
966 1.1 kleink #ifdef SET_INEXACT
967 1.1 kleink if (inexact && !(word0(rv) & Exp_mask)) {
968 1.1 kleink /* set underflow bit */
969 1.1 kleink dval(rv0) = 1e-300;
970 1.1 kleink dval(rv0) *= dval(rv0);
971 1.1 kleink }
972 1.1 kleink #endif
973 1.1 kleink retfree:
974 1.1 kleink Bfree(bb);
975 1.1 kleink Bfree(bd);
976 1.1 kleink Bfree(bs);
977 1.1 kleink Bfree(bd0);
978 1.1 kleink Bfree(delta);
979 1.1 kleink ret:
980 1.1 kleink if (se)
981 1.1 kleink *se = (char *)s;
982 1.1 kleink return sign ? -dval(rv) : dval(rv);
983 1.1 kleink }
984 1.1 kleink
985