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^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
55 #ifdef Honor_FLT_ROUNDS
56 #undef Check_FLT_ROUNDS
57 #define Check_FLT_ROUNDS
59 #define Rounding Flt_Rounds
65 (s00, se) CONST char *s00; char **se;
67 (CONST char *s00, char **se)
70 #ifdef Avoid_Underflow
73 int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, decpt, dsign,
74 e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign;
75 CONST char *s, *s0, *s1;
76 double aadj, aadj1, adj, rv, rv0;
79 Bigint *bb, *bb1, *bd, *bd0, *bs, *delta;
81 int inexact, oldinexact;
83 #ifdef Honor_FLT_ROUNDS /*{*/
85 #ifdef Trust_FLT_ROUNDS /*{{ only define this if FLT_ROUNDS really works! */
86 Rounding = Flt_Rounds;
89 switch(fegetround()) {
90 case FE_TOWARDZERO: Rounding = 0; break;
91 case FE_UPWARD: Rounding = 2; break;
92 case FE_DOWNWARD: Rounding = 3;
97 sign = nz0 = nz = decpt = 0;
99 for(s = s00;;s++) switch(*s) {
121 #ifndef NO_HEX_FP /*{{*/
123 static FPI fpi = { 53, 1-1023-53+1, 2046-1023-53+1, 1, SI };
130 #if defined(FE_DOWNWARD) && defined(FE_TONEAREST) && defined(FE_TOWARDZERO) && defined(FE_UPWARD) /*{{*/
132 #ifdef Honor_FLT_ROUNDS /*{{*/
133 fpi1.rounding = Rounding;
135 switch(fegetround()) {
136 case FE_TOWARDZERO: fpi1.rounding = 0; break;
137 case FE_UPWARD: fpi1.rounding = 2; break;
138 case FE_DOWNWARD: fpi1.rounding = 3;
144 switch((i = gethex(&s, &fpi1, &exp, &bb, sign)) & STRTOG_Retmask) {
145 case STRTOG_NoNumber:
152 copybits(bits, fpi.nbits, bb);
155 ULtod(((U*)&rv)->L, bits, exp, i);
168 for(nd = nf = 0; (c = *s) >= '0' && c <= '9'; nd++, s++)
175 if (c == *localeconv()->decimal_point)
183 for(; c == '0'; c = *++s)
185 if (c > '0' && c <= '9') {
193 for(; c >= '0' && c <= '9'; c = *++s) {
198 for(i = 1; i < nz; i++)
201 else if (nd <= DBL_DIG + 1)
205 else if (nd <= DBL_DIG + 1)
213 if (c == 'e' || c == 'E') {
214 if (!nd && !nz && !nz0) {
225 if (c >= '0' && c <= '9') {
228 if (c > '0' && c <= '9') {
231 while((c = *++s) >= '0' && c <= '9')
233 if (s - s1 > 8 || L > 19999)
234 /* Avoid confusion from exponents
235 * so large that e might overflow.
237 e = 19999; /* safe for 16 bit ints */
252 /* Check for Nan and Infinity */
254 static FPI fpinan = /* only 52 explicit bits */
255 { 52, 1-1023-53+1, 2046-1023-53+1, 1, SI };
260 if (match(&s,"nf")) {
262 if (!match(&s,"inity"))
264 word0(rv) = 0x7ff00000;
271 if (match(&s, "an")) {
274 && hexnan(&s, &fpinan, bits)
276 word0(rv) = 0x7ff80000 | bits[1];
281 word0(rv) = NAN_WORD0;
282 word1(rv) = NAN_WORD1;
289 #endif /* INFNAN_CHECK */
298 /* Now we have nd0 digits, starting at s0, followed by a
299 * decimal point, followed by nd-nd0 digits. The number we're
300 * after is the integer represented by those digits times
305 k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1;
310 oldinexact = get_inexact();
312 dval(rv) = tens[k - 9] * dval(rv) + z;
317 #ifndef Honor_FLT_ROUNDS
329 #ifdef Honor_FLT_ROUNDS
330 /* round correctly FLT_ROUNDS = 2 or 3 */
336 /* rv = */ rounded_product(dval(rv), tens[e]);
341 if (e <= Ten_pmax + i) {
342 /* A fancier test would sometimes let us do
343 * this for larger i values.
345 #ifdef Honor_FLT_ROUNDS
346 /* round correctly FLT_ROUNDS = 2 or 3 */
355 /* VAX exponent range is so narrow we must
356 * worry about overflow here...
359 word0(rv) -= P*Exp_msk1;
360 /* rv = */ rounded_product(dval(rv), tens[e]);
361 if ((word0(rv) & Exp_mask)
362 > Exp_msk1*(DBL_MAX_EXP+Bias-1-P))
364 word0(rv) += P*Exp_msk1;
366 /* rv = */ rounded_product(dval(rv), tens[e]);
371 #ifndef Inaccurate_Divide
372 else if (e >= -Ten_pmax) {
373 #ifdef Honor_FLT_ROUNDS
374 /* round correctly FLT_ROUNDS = 2 or 3 */
380 /* rv = */ rounded_quotient(dval(rv), tens[-e]);
391 oldinexact = get_inexact();
393 #ifdef Avoid_Underflow
396 #ifdef Honor_FLT_ROUNDS
399 Rounding = Rounding == 2 ? 0 : 2;
405 #endif /*IEEE_Arith*/
407 /* Get starting approximation = rv * 10**e1 */
410 if ( (i = e1 & 15) !=0)
413 if (e1 > DBL_MAX_10_EXP) {
418 /* Can't trust HUGE_VAL */
420 #ifdef Honor_FLT_ROUNDS
422 case 0: /* toward 0 */
423 case 3: /* toward -infinity */
428 word0(rv) = Exp_mask;
431 #else /*Honor_FLT_ROUNDS*/
432 word0(rv) = Exp_mask;
434 #endif /*Honor_FLT_ROUNDS*/
436 /* set overflow bit */
438 dval(rv0) *= dval(rv0);
443 #endif /*IEEE_Arith*/
449 for(j = 0; e1 > 1; j++, e1 >>= 1)
451 dval(rv) *= bigtens[j];
452 /* The last multiplication could overflow. */
453 word0(rv) -= P*Exp_msk1;
454 dval(rv) *= bigtens[j];
455 if ((z = word0(rv) & Exp_mask)
456 > Exp_msk1*(DBL_MAX_EXP+Bias-P))
458 if (z > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) {
459 /* set to largest number */
460 /* (Can't trust DBL_MAX) */
465 word0(rv) += P*Exp_msk1;
470 if ( (i = e1 & 15) !=0)
473 if (e1 >= 1 << n_bigtens)
475 #ifdef Avoid_Underflow
478 for(j = 0; e1 > 0; j++, e1 >>= 1)
480 dval(rv) *= tinytens[j];
481 if (scale && (j = 2*P + 1 - ((word0(rv) & Exp_mask)
482 >> Exp_shift)) > 0) {
483 /* scaled rv is denormal; zap j low bits */
487 word0(rv) = (P+2)*Exp_msk1;
489 word0(rv) &= 0xffffffff << j-32;
492 word1(rv) &= 0xffffffff << j;
495 for(j = 0; e1 > 1; j++, e1 >>= 1)
497 dval(rv) *= tinytens[j];
498 /* The last multiplication could underflow. */
499 dval(rv0) = dval(rv);
500 dval(rv) *= tinytens[j];
502 dval(rv) = 2.*dval(rv0);
503 dval(rv) *= tinytens[j];
515 #ifndef Avoid_Underflow
518 /* The refinement below will clean
519 * this approximation up.
526 /* Now the hard part -- adjusting rv to the correct value.*/
528 /* Put digits into bd: true value = bd * 10^e */
530 bd0 = s2b(s0, nd0, nd, y);
535 bb = d2b(dval(rv), &bbe, &bbbits); /* rv = bb * 2^bbe */
551 #ifdef Honor_FLT_ROUNDS
555 #ifdef Avoid_Underflow
557 i = j + bbbits - 1; /* logb(rv) */
558 if (i < Emin) /* denormal */
562 #else /*Avoid_Underflow*/
563 #ifdef Sudden_Underflow
565 j = 1 + 4*P - 3 - bbbits + ((bbe + bbbits - 1) & 3);
569 #else /*Sudden_Underflow*/
571 i = j + bbbits - 1; /* logb(rv) */
572 if (i < Emin) /* denormal */
576 #endif /*Sudden_Underflow*/
577 #endif /*Avoid_Underflow*/
580 #ifdef Avoid_Underflow
583 i = bb2 < bd2 ? bb2 : bd2;
592 bs = pow5mult(bs, bb5);
598 bb = lshift(bb, bb2);
600 bd = pow5mult(bd, bd5);
602 bd = lshift(bd, bd2);
604 bs = lshift(bs, bs2);
605 delta = diff(bb, bd);
609 #ifdef Honor_FLT_ROUNDS
612 /* Error is less than an ulp */
613 if (!delta->x[0] && delta->wds <= 1) {
629 && !(word0(rv) & Frac_mask)) {
630 y = word0(rv) & Exp_mask;
631 #ifdef Avoid_Underflow
632 if (!scale || y > 2*P*Exp_msk1)
637 delta = lshift(delta,Log2P);
638 if (cmp(delta, bs) <= 0)
643 #ifdef Avoid_Underflow
644 if (scale && (y = word0(rv) & Exp_mask)
646 word0(adj) += (2*P+1)*Exp_msk1 - y;
648 #ifdef Sudden_Underflow
649 if ((word0(rv) & Exp_mask) <=
651 word0(rv) += P*Exp_msk1;
652 dval(rv) += adj*ulp(dval(rv));
653 word0(rv) -= P*Exp_msk1;
656 #endif /*Sudden_Underflow*/
657 #endif /*Avoid_Underflow*/
658 dval(rv) += adj*ulp(dval(rv));
662 adj = ratio(delta, bs);
665 if (adj <= 0x7ffffffe) {
666 /* adj = Rounding ? ceil(adj) : floor(adj); */
669 if (!((Rounding>>1) ^ dsign))
674 #ifdef Avoid_Underflow
675 if (scale && (y = word0(rv) & Exp_mask) <= 2*P*Exp_msk1)
676 word0(adj) += (2*P+1)*Exp_msk1 - y;
678 #ifdef Sudden_Underflow
679 if ((word0(rv) & Exp_mask) <= P*Exp_msk1) {
680 word0(rv) += P*Exp_msk1;
681 adj *= ulp(dval(rv));
686 word0(rv) -= P*Exp_msk1;
689 #endif /*Sudden_Underflow*/
690 #endif /*Avoid_Underflow*/
691 adj *= ulp(dval(rv));
693 if (word0(rv) == Big0 && word1(rv) == Big1)
701 #endif /*Honor_FLT_ROUNDS*/
704 /* Error is less than half an ulp -- check for
705 * special case of mantissa a power of two.
707 if (dsign || word1(rv) || word0(rv) & Bndry_mask
709 #ifdef Avoid_Underflow
710 || (word0(rv) & Exp_mask) <= (2*P+1)*Exp_msk1
712 || (word0(rv) & Exp_mask) <= Exp_msk1
717 if (!delta->x[0] && delta->wds <= 1)
722 if (!delta->x[0] && delta->wds <= 1) {
729 delta = lshift(delta,Log2P);
730 if (cmp(delta, bs) > 0)
735 /* exactly half-way between */
737 if ((word0(rv) & Bndry_mask1) == Bndry_mask1
739 #ifdef Avoid_Underflow
740 (scale && (y = word0(rv) & Exp_mask) <= 2*P*Exp_msk1)
741 ? (0xffffffff & (0xffffffff << (2*P+1-(y>>Exp_shift)))) :
744 /*boundary case -- increment exponent*/
745 word0(rv) = (word0(rv) & Exp_mask)
752 #ifdef Avoid_Underflow
758 else if (!(word0(rv) & Bndry_mask) && !word1(rv)) {
760 /* boundary case -- decrement exponent */
761 #ifdef Sudden_Underflow /*{{*/
762 L = word0(rv) & Exp_mask;
766 #ifdef Avoid_Underflow
767 if (L <= (scale ? (2*P+1)*Exp_msk1 : Exp_msk1))
770 #endif /*Avoid_Underflow*/
774 #else /*Sudden_Underflow}{*/
775 #ifdef Avoid_Underflow
777 L = word0(rv) & Exp_mask;
778 if (L <= (2*P+1)*Exp_msk1) {
779 if (L > (P+2)*Exp_msk1)
783 /* rv = smallest denormal */
787 #endif /*Avoid_Underflow*/
788 L = (word0(rv) & Exp_mask) - Exp_msk1;
789 #endif /*Sudden_Underflow}}*/
790 word0(rv) = L | Bndry_mask1;
791 word1(rv) = 0xffffffff;
799 if (!(word1(rv) & LSB))
803 dval(rv) += ulp(dval(rv));
806 dval(rv) -= ulp(dval(rv));
807 #ifndef Sudden_Underflow
812 #ifdef Avoid_Underflow
818 if ((aadj = ratio(delta, bs)) <= 2.) {
821 else if (word1(rv) || word0(rv) & Bndry_mask) {
822 #ifndef Sudden_Underflow
823 if (word1(rv) == Tiny1 && !word0(rv))
830 /* special case -- power of FLT_RADIX to be */
831 /* rounded down... */
833 if (aadj < 2./FLT_RADIX)
842 aadj1 = dsign ? aadj : -aadj;
843 #ifdef Check_FLT_ROUNDS
845 case 2: /* towards +infinity */
848 case 0: /* towards 0 */
849 case 3: /* towards -infinity */
855 #endif /*Check_FLT_ROUNDS*/
857 y = word0(rv) & Exp_mask;
859 /* Check for overflow */
861 if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) {
862 dval(rv0) = dval(rv);
863 word0(rv) -= P*Exp_msk1;
864 adj = aadj1 * ulp(dval(rv));
866 if ((word0(rv) & Exp_mask) >=
867 Exp_msk1*(DBL_MAX_EXP+Bias-P)) {
868 if (word0(rv0) == Big0 && word1(rv0) == Big1)
875 word0(rv) += P*Exp_msk1;
878 #ifdef Avoid_Underflow
879 if (scale && y <= 2*P*Exp_msk1) {
880 if (aadj <= 0x7fffffff) {
884 aadj1 = dsign ? aadj : -aadj;
886 word0(aadj1) += (2*P+1)*Exp_msk1 - y;
888 adj = aadj1 * ulp(dval(rv));
891 #ifdef Sudden_Underflow
892 if ((word0(rv) & Exp_mask) <= P*Exp_msk1) {
893 dval(rv0) = dval(rv);
894 word0(rv) += P*Exp_msk1;
895 adj = aadj1 * ulp(dval(rv));
898 if ((word0(rv) & Exp_mask) < P*Exp_msk1)
900 if ((word0(rv) & Exp_mask) <= P*Exp_msk1)
903 if (word0(rv0) == Tiny0
904 && word1(rv0) == Tiny1)
911 word0(rv) -= P*Exp_msk1;
914 adj = aadj1 * ulp(dval(rv));
917 #else /*Sudden_Underflow*/
918 /* Compute adj so that the IEEE rounding rules will
919 * correctly round rv + adj in some half-way cases.
920 * If rv * ulp(rv) is denormalized (i.e.,
921 * y <= (P-1)*Exp_msk1), we must adjust aadj to avoid
922 * trouble from bits lost to denormalization;
923 * example: 1.2e-307 .
925 if (y <= (P-1)*Exp_msk1 && aadj > 1.) {
926 aadj1 = (double)(int)(aadj + 0.5);
930 adj = aadj1 * ulp(dval(rv));
932 #endif /*Sudden_Underflow*/
933 #endif /*Avoid_Underflow*/
935 z = word0(rv) & Exp_mask;
937 #ifdef Avoid_Underflow
941 /* Can we stop now? */
944 /* The tolerances below are conservative. */
945 if (dsign || word1(rv) || word0(rv) & Bndry_mask) {
946 if (aadj < .4999999 || aadj > .5000001)
949 else if (aadj < .4999999/FLT_RADIX)
962 word0(rv0) = Exp_1 + (70 << Exp_shift);
967 else if (!oldinexact)
970 #ifdef Avoid_Underflow
972 word0(rv0) = Exp_1 - 2*P*Exp_msk1;
974 dval(rv) *= dval(rv0);
976 /* try to avoid the bug of testing an 8087 register value */
977 if (word0(rv) == 0 && word1(rv) == 0)
981 #endif /* Avoid_Underflow */
983 if (inexact && !(word0(rv) & Exp_mask)) {
984 /* set underflow bit */
986 dval(rv0) *= dval(rv0);
998 return sign ? -dval(rv) : dval(rv);