Remove building with NOCRYPTO option
[minix3.git] / lib / libc / gdtoa / dtoa.c
blob66fe35cdcf2b62cff1c0847cacd6b6ef13916493
1 /* $NetBSD: dtoa.c,v 1.10 2012/05/16 17:48:59 alnsn Exp $ */
3 /****************************************************************
5 The author of this software is David M. Gay.
7 Copyright (C) 1998, 1999 by Lucent Technologies
8 All Rights Reserved
10 Permission to use, copy, modify, and distribute this software and
11 its documentation for any purpose and without fee is hereby
12 granted, provided that the above copyright notice appear in all
13 copies and that both that the copyright notice and this
14 permission notice and warranty disclaimer appear in supporting
15 documentation, and that the name of Lucent or any of its entities
16 not be used in advertising or publicity pertaining to
17 distribution of the software without specific, written prior
18 permission.
20 LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
21 INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
22 IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
23 SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
24 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
25 IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
26 ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
27 THIS SOFTWARE.
29 ****************************************************************/
31 /* Please send bug reports to David M. Gay (dmg at acm dot org,
32 * with " at " changed at "@" and " dot " changed to "."). */
34 #include "gdtoaimp.h"
36 /* dtoa for IEEE arithmetic (dmg): convert double to ASCII string.
38 * Inspired by "How to Print Floating-Point Numbers Accurately" by
39 * Guy L. Steele, Jr. and Jon L. White [Proc. ACM SIGPLAN '90, pp. 112-126].
41 * Modifications:
42 * 1. Rather than iterating, we use a simple numeric overestimate
43 * to determine k = floor(log10(d)). We scale relevant
44 * quantities using O(log2(k)) rather than O(k) multiplications.
45 * 2. For some modes > 2 (corresponding to ecvt and fcvt), we don't
46 * try to generate digits strictly left to right. Instead, we
47 * compute with fewer bits and propagate the carry if necessary
48 * when rounding the final digit up. This is often faster.
49 * 3. Under the assumption that input will be rounded nearest,
50 * mode 0 renders 1e23 as 1e23 rather than 9.999999999999999e22.
51 * That is, we allow equality in stopping tests when the
52 * round-nearest rule will give the same floating-point value
53 * as would satisfaction of the stopping test with strict
54 * inequality.
55 * 4. We remove common factors of powers of 2 from relevant
56 * quantities.
57 * 5. When converting floating-point integers less than 1e16,
58 * we use floating-point arithmetic rather than resorting
59 * to multiple-precision integers.
60 * 6. When asked to produce fewer than 15 digits, we first try
61 * to get by with floating-point arithmetic; we resort to
62 * multiple-precision integer arithmetic only if we cannot
63 * guarantee that the floating-point calculation has given
64 * the correctly rounded result. For k requested digits and
65 * "uniformly" distributed input, the probability is
66 * something like 10^(k-15) that we must resort to the Long
67 * calculation.
70 #ifdef Honor_FLT_ROUNDS
71 #undef Check_FLT_ROUNDS
72 #define Check_FLT_ROUNDS
73 #else
74 #define Rounding Flt_Rounds
75 #endif
77 char *
78 dtoa
79 #ifdef KR_headers
80 (d0, mode, ndigits, decpt, sign, rve)
81 double d0; int mode, ndigits, *decpt, *sign; char **rve;
82 #else
83 (double d0, int mode, int ndigits, int *decpt, int *sign, char **rve)
84 #endif
86 /* Arguments ndigits, decpt, sign are similar to those
87 of ecvt and fcvt; trailing zeros are suppressed from
88 the returned string. If not null, *rve is set to point
89 to the end of the return value. If d is +-Infinity or NaN,
90 then *decpt is set to 9999.
92 mode:
93 0 ==> shortest string that yields d when read in
94 and rounded to nearest.
95 1 ==> like 0, but with Steele & White stopping rule;
96 e.g. with IEEE P754 arithmetic , mode 0 gives
97 1e23 whereas mode 1 gives 9.999999999999999e22.
98 2 ==> max(1,ndigits) significant digits. This gives a
99 return value similar to that of ecvt, except
100 that trailing zeros are suppressed.
101 3 ==> through ndigits past the decimal point. This
102 gives a return value similar to that from fcvt,
103 except that trailing zeros are suppressed, and
104 ndigits can be negative.
105 4,5 ==> similar to 2 and 3, respectively, but (in
106 round-nearest mode) with the tests of mode 0 to
107 possibly return a shorter string that rounds to d.
108 With IEEE arithmetic and compilation with
109 -DHonor_FLT_ROUNDS, modes 4 and 5 behave the same
110 as modes 2 and 3 when FLT_ROUNDS != 1.
111 6-9 ==> Debugging modes similar to mode - 4: don't try
112 fast floating-point estimate (if applicable).
114 Values of mode other than 0-9 are treated as mode 0.
116 Sufficient space is allocated to the return value
117 to hold the suppressed trailing zeros.
120 int bbits, b2, b5, be, dig, i, ieps, ilim0,
121 j, jj1, k, k0, k_check, leftright, m2, m5, s2, s5,
122 spec_case, try_quick;
123 int ilim = 0, ilim1 = 0; /* pacify gcc */
124 Long L;
125 #ifndef Sudden_Underflow
126 int denorm;
127 ULong x;
128 #endif
129 Bigint *b, *b1, *delta, *mhi, *S;
130 Bigint *mlo = NULL; /* pacify gcc */
131 U d, d2, eps;
132 double ds;
133 char *s, *s0;
134 #ifdef SET_INEXACT
135 int inexact, oldinexact;
136 #endif
137 #ifdef Honor_FLT_ROUNDS /*{*/
138 int Rounding;
139 #ifdef Trust_FLT_ROUNDS /*{{ only define this if FLT_ROUNDS really works! */
140 Rounding = Flt_Rounds;
141 #else /*}{*/
142 Rounding = 1;
143 switch(fegetround()) {
144 case FE_TOWARDZERO: Rounding = 0; break;
145 case FE_UPWARD: Rounding = 2; break;
146 case FE_DOWNWARD: Rounding = 3;
148 #endif /*}}*/
149 #endif /*}*/
151 #ifndef MULTIPLE_THREADS
152 if (dtoa_result) {
153 freedtoa(dtoa_result);
154 dtoa_result = 0;
156 #endif
157 d.d = d0;
158 if (word0(&d) & Sign_bit) {
159 /* set sign for everything, including 0's and NaNs */
160 *sign = 1;
161 word0(&d) &= ~Sign_bit; /* clear sign bit */
163 else
164 *sign = 0;
166 #if defined(IEEE_Arith) + defined(VAX)
167 #ifdef IEEE_Arith
168 if ((word0(&d) & Exp_mask) == Exp_mask)
169 #else
170 if (word0(&d) == 0x8000)
171 #endif
173 /* Infinity or NaN */
174 *decpt = 9999;
175 #ifdef IEEE_Arith
176 if (!word1(&d) && !(word0(&d) & 0xfffff))
177 return nrv_alloc("Infinity", rve, 8);
178 #endif
179 return nrv_alloc("NaN", rve, 3);
181 #endif
182 #ifdef IBM
183 dval(&d) += 0; /* normalize */
184 #endif
185 if (!dval(&d)) {
186 *decpt = 1;
187 return nrv_alloc("0", rve, 1);
190 #ifdef SET_INEXACT
191 try_quick = oldinexact = get_inexact();
192 inexact = 1;
193 #endif
194 #ifdef Honor_FLT_ROUNDS
195 if (Rounding >= 2) {
196 if (*sign)
197 Rounding = Rounding == 2 ? 0 : 2;
198 else
199 if (Rounding != 2)
200 Rounding = 0;
202 #endif
204 b = d2b(dval(&d), &be, &bbits);
205 if (b == NULL)
206 return NULL;
207 #ifdef Sudden_Underflow
208 i = (int)(word0(&d) >> Exp_shift1 & (Exp_mask>>Exp_shift1));
209 #else
210 if (( i = (int)(word0(&d) >> Exp_shift1 & (Exp_mask>>Exp_shift1)) )!=0) {
211 #endif
212 dval(&d2) = dval(&d);
213 word0(&d2) &= Frac_mask1;
214 word0(&d2) |= Exp_11;
215 #ifdef IBM
216 if (( j = 11 - hi0bits(word0(&d2) & Frac_mask) )!=0)
217 dval(&d2) /= 1 << j;
218 #endif
220 /* log(x) ~=~ log(1.5) + (x-1.5)/1.5
221 * log10(x) = log(x) / log(10)
222 * ~=~ log(1.5)/log(10) + (x-1.5)/(1.5*log(10))
223 * log10(&d) = (i-Bias)*log(2)/log(10) + log10(&d2)
225 * This suggests computing an approximation k to log10(&d) by
227 * k = (i - Bias)*0.301029995663981
228 * + ( (d2-1.5)*0.289529654602168 + 0.176091259055681 );
230 * We want k to be too large rather than too small.
231 * The error in the first-order Taylor series approximation
232 * is in our favor, so we just round up the constant enough
233 * to compensate for any error in the multiplication of
234 * (i - Bias) by 0.301029995663981; since |i - Bias| <= 1077,
235 * and 1077 * 0.30103 * 2^-52 ~=~ 7.2e-14,
236 * adding 1e-13 to the constant term more than suffices.
237 * Hence we adjust the constant term to 0.1760912590558.
238 * (We could get a more accurate k by invoking log10,
239 * but this is probably not worthwhile.)
242 i -= Bias;
243 #ifdef IBM
244 i <<= 2;
245 i += j;
246 #endif
247 #ifndef Sudden_Underflow
248 denorm = 0;
250 else {
251 /* d is denormalized */
253 i = bbits + be + (Bias + (P-1) - 1);
254 x = i > 32 ? word0(&d) << (64 - i) | word1(&d) >> (i - 32)
255 : word1(&d) << (32 - i);
256 dval(&d2) = x;
257 word0(&d2) -= 31*Exp_msk1; /* adjust exponent */
258 i -= (Bias + (P-1) - 1) + 1;
259 denorm = 1;
261 #endif
262 ds = (dval(&d2)-1.5)*0.289529654602168 + 0.1760912590558 + i*0.301029995663981;
263 k = (int)ds;
264 if (ds < 0. && ds != k)
265 k--; /* want k = floor(ds) */
266 k_check = 1;
267 if (k >= 0 && k <= Ten_pmax) {
268 if (dval(&d) < tens[k])
269 k--;
270 k_check = 0;
272 j = bbits - i - 1;
273 if (j >= 0) {
274 b2 = 0;
275 s2 = j;
277 else {
278 b2 = -j;
279 s2 = 0;
281 if (k >= 0) {
282 b5 = 0;
283 s5 = k;
284 s2 += k;
286 else {
287 b2 -= k;
288 b5 = -k;
289 s5 = 0;
291 if (mode < 0 || mode > 9)
292 mode = 0;
294 #ifndef SET_INEXACT
295 #ifdef Check_FLT_ROUNDS
296 try_quick = Rounding == 1;
297 #else
298 try_quick = 1;
299 #endif
300 #endif /*SET_INEXACT*/
302 if (mode > 5) {
303 mode -= 4;
304 try_quick = 0;
306 leftright = 1;
307 ilim = ilim1 = -1; /* Values for cases 0 and 1; done here to */
308 /* silence erroneous "gcc -Wall" warning. */
309 switch(mode) {
310 case 0:
311 case 1:
312 i = 18;
313 ndigits = 0;
314 break;
315 case 2:
316 leftright = 0;
317 /* FALLTHROUGH */
318 case 4:
319 if (ndigits <= 0)
320 ndigits = 1;
321 ilim = ilim1 = i = ndigits;
322 break;
323 case 3:
324 leftright = 0;
325 /* FALLTHROUGH */
326 case 5:
327 i = ndigits + k + 1;
328 ilim = i;
329 ilim1 = i - 1;
330 if (i <= 0)
331 i = 1;
333 s = s0 = rv_alloc((size_t)i);
334 if (s == NULL)
335 return NULL;
337 #ifdef Honor_FLT_ROUNDS
338 if (mode > 1 && Rounding != 1)
339 leftright = 0;
340 #endif
342 if (ilim >= 0 && ilim <= Quick_max && try_quick) {
344 /* Try to get by with floating-point arithmetic. */
346 i = 0;
347 dval(&d2) = dval(&d);
348 k0 = k;
349 ilim0 = ilim;
350 ieps = 2; /* conservative */
351 if (k > 0) {
352 ds = tens[k&0xf];
353 j = (unsigned int)k >> 4;
354 if (j & Bletch) {
355 /* prevent overflows */
356 j &= Bletch - 1;
357 dval(&d) /= bigtens[n_bigtens-1];
358 ieps++;
360 for(; j; j = (unsigned int)j >> 1, i++)
361 if (j & 1) {
362 ieps++;
363 ds *= bigtens[i];
365 dval(&d) /= ds;
367 else if (( jj1 = -k )!=0) {
368 dval(&d) *= tens[jj1 & 0xf];
369 for(j = jj1 >> 4; j; j >>= 1, i++)
370 if (j & 1) {
371 ieps++;
372 dval(&d) *= bigtens[i];
375 if (k_check && dval(&d) < 1. && ilim > 0) {
376 if (ilim1 <= 0)
377 goto fast_failed;
378 ilim = ilim1;
379 k--;
380 dval(&d) *= 10.;
381 ieps++;
383 dval(&eps) = ieps*dval(&d) + 7.;
384 word0(&eps) -= (P-1)*Exp_msk1;
385 if (ilim == 0) {
386 S = mhi = 0;
387 dval(&d) -= 5.;
388 if (dval(&d) > dval(&eps))
389 goto one_digit;
390 if (dval(&d) < -dval(&eps))
391 goto no_digits;
392 goto fast_failed;
394 #ifndef No_leftright
395 if (leftright) {
396 /* Use Steele & White method of only
397 * generating digits needed.
399 dval(&eps) = 0.5/tens[ilim-1] - dval(&eps);
400 for(i = 0;;) {
401 L = dval(&d);
402 dval(&d) -= L;
403 *s++ = '0' + (int)L;
404 if (dval(&d) < dval(&eps))
405 goto ret1;
406 if (1. - dval(&d) < dval(&eps))
407 goto bump_up;
408 if (++i >= ilim)
409 break;
410 dval(&eps) *= 10.;
411 dval(&d) *= 10.;
414 else {
415 #endif
416 /* Generate ilim digits, then fix them up. */
417 dval(&eps) *= tens[ilim-1];
418 for(i = 1;; i++, dval(&d) *= 10.) {
419 L = (Long)(dval(&d));
420 if (!(dval(&d) -= L))
421 ilim = i;
422 *s++ = '0' + (int)L;
423 if (i == ilim) {
424 if (dval(&d) > 0.5 + dval(&eps))
425 goto bump_up;
426 else if (dval(&d) < 0.5 - dval(&eps)) {
427 while(*--s == '0');
428 s++;
429 goto ret1;
431 break;
434 #ifndef No_leftright
436 #endif
437 fast_failed:
438 s = s0;
439 dval(&d) = dval(&d2);
440 k = k0;
441 ilim = ilim0;
444 /* Do we have a "small" integer? */
446 if (be >= 0 && k <= Int_max) {
447 /* Yes. */
448 ds = tens[k];
449 if (ndigits < 0 && ilim <= 0) {
450 S = mhi = 0;
451 if (ilim < 0 || dval(&d) <= 5*ds)
452 goto no_digits;
453 goto one_digit;
455 for(i = 1;; i++, dval(&d) *= 10.) {
456 L = (Long)(dval(&d) / ds);
457 dval(&d) -= L*ds;
458 #ifdef Check_FLT_ROUNDS
459 /* If FLT_ROUNDS == 2, L will usually be high by 1 */
460 if (dval(&d) < 0) {
461 L--;
462 dval(&d) += ds;
464 #endif
465 *s++ = '0' + (int)L;
466 if (!dval(&d)) {
467 #ifdef SET_INEXACT
468 inexact = 0;
469 #endif
470 break;
472 if (i == ilim) {
473 #ifdef Honor_FLT_ROUNDS
474 if (mode > 1)
475 switch(Rounding) {
476 case 0: goto ret1;
477 case 2: goto bump_up;
479 #endif
480 dval(&d) += dval(&d);
481 #ifdef ROUND_BIASED
482 if (dval(&d) >= ds)
483 #else
484 if (dval(&d) > ds || (dval(&d) == ds && L & 1))
485 #endif
487 bump_up:
488 while(*--s == '9')
489 if (s == s0) {
490 k++;
491 *s = '0';
492 break;
494 ++*s++;
496 break;
499 goto ret1;
502 m2 = b2;
503 m5 = b5;
504 mhi = mlo = 0;
505 if (leftright) {
507 #ifndef Sudden_Underflow
508 denorm ? be + (Bias + (P-1) - 1 + 1) :
509 #endif
510 #ifdef IBM
511 1 + 4*P - 3 - bbits + ((bbits + be - 1) & 3);
512 #else
513 1 + P - bbits;
514 #endif
515 b2 += i;
516 s2 += i;
517 mhi = i2b(1);
518 if (mhi == NULL)
519 return NULL;
521 if (m2 > 0 && s2 > 0) {
522 i = m2 < s2 ? m2 : s2;
523 b2 -= i;
524 m2 -= i;
525 s2 -= i;
527 if (b5 > 0) {
528 if (leftright) {
529 if (m5 > 0) {
530 mhi = pow5mult(mhi, m5);
531 if (mhi == NULL)
532 return NULL;
533 b1 = mult(mhi, b);
534 if (b1 == NULL)
535 return NULL;
536 Bfree(b);
537 b = b1;
539 if (( j = b5 - m5 )!=0) {
540 b = pow5mult(b, j);
541 if (b == NULL)
542 return NULL;
545 else {
546 b = pow5mult(b, b5);
547 if (b == NULL)
548 return NULL;
551 S = i2b(1);
552 if (S == NULL)
553 return NULL;
554 if (s5 > 0) {
555 S = pow5mult(S, s5);
556 if (S == NULL)
557 return NULL;
560 /* Check for special case that d is a normalized power of 2. */
562 spec_case = 0;
563 if ((mode < 2 || leftright)
564 #ifdef Honor_FLT_ROUNDS
565 && Rounding == 1
566 #endif
568 if (!word1(&d) && !(word0(&d) & Bndry_mask)
569 #ifndef Sudden_Underflow
570 && word0(&d) & (Exp_mask & ~Exp_msk1)
571 #endif
573 /* The special case */
574 b2 += Log2P;
575 s2 += Log2P;
576 spec_case = 1;
580 /* Arrange for convenient computation of quotients:
581 * shift left if necessary so divisor has 4 leading 0 bits.
583 * Perhaps we should just compute leading 28 bits of S once
584 * and for all and pass them and a shift to quorem, so it
585 * can do shifts and ors to compute the numerator for q.
587 #ifdef Pack_32
588 if (( i = ((s5 ? 32 - hi0bits(S->x[S->wds-1]) : 1) + s2) & 0x1f )!=0)
589 i = 32 - i;
590 #else
591 if (( i = ((s5 ? 32 - hi0bits(S->x[S->wds-1]) : 1) + s2) & 0xf )!=0)
592 i = 16 - i;
593 #endif
594 if (i > 4) {
595 i -= 4;
596 b2 += i;
597 m2 += i;
598 s2 += i;
600 else if (i < 4) {
601 i += 28;
602 b2 += i;
603 m2 += i;
604 s2 += i;
606 if (b2 > 0) {
607 b = lshift(b, b2);
608 if (b == NULL)
609 return NULL;
611 if (s2 > 0) {
612 S = lshift(S, s2);
613 if (S == NULL)
614 return NULL;
616 if (k_check) {
617 if (cmp(b,S) < 0) {
618 k--;
619 b = multadd(b, 10, 0); /* we botched the k estimate */
620 if (b == NULL)
621 return NULL;
622 if (leftright) {
623 mhi = multadd(mhi, 10, 0);
624 if (mhi == NULL)
625 return NULL;
627 ilim = ilim1;
630 if (ilim <= 0 && (mode == 3 || mode == 5)) {
631 if (ilim < 0 || cmp(b,S = multadd(S,5,0)) <= 0) {
632 /* no digits, fcvt style */
633 no_digits:
634 k = -1 - ndigits;
635 goto ret;
637 one_digit:
638 *s++ = '1';
639 k++;
640 goto ret;
642 if (leftright) {
643 if (m2 > 0) {
644 mhi = lshift(mhi, m2);
645 if (mhi == NULL)
646 return NULL;
649 /* Compute mlo -- check for special case
650 * that d is a normalized power of 2.
653 mlo = mhi;
654 if (spec_case) {
655 mhi = Balloc(mhi->k);
656 if (mhi == NULL)
657 return NULL;
658 Bcopy(mhi, mlo);
659 mhi = lshift(mhi, Log2P);
660 if (mhi == NULL)
661 return NULL;
664 for(i = 1;;i++) {
665 dig = quorem(b,S) + '0';
666 /* Do we yet have the shortest decimal string
667 * that will round to d?
669 j = cmp(b, mlo);
670 delta = diff(S, mhi);
671 if (delta == NULL)
672 return NULL;
673 jj1 = delta->sign ? 1 : cmp(b, delta);
674 Bfree(delta);
675 #ifndef ROUND_BIASED
676 if (jj1 == 0 && mode != 1 && !(word1(&d) & 1)
677 #ifdef Honor_FLT_ROUNDS
678 && Rounding >= 1
679 #endif
681 if (dig == '9')
682 goto round_9_up;
683 if (j > 0)
684 dig++;
685 #ifdef SET_INEXACT
686 else if (!b->x[0] && b->wds <= 1)
687 inexact = 0;
688 #endif
689 *s++ = dig;
690 goto ret;
692 #endif
693 if (j < 0 || (j == 0 && mode != 1
694 #ifndef ROUND_BIASED
695 && !(word1(&d) & 1)
696 #endif
697 )) {
698 if (!b->x[0] && b->wds <= 1) {
699 #ifdef SET_INEXACT
700 inexact = 0;
701 #endif
702 goto accept_dig;
704 #ifdef Honor_FLT_ROUNDS
705 if (mode > 1)
706 switch(Rounding) {
707 case 0: goto accept_dig;
708 case 2: goto keep_dig;
710 #endif /*Honor_FLT_ROUNDS*/
711 if (jj1 > 0) {
712 b = lshift(b, 1);
713 if (b == NULL)
714 return NULL;
715 jj1 = cmp(b, S);
716 #ifdef ROUND_BIASED
717 if (jj1 >= 0 /*)*/
718 #else
719 if ((jj1 > 0 || (jj1 == 0 && dig & 1))
720 #endif
721 && dig++ == '9')
722 goto round_9_up;
724 accept_dig:
725 *s++ = dig;
726 goto ret;
728 if (jj1 > 0) {
729 #ifdef Honor_FLT_ROUNDS
730 if (!Rounding)
731 goto accept_dig;
732 #endif
733 if (dig == '9') { /* possible if i == 1 */
734 round_9_up:
735 *s++ = '9';
736 goto roundoff;
738 *s++ = dig + 1;
739 goto ret;
741 #ifdef Honor_FLT_ROUNDS
742 keep_dig:
743 #endif
744 *s++ = dig;
745 if (i == ilim)
746 break;
747 b = multadd(b, 10, 0);
748 if (b == NULL)
749 return NULL;
750 if (mlo == mhi) {
751 mlo = mhi = multadd(mhi, 10, 0);
752 if (mlo == NULL)
753 return NULL;
755 else {
756 mlo = multadd(mlo, 10, 0);
757 if (mlo == NULL)
758 return NULL;
759 mhi = multadd(mhi, 10, 0);
760 if (mhi == NULL)
761 return NULL;
765 else
766 for(i = 1;; i++) {
767 *s++ = dig = quorem(b,S) + '0';
768 if (!b->x[0] && b->wds <= 1) {
769 #ifdef SET_INEXACT
770 inexact = 0;
771 #endif
772 goto ret;
774 if (i >= ilim)
775 break;
776 b = multadd(b, 10, 0);
777 if (b == NULL)
778 return NULL;
781 /* Round off last digit */
783 #ifdef Honor_FLT_ROUNDS
784 switch(Rounding) {
785 case 0: goto trimzeros;
786 case 2: goto roundoff;
788 #endif
789 b = lshift(b, 1);
790 j = cmp(b, S);
791 #ifdef ROUND_BIASED
792 if (j >= 0)
793 #else
794 if (j > 0 || (j == 0 && dig & 1))
795 #endif
797 roundoff:
798 while(*--s == '9')
799 if (s == s0) {
800 k++;
801 *s++ = '1';
802 goto ret;
804 ++*s++;
806 else {
807 #ifdef Honor_FLT_ROUNDS
808 trimzeros:
809 #endif
810 while(*--s == '0');
811 s++;
813 ret:
814 Bfree(S);
815 if (mhi) {
816 if (mlo && mlo != mhi)
817 Bfree(mlo);
818 Bfree(mhi);
820 ret1:
821 #ifdef SET_INEXACT
822 if (inexact) {
823 if (!oldinexact) {
824 word0(&d) = Exp_1 + (70 << Exp_shift);
825 word1(&d) = 0;
826 dval(&d) += 1.;
829 else if (!oldinexact)
830 clear_inexact();
831 #endif
832 Bfree(b);
833 if (s == s0) { /* don't return empty string */
834 *s++ = '0';
835 k = 0;
837 *s = 0;
838 *decpt = k + 1;
839 if (rve)
840 *rve = s;
841 return s0;