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