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 "."). */
43 #define Avoid_Underflow
45 /* The factor of 2^106 in tinytens[4] helps us avoid setting the underflow */
46 /* flag unnecessarily. It leads to a song and dance at the end of strtod. */
47 static CONST double tinytens[] = { 1e-16, 1e-32, 1e-64, 1e-128,
48 9007199254740992.*9007199254740992.e-256
53 #ifdef Honor_FLT_ROUNDS
54 #undef Check_FLT_ROUNDS
55 #define Check_FLT_ROUNDS
57 #define Rounding Flt_Rounds
60 #ifdef Avoid_Underflow /*{*/
64 (x, scale) U *x; int scale;
74 if (!scale || (i = 2*P + 1 - ((word0(x) & Exp_mask) >> Exp_shift)) <= 0)
75 return rv; /* Is there an example where i <= 0 ? */
76 word0(&u) = Exp_1 + (i << Exp_shift);
85 (s00, se) CONST char *s00; char **se;
87 (CONST char *s00, char **se)
90 #ifdef Avoid_Underflow
93 int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, decpt, dsign,
94 e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign;
95 CONST char *s, *s0, *s1;
98 U adj, aadj1, rv, rv0;
100 Bigint *bb, *bb1, *bd, *bd0, *bs, *delta;
101 #ifdef Avoid_Underflow
105 int inexact, oldinexact;
107 #ifdef USE_LOCALE /*{{*/
108 #ifdef NO_LOCALE_CACHE
109 char *decimalpoint = localeconv()->decimal_point;
110 int dplen = strlen(decimalpoint);
113 static char *decimalpoint_cache;
115 if (!(s0 = decimalpoint_cache)) {
116 s0 = localeconv()->decimal_point;
117 if ((decimalpoint_cache = (char*)MALLOC(strlen(s0) + 1))) {
118 strcpy(decimalpoint_cache, s0);
119 s0 = decimalpoint_cache;
123 decimalpoint = (char*)s0;
124 #endif /*NO_LOCALE_CACHE*/
125 #else /*USE_LOCALE}{*/
127 #endif /*USE_LOCALE}}*/
129 #ifdef Honor_FLT_ROUNDS /*{*/
131 #ifdef Trust_FLT_ROUNDS /*{{ only define this if FLT_ROUNDS really works! */
132 Rounding = Flt_Rounds;
135 switch(fegetround()) {
136 case FE_TOWARDZERO: Rounding = 0; break;
137 case FE_UPWARD: Rounding = 2; break;
138 case FE_DOWNWARD: Rounding = 3;
143 sign = nz0 = nz = decpt = 0;
145 for(s = s00;;s++) switch(*s) {
167 #ifndef NO_HEX_FP /*{*/
169 static FPI fpi = { 53, 1-1023-53+1, 2046-1023-53+1, 1, SI };
176 #ifdef Honor_FLT_ROUNDS
178 fpi1.rounding = Rounding;
182 switch((i = gethex(&s, &fpi1, &exp, &bb, sign)) & STRTOG_Retmask) {
183 case STRTOG_NoNumber:
190 copybits(bits, fpi.nbits, bb);
193 ULtod(((U*)&rv)->L, bits, exp, i);
206 for(nd = nf = 0; (c = *s) >= '0' && c <= '9'; nd++, s++)
213 if (c == *decimalpoint) {
214 for(i = 1; decimalpoint[i]; ++i)
215 if (s[i] != decimalpoint[i])
225 for(; c == '0'; c = *++s)
227 if (c > '0' && c <= '9') {
235 for(; c >= '0' && c <= '9'; c = *++s) {
240 for(i = 1; i < nz; i++)
243 else if (nd <= DBL_DIG + 1)
247 else if (nd <= DBL_DIG + 1)
255 if (c == 'e' || c == 'E') {
256 if (!nd && !nz && !nz0) {
267 if (c >= '0' && c <= '9') {
270 if (c > '0' && c <= '9') {
273 while((c = *++s) >= '0' && c <= '9')
275 if (s - s1 > 8 || L > 19999)
276 /* Avoid confusion from exponents
277 * so large that e might overflow.
279 e = 19999; /* safe for 16 bit ints */
294 /* Check for Nan and Infinity */
296 static FPI fpinan = /* only 52 explicit bits */
297 { 52, 1-1023-53+1, 2046-1023-53+1, 1, SI };
302 if (match(&s,"nf")) {
304 if (!match(&s,"inity"))
306 word0(&rv) = 0x7ff00000;
313 if (match(&s, "an")) {
316 && hexnan(&s, &fpinan, bits)
318 word0(&rv) = 0x7ff00000 | bits[1];
319 word1(&rv) = bits[0];
323 word0(&rv) = NAN_WORD0;
324 word1(&rv) = NAN_WORD1;
331 #endif /* INFNAN_CHECK */
340 /* Now we have nd0 digits, starting at s0, followed by a
341 * decimal point, followed by nd-nd0 digits. The number we're
342 * after is the integer represented by those digits times
347 k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1;
352 oldinexact = get_inexact();
354 dval(&rv) = tens[k - 9] * dval(&rv) + z;
359 #ifndef Honor_FLT_ROUNDS
366 #ifndef ROUND_BIASED_without_Round_Up
372 #ifdef Honor_FLT_ROUNDS
373 /* round correctly FLT_ROUNDS = 2 or 3 */
379 /* rv = */ rounded_product(dval(&rv), tens[e]);
384 if (e <= Ten_pmax + i) {
385 /* A fancier test would sometimes let us do
386 * this for larger i values.
388 #ifdef Honor_FLT_ROUNDS
389 /* round correctly FLT_ROUNDS = 2 or 3 */
396 dval(&rv) *= tens[i];
398 /* VAX exponent range is so narrow we must
399 * worry about overflow here...
402 word0(&rv) -= P*Exp_msk1;
403 /* rv = */ rounded_product(dval(&rv), tens[e]);
404 if ((word0(&rv) & Exp_mask)
405 > Exp_msk1*(DBL_MAX_EXP+Bias-1-P))
407 word0(&rv) += P*Exp_msk1;
409 /* rv = */ rounded_product(dval(&rv), tens[e]);
414 #ifndef Inaccurate_Divide
415 else if (e >= -Ten_pmax) {
416 #ifdef Honor_FLT_ROUNDS
417 /* round correctly FLT_ROUNDS = 2 or 3 */
423 /* rv = */ rounded_quotient(dval(&rv), tens[-e]);
427 #endif /* ROUND_BIASED_without_Round_Up */
435 oldinexact = get_inexact();
437 #ifdef Avoid_Underflow
440 #ifdef Honor_FLT_ROUNDS
443 Rounding = Rounding == 2 ? 0 : 2;
449 #endif /*IEEE_Arith*/
451 /* Get starting approximation = rv * 10**e1 */
454 if ( (i = e1 & 15) !=0)
455 dval(&rv) *= tens[i];
457 if (e1 > DBL_MAX_10_EXP) {
459 /* Can't trust HUGE_VAL */
461 #ifdef Honor_FLT_ROUNDS
463 case 0: /* toward 0 */
464 case 3: /* toward -infinity */
469 word0(&rv) = Exp_mask;
472 #else /*Honor_FLT_ROUNDS*/
473 word0(&rv) = Exp_mask;
475 #endif /*Honor_FLT_ROUNDS*/
477 /* set overflow bit */
479 dval(&rv0) *= dval(&rv0);
484 #endif /*IEEE_Arith*/
499 for(j = 0; e1 > 1; j++, e1 >>= 1)
501 dval(&rv) *= bigtens[j];
502 /* The last multiplication could overflow. */
503 word0(&rv) -= P*Exp_msk1;
504 dval(&rv) *= bigtens[j];
505 if ((z = word0(&rv) & Exp_mask)
506 > Exp_msk1*(DBL_MAX_EXP+Bias-P))
508 if (z > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) {
509 /* set to largest number */
510 /* (Can't trust DBL_MAX) */
515 word0(&rv) += P*Exp_msk1;
520 if ( (i = e1 & 15) !=0)
521 dval(&rv) /= tens[i];
523 if (e1 >= 1 << n_bigtens)
525 #ifdef Avoid_Underflow
528 for(j = 0; e1 > 0; j++, e1 >>= 1)
530 dval(&rv) *= tinytens[j];
531 if (scale && (j = 2*P + 1 - ((word0(&rv) & Exp_mask)
532 >> Exp_shift)) > 0) {
533 /* scaled rv is denormal; zap j low bits */
537 word0(&rv) = (P+2)*Exp_msk1;
539 word0(&rv) &= 0xffffffff << (j-32);
542 word1(&rv) &= 0xffffffff << j;
545 for(j = 0; e1 > 1; j++, e1 >>= 1)
547 dval(&rv) *= tinytens[j];
548 /* The last multiplication could underflow. */
549 dval(&rv0) = dval(&rv);
550 dval(&rv) *= tinytens[j];
552 dval(&rv) = 2.*dval(&rv0);
553 dval(&rv) *= tinytens[j];
560 #ifndef Avoid_Underflow
563 /* The refinement below will clean
564 * this approximation up.
571 /* Now the hard part -- adjusting rv to the correct value.*/
573 /* Put digits into bd: true value = bd * 10^e */
575 bd0 = s2b(s0, nd0, nd, y, dplen);
580 bb = d2b(dval(&rv), &bbe, &bbbits); /* rv = bb * 2^bbe */
596 #ifdef Honor_FLT_ROUNDS
600 #ifdef Avoid_Underflow
604 i = j + bbbits - 1; /* logb(rv) */
606 if (i < Emin) { /* denormal */
612 Lsb1 = Lsb << (i-32);
614 #else /*Avoid_Underflow*/
615 #ifdef Sudden_Underflow
617 j = 1 + 4*P - 3 - bbbits + ((bbe + bbbits - 1) & 3);
621 #else /*Sudden_Underflow*/
623 i = j + bbbits - 1; /* logb(&rv) */
624 if (i < Emin) /* denormal */
628 #endif /*Sudden_Underflow*/
629 #endif /*Avoid_Underflow*/
632 #ifdef Avoid_Underflow
635 i = bb2 < bd2 ? bb2 : bd2;
644 bs = pow5mult(bs, bb5);
650 bb = lshift(bb, bb2);
652 bd = pow5mult(bd, bd5);
654 bd = lshift(bd, bd2);
656 bs = lshift(bs, bs2);
657 delta = diff(bb, bd);
661 #ifdef Honor_FLT_ROUNDS
664 /* Error is less than an ulp */
665 if (!delta->x[0] && delta->wds <= 1) {
681 && !(word0(&rv) & Frac_mask)) {
682 y = word0(&rv) & Exp_mask;
683 #ifdef Avoid_Underflow
684 if (!scale || y > 2*P*Exp_msk1)
689 delta = lshift(delta,Log2P);
690 if (cmp(delta, bs) <= 0)
695 #ifdef Avoid_Underflow
696 if (scale && (y = word0(&rv) & Exp_mask)
698 word0(&adj) += (2*P+1)*Exp_msk1 - y;
700 #ifdef Sudden_Underflow
701 if ((word0(&rv) & Exp_mask) <=
703 word0(&rv) += P*Exp_msk1;
704 dval(&rv) += adj*ulp(&rv);
705 word0(&rv) -= P*Exp_msk1;
708 #endif /*Sudden_Underflow*/
709 #endif /*Avoid_Underflow*/
710 dval(&rv) += adj.d*ulp(&rv);
714 dval(&adj) = ratio(delta, bs);
717 if (adj.d <= 0x7ffffffe) {
718 /* dval(&adj) = Rounding ? ceil(&adj) : floor(&adj); */
721 if (!((Rounding>>1) ^ dsign))
726 #ifdef Avoid_Underflow
727 if (scale && (y = word0(&rv) & Exp_mask) <= 2*P*Exp_msk1)
728 word0(&adj) += (2*P+1)*Exp_msk1 - y;
730 #ifdef Sudden_Underflow
731 if ((word0(&rv) & Exp_mask) <= P*Exp_msk1) {
732 word0(&rv) += P*Exp_msk1;
733 dval(&adj) *= ulp(&rv);
738 word0(&rv) -= P*Exp_msk1;
741 #endif /*Sudden_Underflow*/
742 #endif /*Avoid_Underflow*/
743 dval(&adj) *= ulp(&rv);
745 if (word0(&rv) == Big0 && word1(&rv) == Big1)
753 #endif /*Honor_FLT_ROUNDS*/
756 /* Error is less than half an ulp -- check for
757 * special case of mantissa a power of two.
759 if (dsign || word1(&rv) || word0(&rv) & Bndry_mask
761 #ifdef Avoid_Underflow
762 || (word0(&rv) & Exp_mask) <= (2*P+1)*Exp_msk1
764 || (word0(&rv) & Exp_mask) <= Exp_msk1
769 if (!delta->x[0] && delta->wds <= 1)
774 if (!delta->x[0] && delta->wds <= 1) {
781 delta = lshift(delta,Log2P);
782 if (cmp(delta, bs) > 0)
787 /* exactly half-way between */
789 if ((word0(&rv) & Bndry_mask1) == Bndry_mask1
791 #ifdef Avoid_Underflow
792 (scale && (y = word0(&rv) & Exp_mask) <= 2*P*Exp_msk1)
793 ? (0xffffffff & (0xffffffff << (2*P+1-(y>>Exp_shift)))) :
796 /*boundary case -- increment exponent*/
797 if (word0(&rv) == Big0 && word1(&rv) == Big1)
799 word0(&rv) = (word0(&rv) & Exp_mask)
806 #ifdef Avoid_Underflow
812 else if (!(word0(&rv) & Bndry_mask) && !word1(&rv)) {
814 /* boundary case -- decrement exponent */
815 #ifdef Sudden_Underflow /*{{*/
816 L = word0(&rv) & Exp_mask;
820 #ifdef Avoid_Underflow
821 if (L <= (scale ? (2*P+1)*Exp_msk1 : Exp_msk1))
824 #endif /*Avoid_Underflow*/
828 #else /*Sudden_Underflow}{*/
829 #ifdef Avoid_Underflow
831 L = word0(&rv) & Exp_mask;
832 if (L <= (2*P+1)*Exp_msk1) {
833 if (L > (P+2)*Exp_msk1)
837 /* rv = smallest denormal */
841 #endif /*Avoid_Underflow*/
842 L = (word0(&rv) & Exp_mask) - Exp_msk1;
843 #endif /*Sudden_Underflow}}*/
844 word0(&rv) = L | Bndry_mask1;
845 word1(&rv) = 0xffffffff;
853 #ifdef Avoid_Underflow
855 if (!(word0(&rv) & Lsb1))
858 else if (!(word1(&rv) & Lsb))
861 if (!(word1(&rv) & LSB))
866 #ifdef Avoid_Underflow
867 dval(&rv) += sulp(&rv, scale);
869 dval(&rv) += ulp(&rv);
873 #ifdef Avoid_Underflow
874 dval(&rv) -= sulp(&rv, scale);
876 dval(&rv) -= ulp(&rv);
878 #ifndef Sudden_Underflow
883 #ifdef Avoid_Underflow
889 if ((aadj = ratio(delta, bs)) <= 2.) {
891 aadj = dval(&aadj1) = 1.;
892 else if (word1(&rv) || word0(&rv) & Bndry_mask) {
893 #ifndef Sudden_Underflow
894 if (word1(&rv) == Tiny1 && !word0(&rv))
901 /* special case -- power of FLT_RADIX to be */
902 /* rounded down... */
904 if (aadj < 2./FLT_RADIX)
908 dval(&aadj1) = -aadj;
913 dval(&aadj1) = dsign ? aadj : -aadj;
914 #ifdef Check_FLT_ROUNDS
916 case 2: /* towards +infinity */
919 case 0: /* towards 0 */
920 case 3: /* towards -infinity */
926 #endif /*Check_FLT_ROUNDS*/
928 y = word0(&rv) & Exp_mask;
930 /* Check for overflow */
932 if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) {
933 dval(&rv0) = dval(&rv);
934 word0(&rv) -= P*Exp_msk1;
935 dval(&adj) = dval(&aadj1) * ulp(&rv);
936 dval(&rv) += dval(&adj);
937 if ((word0(&rv) & Exp_mask) >=
938 Exp_msk1*(DBL_MAX_EXP+Bias-P)) {
939 if (word0(&rv0) == Big0 && word1(&rv0) == Big1)
946 word0(&rv) += P*Exp_msk1;
949 #ifdef Avoid_Underflow
950 if (scale && y <= 2*P*Exp_msk1) {
951 if (aadj <= 0x7fffffff) {
955 dval(&aadj1) = dsign ? aadj : -aadj;
957 word0(&aadj1) += (2*P+1)*Exp_msk1 - y;
959 dval(&adj) = dval(&aadj1) * ulp(&rv);
960 dval(&rv) += dval(&adj);
962 #ifdef Sudden_Underflow
963 if ((word0(&rv) & Exp_mask) <= P*Exp_msk1) {
964 dval(&rv0) = dval(&rv);
965 word0(&rv) += P*Exp_msk1;
966 dval(&adj) = dval(&aadj1) * ulp(&rv);
969 if ((word0(&rv) & Exp_mask) < P*Exp_msk1)
971 if ((word0(&rv) & Exp_mask) <= P*Exp_msk1)
974 if (word0(&rv0) == Tiny0
975 && word1(&rv0) == Tiny1)
982 word0(&rv) -= P*Exp_msk1;
985 dval(&adj) = dval(&aadj1) * ulp(&rv);
988 #else /*Sudden_Underflow*/
989 /* Compute dval(&adj) so that the IEEE rounding rules will
990 * correctly round rv + dval(&adj) in some half-way cases.
991 * If rv * ulp(&rv) is denormalized (i.e.,
992 * y <= (P-1)*Exp_msk1), we must adjust aadj to avoid
993 * trouble from bits lost to denormalization;
994 * example: 1.2e-307 .
996 if (y <= (P-1)*Exp_msk1 && aadj > 1.) {
997 dval(&aadj1) = (double)(int)(aadj + 0.5);
999 dval(&aadj1) = -dval(&aadj1);
1001 dval(&adj) = dval(&aadj1) * ulp(&rv);
1003 #endif /*Sudden_Underflow*/
1004 #endif /*Avoid_Underflow*/
1006 z = word0(&rv) & Exp_mask;
1008 #ifdef Avoid_Underflow
1012 /* Can we stop now? */
1015 /* The tolerances below are conservative. */
1016 if (dsign || word1(&rv) || word0(&rv) & Bndry_mask) {
1017 if (aadj < .4999999 || aadj > .5000001)
1020 else if (aadj < .4999999/FLT_RADIX)
1038 word0(&rv0) = Exp_1 + (70 << Exp_shift);
1043 else if (!oldinexact)
1046 #ifdef Avoid_Underflow
1048 word0(&rv0) = Exp_1 - 2*P*Exp_msk1;
1050 dval(&rv) *= dval(&rv0);
1052 /* try to avoid the bug of testing an 8087 register value */
1054 if (!(word0(&rv) & Exp_mask))
1056 if (word0(&rv) == 0 && word1(&rv) == 0)
1061 #endif /* Avoid_Underflow */
1063 if (inexact && !(word0(&rv) & Exp_mask)) {
1064 /* set underflow bit */
1065 dval(&rv0) = 1e-300;
1066 dval(&rv0) *= dval(&rv0);
1072 return sign ? -dval(&rv) : dval(&rv);