Deleted Added
full compact
dtoa.c (165744) dtoa.c (182709)
1/****************************************************************
2
3The author of this software is David M. Gay.
4
5Copyright (C) 1998, 1999 by Lucent Technologies
6All Rights Reserved
7
8Permission to use, copy, modify, and distribute this software and

--- 52 unchanged lines hidden (view full) ---

61 * guarantee that the floating-point calculation has given
62 * the correctly rounded result. For k requested digits and
63 * "uniformly" distributed input, the probability is
64 * something like 10^(k-15) that we must resort to the Long
65 * calculation.
66 */
67
68#ifdef Honor_FLT_ROUNDS
1/****************************************************************
2
3The author of this software is David M. Gay.
4
5Copyright (C) 1998, 1999 by Lucent Technologies
6All Rights Reserved
7
8Permission to use, copy, modify, and distribute this software and

--- 52 unchanged lines hidden (view full) ---

61 * guarantee that the floating-point calculation has given
62 * the correctly rounded result. For k requested digits and
63 * "uniformly" distributed input, the probability is
64 * something like 10^(k-15) that we must resort to the Long
65 * calculation.
66 */
67
68#ifdef Honor_FLT_ROUNDS
69#define Rounding rounding
70#undef Check_FLT_ROUNDS
71#define Check_FLT_ROUNDS
72#else
73#define Rounding Flt_Rounds
74#endif
75
76 char *
77dtoa

--- 44 unchanged lines hidden (view full) ---

122 Long L;
123#ifndef Sudden_Underflow
124 int denorm;
125 ULong x;
126#endif
127 Bigint *b, *b1, *delta, *mlo, *mhi, *S;
128 double d2, ds, eps;
129 char *s, *s0;
69#undef Check_FLT_ROUNDS
70#define Check_FLT_ROUNDS
71#else
72#define Rounding Flt_Rounds
73#endif
74
75 char *
76dtoa

--- 44 unchanged lines hidden (view full) ---

121 Long L;
122#ifndef Sudden_Underflow
123 int denorm;
124 ULong x;
125#endif
126 Bigint *b, *b1, *delta, *mlo, *mhi, *S;
127 double d2, ds, eps;
128 char *s, *s0;
130#ifdef Honor_FLT_ROUNDS
131 int rounding;
132#endif
133#ifdef SET_INEXACT
134 int inexact, oldinexact;
135#endif
129#ifdef SET_INEXACT
130 int inexact, oldinexact;
131#endif
132#ifdef Honor_FLT_ROUNDS /*{*/
133 int Rounding;
134#ifdef Trust_FLT_ROUNDS /*{{ only define this if FLT_ROUNDS really works! */
135 Rounding = Flt_Rounds;
136#else /*}{*/
137 Rounding = 1;
138 switch(fegetround()) {
139 case FE_TOWARDZERO: Rounding = 0; break;
140 case FE_UPWARD: Rounding = 2; break;
141 case FE_DOWNWARD: Rounding = 3;
142 }
143#endif /*}}*/
144#endif /*}*/
136
137#ifndef MULTIPLE_THREADS
138 if (dtoa_result) {
139 freedtoa(dtoa_result);
140 dtoa_result = 0;
141 }
142#endif
143

--- 29 unchanged lines hidden (view full) ---

173 return nrv_alloc("0", rve, 1);
174 }
175
176#ifdef SET_INEXACT
177 try_quick = oldinexact = get_inexact();
178 inexact = 1;
179#endif
180#ifdef Honor_FLT_ROUNDS
145
146#ifndef MULTIPLE_THREADS
147 if (dtoa_result) {
148 freedtoa(dtoa_result);
149 dtoa_result = 0;
150 }
151#endif
152

--- 29 unchanged lines hidden (view full) ---

182 return nrv_alloc("0", rve, 1);
183 }
184
185#ifdef SET_INEXACT
186 try_quick = oldinexact = get_inexact();
187 inexact = 1;
188#endif
189#ifdef Honor_FLT_ROUNDS
181 if ((rounding = Flt_Rounds) >= 2) {
190 if (Rounding >= 2) {
182 if (*sign)
191 if (*sign)
183 rounding = rounding == 2 ? 0 : 2;
192 Rounding = Rounding == 2 ? 0 : 2;
184 else
193 else
185 if (rounding != 2)
186 rounding = 0;
194 if (Rounding != 2)
195 Rounding = 0;
187 }
188#endif
189
190 b = d2b(dval(d), &be, &bbits);
191#ifdef Sudden_Underflow
192 i = (int)(word0(d) >> Exp_shift1 & (Exp_mask>>Exp_shift1));
193#else
194 if (( i = (int)(word0(d) >> Exp_shift1 & (Exp_mask>>Exp_shift1)) )!=0) {

--- 116 unchanged lines hidden (view full) ---

311 ilim = i;
312 ilim1 = i - 1;
313 if (i <= 0)
314 i = 1;
315 }
316 s = s0 = rv_alloc(i);
317
318#ifdef Honor_FLT_ROUNDS
196 }
197#endif
198
199 b = d2b(dval(d), &be, &bbits);
200#ifdef Sudden_Underflow
201 i = (int)(word0(d) >> Exp_shift1 & (Exp_mask>>Exp_shift1));
202#else
203 if (( i = (int)(word0(d) >> Exp_shift1 & (Exp_mask>>Exp_shift1)) )!=0) {

--- 116 unchanged lines hidden (view full) ---

320 ilim = i;
321 ilim1 = i - 1;
322 if (i <= 0)
323 i = 1;
324 }
325 s = s0 = rv_alloc(i);
326
327#ifdef Honor_FLT_ROUNDS
319 if (mode > 1 && rounding != 1)
328 if (mode > 1 && Rounding != 1)
320 leftright = 0;
321#endif
322
323 if (ilim >= 0 && ilim <= Quick_max && try_quick) {
324
325 /* Try to get by with floating-point arithmetic. */
326
327 i = 0;

--- 120 unchanged lines hidden (view full) ---

448#ifdef SET_INEXACT
449 inexact = 0;
450#endif
451 break;
452 }
453 if (i == ilim) {
454#ifdef Honor_FLT_ROUNDS
455 if (mode > 1)
329 leftright = 0;
330#endif
331
332 if (ilim >= 0 && ilim <= Quick_max && try_quick) {
333
334 /* Try to get by with floating-point arithmetic. */
335
336 i = 0;

--- 120 unchanged lines hidden (view full) ---

457#ifdef SET_INEXACT
458 inexact = 0;
459#endif
460 break;
461 }
462 if (i == ilim) {
463#ifdef Honor_FLT_ROUNDS
464 if (mode > 1)
456 switch(rounding) {
465 switch(Rounding) {
457 case 0: goto ret1;
458 case 2: goto bump_up;
459 }
460#endif
461 dval(d) += dval(d);
462 if (dval(d) > ds || dval(d) == ds && L & 1) {
463 bump_up:
464 while(*--s == '9')

--- 51 unchanged lines hidden (view full) ---

516 if (s5 > 0)
517 S = pow5mult(S, s5);
518
519 /* Check for special case that d is a normalized power of 2. */
520
521 spec_case = 0;
522 if ((mode < 2 || leftright)
523#ifdef Honor_FLT_ROUNDS
466 case 0: goto ret1;
467 case 2: goto bump_up;
468 }
469#endif
470 dval(d) += dval(d);
471 if (dval(d) > ds || dval(d) == ds && L & 1) {
472 bump_up:
473 while(*--s == '9')

--- 51 unchanged lines hidden (view full) ---

525 if (s5 > 0)
526 S = pow5mult(S, s5);
527
528 /* Check for special case that d is a normalized power of 2. */
529
530 spec_case = 0;
531 if ((mode < 2 || leftright)
532#ifdef Honor_FLT_ROUNDS
524 && rounding == 1
533 && Rounding == 1
525#endif
526 ) {
527 if (!word1(d) && !(word0(d) & Bndry_mask)
528#ifndef Sudden_Underflow
529 && word0(d) & (Exp_mask & ~Exp_msk1)
530#endif
531 ) {
532 /* The special case */

--- 76 unchanged lines hidden (view full) ---

609 */
610 j = cmp(b, mlo);
611 delta = diff(S, mhi);
612 j1 = delta->sign ? 1 : cmp(b, delta);
613 Bfree(delta);
614#ifndef ROUND_BIASED
615 if (j1 == 0 && mode != 1 && !(word1(d) & 1)
616#ifdef Honor_FLT_ROUNDS
534#endif
535 ) {
536 if (!word1(d) && !(word0(d) & Bndry_mask)
537#ifndef Sudden_Underflow
538 && word0(d) & (Exp_mask & ~Exp_msk1)
539#endif
540 ) {
541 /* The special case */

--- 76 unchanged lines hidden (view full) ---

618 */
619 j = cmp(b, mlo);
620 delta = diff(S, mhi);
621 j1 = delta->sign ? 1 : cmp(b, delta);
622 Bfree(delta);
623#ifndef ROUND_BIASED
624 if (j1 == 0 && mode != 1 && !(word1(d) & 1)
625#ifdef Honor_FLT_ROUNDS
617 && rounding >= 1
626 && Rounding >= 1
618#endif
619 ) {
620 if (dig == '9')
621 goto round_9_up;
622 if (j > 0)
623 dig++;
624#ifdef SET_INEXACT
625 else if (!b->x[0] && b->wds <= 1)

--- 11 unchanged lines hidden (view full) ---

637 if (!b->x[0] && b->wds <= 1) {
638#ifdef SET_INEXACT
639 inexact = 0;
640#endif
641 goto accept_dig;
642 }
643#ifdef Honor_FLT_ROUNDS
644 if (mode > 1)
627#endif
628 ) {
629 if (dig == '9')
630 goto round_9_up;
631 if (j > 0)
632 dig++;
633#ifdef SET_INEXACT
634 else if (!b->x[0] && b->wds <= 1)

--- 11 unchanged lines hidden (view full) ---

646 if (!b->x[0] && b->wds <= 1) {
647#ifdef SET_INEXACT
648 inexact = 0;
649#endif
650 goto accept_dig;
651 }
652#ifdef Honor_FLT_ROUNDS
653 if (mode > 1)
645 switch(rounding) {
654 switch(Rounding) {
646 case 0: goto accept_dig;
647 case 2: goto keep_dig;
648 }
649#endif /*Honor_FLT_ROUNDS*/
650 if (j1 > 0) {
651 b = lshift(b, 1);
652 j1 = cmp(b, S);
653 if ((j1 > 0 || j1 == 0 && dig & 1)
654 && dig++ == '9')
655 goto round_9_up;
656 }
657 accept_dig:
658 *s++ = dig;
659 goto ret;
660 }
661 if (j1 > 0) {
662#ifdef Honor_FLT_ROUNDS
655 case 0: goto accept_dig;
656 case 2: goto keep_dig;
657 }
658#endif /*Honor_FLT_ROUNDS*/
659 if (j1 > 0) {
660 b = lshift(b, 1);
661 j1 = cmp(b, S);
662 if ((j1 > 0 || j1 == 0 && dig & 1)
663 && dig++ == '9')
664 goto round_9_up;
665 }
666 accept_dig:
667 *s++ = dig;
668 goto ret;
669 }
670 if (j1 > 0) {
671#ifdef Honor_FLT_ROUNDS
663 if (!rounding)
672 if (!Rounding)
664 goto accept_dig;
665#endif
666 if (dig == '9') { /* possible if i == 1 */
667 round_9_up:
668 *s++ = '9';
669 goto roundoff;
670 }
671 *s++ = dig + 1;

--- 26 unchanged lines hidden (view full) ---

698 if (i >= ilim)
699 break;
700 b = multadd(b, 10, 0);
701 }
702
703 /* Round off last digit */
704
705#ifdef Honor_FLT_ROUNDS
673 goto accept_dig;
674#endif
675 if (dig == '9') { /* possible if i == 1 */
676 round_9_up:
677 *s++ = '9';
678 goto roundoff;
679 }
680 *s++ = dig + 1;

--- 26 unchanged lines hidden (view full) ---

707 if (i >= ilim)
708 break;
709 b = multadd(b, 10, 0);
710 }
711
712 /* Round off last digit */
713
714#ifdef Honor_FLT_ROUNDS
706 switch(rounding) {
715 switch(Rounding) {
707 case 0: goto trimzeros;
708 case 2: goto roundoff;
709 }
710#endif
711 b = lshift(b, 1);
712 j = cmp(b, S);
713 if (j > 0 || j == 0 && dig & 1) {
714 roundoff:

--- 39 unchanged lines hidden ---
716 case 0: goto trimzeros;
717 case 2: goto roundoff;
718 }
719#endif
720 b = lshift(b, 1);
721 j = cmp(b, S);
722 if (j > 0 || j == 0 && dig & 1) {
723 roundoff:

--- 39 unchanged lines hidden ---