1 /****************************************************************
3 The author of this software is David M. Gay.
5 Copyright (C) 1998-2001 by Lucent Technologies
8 Permission to use, copy, modify, and distribute this software and
9 its documentation for any purpose and without fee is hereby
10 granted, provided that the above copyright notice appear in all
11 copies and that both that the copyright notice and this
12 permission notice and warranty disclaimer appear in supporting
13 documentation, and that the name of Lucent or any of its entities
14 not be used in advertising or publicity pertaining to
15 distribution of the software without specific, written prior
18 LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
19 INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
20 IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
21 SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
22 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
23 IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
24 ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
27 ****************************************************************/
29 /* Please send bug reports to David M. Gay (dmg at acm dot org,
30 * with " at " changed at "@" and " dot " changed to "."). */
45 #define Avoid_Underflow
47 /* The factor of 2^53 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.e-256
55 #ifdef Honor_FLT_ROUNDS
56 #define Rounding rounding
57 #undef Check_FLT_ROUNDS
58 #define Check_FLT_ROUNDS
60 #define Rounding Flt_Rounds
66 (s00, se) CONST char *s00; char **se;
68 (CONST char *s00, char **se)
71 #ifdef Avoid_Underflow
74 int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, decpt, dsign,
75 e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign;
76 CONST char *s, *s0, *s1;
77 double aadj, aadj1, adj, rv, rv0;
80 Bigint *bb, *bb1, *bd, *bd0, *bs, *delta;
82 int inexact, oldinexact;
84 #ifdef Honor_FLT_ROUNDS
88 sign = nz0 = nz = decpt = 0;
90 for(s = s00;;s++) switch(*s) {
114 static FPI fpi = { 53, 1-1023-53+1, 2046-1023-53+1, 1, SI };
121 #if defined(FE_DOWNWARD) && defined(FE_TONEAREST) && defined(FE_TOWARDZERO) && defined(FE_UPWARD)
123 switch(fegetround()) {
124 case FE_TOWARDZERO: fpi1.rounding = 0; break;
125 case FE_UPWARD: fpi1.rounding = 2; break;
126 case FE_DOWNWARD: fpi1.rounding = 3;
131 switch((i = gethex(&s, &fpi1, &exp, &bb, sign)) & STRTOG_Retmask) {
132 case STRTOG_NoNumber:
139 copybits(bits, fpi.nbits, bb);
142 ULtod(((U*)&rv)->L, bits, exp, i);
155 for(nd = nf = 0; (c = *s) >= '0' && c <= '9'; nd++, s++)
162 if (c == *localeconv()->decimal_point)
170 for(; c == '0'; c = *++s)
172 if (c > '0' && c <= '9') {
180 for(; c >= '0' && c <= '9'; c = *++s) {
185 for(i = 1; i < nz; i++)
188 else if (nd <= DBL_DIG + 1)
192 else if (nd <= DBL_DIG + 1)
200 if (c == 'e' || c == 'E') {
201 if (!nd && !nz && !nz0) {
212 if (c >= '0' && c <= '9') {
215 if (c > '0' && c <= '9') {
218 while((c = *++s) >= '0' && c <= '9')
220 if (s - s1 > 8 || L > 19999)
221 /* Avoid confusion from exponents
222 * so large that e might overflow.
224 e = 19999; /* safe for 16 bit ints */
239 /* Check for Nan and Infinity */
241 static FPI fpinan = /* only 52 explicit bits */
242 { 52, 1-1023-53+1, 2046-1023-53+1, 1, SI };
247 if (match(&s,"nf")) {
249 if (!match(&s,"inity"))
251 word0(rv) = 0x7ff00000;
258 if (match(&s, "an")) {
261 && hexnan(&s, &fpinan, bits)
263 word0(rv) = 0x7ff80000 | bits[1];
268 word0(rv) = NAN_WORD0;
269 word1(rv) = NAN_WORD1;
276 #endif /* INFNAN_CHECK */
285 /* Now we have nd0 digits, starting at s0, followed by a
286 * decimal point, followed by nd-nd0 digits. The number we're
287 * after is the integer represented by those digits times
292 k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1;
297 oldinexact = get_inexact();
299 dval(rv) = tens[k - 9] * dval(rv) + z;
304 #ifndef Honor_FLT_ROUNDS
316 #ifdef Honor_FLT_ROUNDS
317 /* round correctly FLT_ROUNDS = 2 or 3 */
323 /* rv = */ rounded_product(dval(rv), tens[e]);
328 if (e <= Ten_pmax + i) {
329 /* A fancier test would sometimes let us do
330 * this for larger i values.
332 #ifdef Honor_FLT_ROUNDS
333 /* round correctly FLT_ROUNDS = 2 or 3 */
342 /* VAX exponent range is so narrow we must
343 * worry about overflow here...
346 word0(rv) -= P*Exp_msk1;
347 /* rv = */ rounded_product(dval(rv), tens[e]);
348 if ((word0(rv) & Exp_mask)
349 > Exp_msk1*(DBL_MAX_EXP+Bias-1-P))
351 word0(rv) += P*Exp_msk1;
353 /* rv = */ rounded_product(dval(rv), tens[e]);
358 #ifndef Inaccurate_Divide
359 else if (e >= -Ten_pmax) {
360 #ifdef Honor_FLT_ROUNDS
361 /* round correctly FLT_ROUNDS = 2 or 3 */
367 /* rv = */ rounded_quotient(dval(rv), tens[-e]);
378 oldinexact = get_inexact();
380 #ifdef Avoid_Underflow
383 #ifdef Honor_FLT_ROUNDS
384 if ((rounding = Flt_Rounds) >= 2) {
386 rounding = rounding == 2 ? 0 : 2;
392 #endif /*IEEE_Arith*/
394 /* Get starting approximation = rv * 10**e1 */
397 if ( (i = e1 & 15) !=0)
400 if (e1 > DBL_MAX_10_EXP) {
405 /* Can't trust HUGE_VAL */
407 #ifdef Honor_FLT_ROUNDS
409 case 0: /* toward 0 */
410 case 3: /* toward -infinity */
415 word0(rv) = Exp_mask;
418 #else /*Honor_FLT_ROUNDS*/
419 word0(rv) = Exp_mask;
421 #endif /*Honor_FLT_ROUNDS*/
423 /* set overflow bit */
425 dval(rv0) *= dval(rv0);
430 #endif /*IEEE_Arith*/
436 for(j = 0; e1 > 1; j++, e1 >>= 1)
438 dval(rv) *= bigtens[j];
439 /* The last multiplication could overflow. */
440 word0(rv) -= P*Exp_msk1;
441 dval(rv) *= bigtens[j];
442 if ((z = word0(rv) & Exp_mask)
443 > Exp_msk1*(DBL_MAX_EXP+Bias-P))
445 if (z > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) {
446 /* set to largest number */
447 /* (Can't trust DBL_MAX) */
452 word0(rv) += P*Exp_msk1;
457 if ( (i = e1 & 15) !=0)
460 if (e1 >= 1 << n_bigtens)
462 #ifdef Avoid_Underflow
465 for(j = 0; e1 > 0; j++, e1 >>= 1)
467 dval(rv) *= tinytens[j];
468 if (scale && (j = 2*P + 1 - ((word0(rv) & Exp_mask)
469 >> Exp_shift)) > 0) {
470 /* scaled rv is denormal; zap j low bits */
474 word0(rv) = (P+2)*Exp_msk1;
476 word0(rv) &= 0xffffffff << j-32;
479 word1(rv) &= 0xffffffff << j;
482 for(j = 0; e1 > 1; j++, e1 >>= 1)
484 dval(rv) *= tinytens[j];
485 /* The last multiplication could underflow. */
486 dval(rv0) = dval(rv);
487 dval(rv) *= tinytens[j];
489 dval(rv) = 2.*dval(rv0);
490 dval(rv) *= tinytens[j];
502 #ifndef Avoid_Underflow
505 /* The refinement below will clean
506 * this approximation up.
513 /* Now the hard part -- adjusting rv to the correct value.*/
515 /* Put digits into bd: true value = bd * 10^e */
517 bd0 = s2b(s0, nd0, nd, y);
522 bb = d2b(dval(rv), &bbe, &bbbits); /* rv = bb * 2^bbe */
538 #ifdef Honor_FLT_ROUNDS
542 #ifdef Avoid_Underflow
544 i = j + bbbits - 1; /* logb(rv) */
545 if (i < Emin) /* denormal */
549 #else /*Avoid_Underflow*/
550 #ifdef Sudden_Underflow
552 j = 1 + 4*P - 3 - bbbits + ((bbe + bbbits - 1) & 3);
556 #else /*Sudden_Underflow*/
558 i = j + bbbits - 1; /* logb(rv) */
559 if (i < Emin) /* denormal */
563 #endif /*Sudden_Underflow*/
564 #endif /*Avoid_Underflow*/
567 #ifdef Avoid_Underflow
570 i = bb2 < bd2 ? bb2 : bd2;
579 bs = pow5mult(bs, bb5);
585 bb = lshift(bb, bb2);
587 bd = pow5mult(bd, bd5);
589 bd = lshift(bd, bd2);
591 bs = lshift(bs, bs2);
592 delta = diff(bb, bd);
596 #ifdef Honor_FLT_ROUNDS
599 /* Error is less than an ulp */
600 if (!delta->x[0] && delta->wds <= 1) {
616 && !(word0(rv) & Frac_mask)) {
617 y = word0(rv) & Exp_mask;
618 #ifdef Avoid_Underflow
619 if (!scale || y > 2*P*Exp_msk1)
624 delta = lshift(delta,Log2P);
625 if (cmp(delta, bs) <= 0)
630 #ifdef Avoid_Underflow
631 if (scale && (y = word0(rv) & Exp_mask)
633 word0(adj) += (2*P+1)*Exp_msk1 - y;
635 #ifdef Sudden_Underflow
636 if ((word0(rv) & Exp_mask) <=
638 word0(rv) += P*Exp_msk1;
639 dval(rv) += adj*ulp(dval(rv));
640 word0(rv) -= P*Exp_msk1;
643 #endif /*Sudden_Underflow*/
644 #endif /*Avoid_Underflow*/
645 dval(rv) += adj*ulp(dval(rv));
649 adj = ratio(delta, bs);
652 if (adj <= 0x7ffffffe) {
653 /* adj = rounding ? ceil(adj) : floor(adj); */
656 if (!((rounding>>1) ^ dsign))
661 #ifdef Avoid_Underflow
662 if (scale && (y = word0(rv) & Exp_mask) <= 2*P*Exp_msk1)
663 word0(adj) += (2*P+1)*Exp_msk1 - y;
665 #ifdef Sudden_Underflow
666 if ((word0(rv) & Exp_mask) <= P*Exp_msk1) {
667 word0(rv) += P*Exp_msk1;
668 adj *= ulp(dval(rv));
673 word0(rv) -= P*Exp_msk1;
676 #endif /*Sudden_Underflow*/
677 #endif /*Avoid_Underflow*/
678 adj *= ulp(dval(rv));
685 #endif /*Honor_FLT_ROUNDS*/
688 /* Error is less than half an ulp -- check for
689 * special case of mantissa a power of two.
691 if (dsign || word1(rv) || word0(rv) & Bndry_mask
693 #ifdef Avoid_Underflow
694 || (word0(rv) & Exp_mask) <= (2*P+1)*Exp_msk1
696 || (word0(rv) & Exp_mask) <= Exp_msk1
701 if (!delta->x[0] && delta->wds <= 1)
706 if (!delta->x[0] && delta->wds <= 1) {
713 delta = lshift(delta,Log2P);
714 if (cmp(delta, bs) > 0)
719 /* exactly half-way between */
721 if ((word0(rv) & Bndry_mask1) == Bndry_mask1
723 #ifdef Avoid_Underflow
724 (scale && (y = word0(rv) & Exp_mask) <= 2*P*Exp_msk1)
725 ? (0xffffffff & (0xffffffff << (2*P+1-(y>>Exp_shift)))) :
728 /*boundary case -- increment exponent*/
729 word0(rv) = (word0(rv) & Exp_mask)
736 #ifdef Avoid_Underflow
742 else if (!(word0(rv) & Bndry_mask) && !word1(rv)) {
744 /* boundary case -- decrement exponent */
745 #ifdef Sudden_Underflow /*{{*/
746 L = word0(rv) & Exp_mask;
750 #ifdef Avoid_Underflow
751 if (L <= (scale ? (2*P+1)*Exp_msk1 : Exp_msk1))
754 #endif /*Avoid_Underflow*/
758 #else /*Sudden_Underflow}{*/
759 #ifdef Avoid_Underflow
761 L = word0(rv) & Exp_mask;
762 if (L <= (2*P+1)*Exp_msk1) {
763 if (L > (P+2)*Exp_msk1)
767 /* rv = smallest denormal */
771 #endif /*Avoid_Underflow*/
772 L = (word0(rv) & Exp_mask) - Exp_msk1;
773 #endif /*Sudden_Underflow}*/
774 word0(rv) = L | Bndry_mask1;
775 word1(rv) = 0xffffffff;
783 if (!(word1(rv) & LSB))
787 dval(rv) += ulp(dval(rv));
790 dval(rv) -= ulp(dval(rv));
791 #ifndef Sudden_Underflow
796 #ifdef Avoid_Underflow
802 if ((aadj = ratio(delta, bs)) <= 2.) {
805 else if (word1(rv) || word0(rv) & Bndry_mask) {
806 #ifndef Sudden_Underflow
807 if (word1(rv) == Tiny1 && !word0(rv))
814 /* special case -- power of FLT_RADIX to be */
815 /* rounded down... */
817 if (aadj < 2./FLT_RADIX)
826 aadj1 = dsign ? aadj : -aadj;
827 #ifdef Check_FLT_ROUNDS
829 case 2: /* towards +infinity */
832 case 0: /* towards 0 */
833 case 3: /* towards -infinity */
839 #endif /*Check_FLT_ROUNDS*/
841 y = word0(rv) & Exp_mask;
843 /* Check for overflow */
845 if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) {
846 dval(rv0) = dval(rv);
847 word0(rv) -= P*Exp_msk1;
848 adj = aadj1 * ulp(dval(rv));
850 if ((word0(rv) & Exp_mask) >=
851 Exp_msk1*(DBL_MAX_EXP+Bias-P)) {
852 if (word0(rv0) == Big0 && word1(rv0) == Big1)
859 word0(rv) += P*Exp_msk1;
862 #ifdef Avoid_Underflow
863 if (scale && y <= 2*P*Exp_msk1) {
864 if (aadj <= 0x7fffffff) {
868 aadj1 = dsign ? aadj : -aadj;
870 word0(aadj1) += (2*P+1)*Exp_msk1 - y;
872 adj = aadj1 * ulp(dval(rv));
875 #ifdef Sudden_Underflow
876 if ((word0(rv) & Exp_mask) <= P*Exp_msk1) {
877 dval(rv0) = dval(rv);
878 word0(rv) += P*Exp_msk1;
879 adj = aadj1 * ulp(dval(rv));
882 if ((word0(rv) & Exp_mask) < P*Exp_msk1)
884 if ((word0(rv) & Exp_mask) <= P*Exp_msk1)
887 if (word0(rv0) == Tiny0
888 && word1(rv0) == Tiny1)
895 word0(rv) -= P*Exp_msk1;
898 adj = aadj1 * ulp(dval(rv));
901 #else /*Sudden_Underflow*/
902 /* Compute adj so that the IEEE rounding rules will
903 * correctly round rv + adj in some half-way cases.
904 * If rv * ulp(rv) is denormalized (i.e.,
905 * y <= (P-1)*Exp_msk1), we must adjust aadj to avoid
906 * trouble from bits lost to denormalization;
907 * example: 1.2e-307 .
909 if (y <= (P-1)*Exp_msk1 && aadj > 1.) {
910 aadj1 = (double)(int)(aadj + 0.5);
914 adj = aadj1 * ulp(dval(rv));
916 #endif /*Sudden_Underflow*/
917 #endif /*Avoid_Underflow*/
919 z = word0(rv) & Exp_mask;
921 #ifdef Avoid_Underflow
925 /* Can we stop now? */
928 /* The tolerances below are conservative. */
929 if (dsign || word1(rv) || word0(rv) & Bndry_mask) {
930 if (aadj < .4999999 || aadj > .5000001)
933 else if (aadj < .4999999/FLT_RADIX)
946 word0(rv0) = Exp_1 + (70 << Exp_shift);
951 else if (!oldinexact)
954 #ifdef Avoid_Underflow
956 word0(rv0) = Exp_1 - 2*P*Exp_msk1;
958 dval(rv) *= dval(rv0);
960 /* try to avoid the bug of testing an 8087 register value */
961 if (word0(rv) == 0 && word1(rv) == 0)
965 #endif /* Avoid_Underflow */
967 if (inexact && !(word0(rv) & Exp_mask)) {
968 /* set underflow bit */
970 dval(rv0) *= dval(rv0);
982 return sign ? -dval(rv) : dval(rv);