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