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 --- |