]> CyberLeo.Net >> Repos - FreeBSD/releng/7.2.git/blob - contrib/gdtoa/dtoa.c
Create releng/7.2 from stable/7 in preparation for 7.2-RELEASE.
[FreeBSD/releng/7.2.git] / contrib / gdtoa / dtoa.c
1 /****************************************************************
2
3 The author of this software is David M. Gay.
4
5 Copyright (C) 1998, 1999 by Lucent Technologies
6 All Rights Reserved
7
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
16 permission.
17
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
25 THIS SOFTWARE.
26
27 ****************************************************************/
28
29 /* Please send bug reports to David M. Gay (dmg at acm dot org,
30  * with " at " changed at "@" and " dot " changed to ".").      */
31
32 #include "gdtoaimp.h"
33
34 /* dtoa for IEEE arithmetic (dmg): convert double to ASCII string.
35  *
36  * Inspired by "How to Print Floating-Point Numbers Accurately" by
37  * Guy L. Steele, Jr. and Jon L. White [Proc. ACM SIGPLAN '90, pp. 112-126].
38  *
39  * Modifications:
40  *      1. Rather than iterating, we use a simple numeric overestimate
41  *         to determine k = floor(log10(d)).  We scale relevant
42  *         quantities using O(log2(k)) rather than O(k) multiplications.
43  *      2. For some modes > 2 (corresponding to ecvt and fcvt), we don't
44  *         try to generate digits strictly left to right.  Instead, we
45  *         compute with fewer bits and propagate the carry if necessary
46  *         when rounding the final digit up.  This is often faster.
47  *      3. Under the assumption that input will be rounded nearest,
48  *         mode 0 renders 1e23 as 1e23 rather than 9.999999999999999e22.
49  *         That is, we allow equality in stopping tests when the
50  *         round-nearest rule will give the same floating-point value
51  *         as would satisfaction of the stopping test with strict
52  *         inequality.
53  *      4. We remove common factors of powers of 2 from relevant
54  *         quantities.
55  *      5. When converting floating-point integers less than 1e16,
56  *         we use floating-point arithmetic rather than resorting
57  *         to multiple-precision integers.
58  *      6. When asked to produce fewer than 15 digits, we first try
59  *         to get by with floating-point arithmetic; we resort to
60  *         multiple-precision integer arithmetic only if we cannot
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 *
77 dtoa
78 #ifdef KR_headers
79         (d, mode, ndigits, decpt, sign, rve)
80         double d; int mode, ndigits, *decpt, *sign; char **rve;
81 #else
82         (double d, int mode, int ndigits, int *decpt, int *sign, char **rve)
83 #endif
84 {
85  /*     Arguments ndigits, decpt, sign are similar to those
86         of ecvt and fcvt; trailing zeros are suppressed from
87         the returned string.  If not null, *rve is set to point
88         to the end of the return value.  If d is +-Infinity or NaN,
89         then *decpt is set to 9999.
90
91         mode:
92                 0 ==> shortest string that yields d when read in
93                         and rounded to nearest.
94                 1 ==> like 0, but with Steele & White stopping rule;
95                         e.g. with IEEE P754 arithmetic , mode 0 gives
96                         1e23 whereas mode 1 gives 9.999999999999999e22.
97                 2 ==> max(1,ndigits) significant digits.  This gives a
98                         return value similar to that of ecvt, except
99                         that trailing zeros are suppressed.
100                 3 ==> through ndigits past the decimal point.  This
101                         gives a return value similar to that from fcvt,
102                         except that trailing zeros are suppressed, and
103                         ndigits can be negative.
104                 4,5 ==> similar to 2 and 3, respectively, but (in
105                         round-nearest mode) with the tests of mode 0 to
106                         possibly return a shorter string that rounds to d.
107                         With IEEE arithmetic and compilation with
108                         -DHonor_FLT_ROUNDS, modes 4 and 5 behave the same
109                         as modes 2 and 3 when FLT_ROUNDS != 1.
110                 6-9 ==> Debugging modes similar to mode - 4:  don't try
111                         fast floating-point estimate (if applicable).
112
113                 Values of mode other than 0-9 are treated as mode 0.
114
115                 Sufficient space is allocated to the return value
116                 to hold the suppressed trailing zeros.
117         */
118
119         int bbits, b2, b5, be, dig, i, ieps, ilim, ilim0, ilim1,
120                 j, j1, k, k0, k_check, leftright, m2, m5, s2, s5,
121                 spec_case, try_quick;
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;
130 #ifdef Honor_FLT_ROUNDS
131         int rounding;
132 #endif
133 #ifdef SET_INEXACT
134         int inexact, oldinexact;
135 #endif
136
137 #ifndef MULTIPLE_THREADS
138         if (dtoa_result) {
139                 freedtoa(dtoa_result);
140                 dtoa_result = 0;
141                 }
142 #endif
143
144         if (word0(d) & Sign_bit) {
145                 /* set sign for everything, including 0's and NaNs */
146                 *sign = 1;
147                 word0(d) &= ~Sign_bit;  /* clear sign bit */
148                 }
149         else
150                 *sign = 0;
151
152 #if defined(IEEE_Arith) + defined(VAX)
153 #ifdef IEEE_Arith
154         if ((word0(d) & Exp_mask) == Exp_mask)
155 #else
156         if (word0(d)  == 0x8000)
157 #endif
158                 {
159                 /* Infinity or NaN */
160                 *decpt = 9999;
161 #ifdef IEEE_Arith
162                 if (!word1(d) && !(word0(d) & 0xfffff))
163                         return nrv_alloc("Infinity", rve, 8);
164 #endif
165                 return nrv_alloc("NaN", rve, 3);
166                 }
167 #endif
168 #ifdef IBM
169         dval(d) += 0; /* normalize */
170 #endif
171         if (!dval(d)) {
172                 *decpt = 1;
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
181         if ((rounding = Flt_Rounds) >= 2) {
182                 if (*sign)
183                         rounding = rounding == 2 ? 0 : 2;
184                 else
185                         if (rounding != 2)
186                                 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) {
195 #endif
196                 dval(d2) = dval(d);
197                 word0(d2) &= Frac_mask1;
198                 word0(d2) |= Exp_11;
199 #ifdef IBM
200                 if (( j = 11 - hi0bits(word0(d2) & Frac_mask) )!=0)
201                         dval(d2) /= 1 << j;
202 #endif
203
204                 /* log(x)       ~=~ log(1.5) + (x-1.5)/1.5
205                  * log10(x)      =  log(x) / log(10)
206                  *              ~=~ log(1.5)/log(10) + (x-1.5)/(1.5*log(10))
207                  * log10(d) = (i-Bias)*log(2)/log(10) + log10(d2)
208                  *
209                  * This suggests computing an approximation k to log10(d) by
210                  *
211                  * k = (i - Bias)*0.301029995663981
212                  *      + ( (d2-1.5)*0.289529654602168 + 0.176091259055681 );
213                  *
214                  * We want k to be too large rather than too small.
215                  * The error in the first-order Taylor series approximation
216                  * is in our favor, so we just round up the constant enough
217                  * to compensate for any error in the multiplication of
218                  * (i - Bias) by 0.301029995663981; since |i - Bias| <= 1077,
219                  * and 1077 * 0.30103 * 2^-52 ~=~ 7.2e-14,
220                  * adding 1e-13 to the constant term more than suffices.
221                  * Hence we adjust the constant term to 0.1760912590558.
222                  * (We could get a more accurate k by invoking log10,
223                  *  but this is probably not worthwhile.)
224                  */
225
226                 i -= Bias;
227 #ifdef IBM
228                 i <<= 2;
229                 i += j;
230 #endif
231 #ifndef Sudden_Underflow
232                 denorm = 0;
233                 }
234         else {
235                 /* d is denormalized */
236
237                 i = bbits + be + (Bias + (P-1) - 1);
238                 x = i > 32  ? word0(d) << 64 - i | word1(d) >> i - 32
239                             : word1(d) << 32 - i;
240                 dval(d2) = x;
241                 word0(d2) -= 31*Exp_msk1; /* adjust exponent */
242                 i -= (Bias + (P-1) - 1) + 1;
243                 denorm = 1;
244                 }
245 #endif
246         ds = (dval(d2)-1.5)*0.289529654602168 + 0.1760912590558 + i*0.301029995663981;
247         k = (int)ds;
248         if (ds < 0. && ds != k)
249                 k--;    /* want k = floor(ds) */
250         k_check = 1;
251         if (k >= 0 && k <= Ten_pmax) {
252                 if (dval(d) < tens[k])
253                         k--;
254                 k_check = 0;
255                 }
256         j = bbits - i - 1;
257         if (j >= 0) {
258                 b2 = 0;
259                 s2 = j;
260                 }
261         else {
262                 b2 = -j;
263                 s2 = 0;
264                 }
265         if (k >= 0) {
266                 b5 = 0;
267                 s5 = k;
268                 s2 += k;
269                 }
270         else {
271                 b2 -= k;
272                 b5 = -k;
273                 s5 = 0;
274                 }
275         if (mode < 0 || mode > 9)
276                 mode = 0;
277
278 #ifndef SET_INEXACT
279 #ifdef Check_FLT_ROUNDS
280         try_quick = Rounding == 1;
281 #else
282         try_quick = 1;
283 #endif
284 #endif /*SET_INEXACT*/
285
286         if (mode > 5) {
287                 mode -= 4;
288                 try_quick = 0;
289                 }
290         leftright = 1;
291         switch(mode) {
292                 case 0:
293                 case 1:
294                         ilim = ilim1 = -1;
295                         i = 18;
296                         ndigits = 0;
297                         break;
298                 case 2:
299                         leftright = 0;
300                         /* no break */
301                 case 4:
302                         if (ndigits <= 0)
303                                 ndigits = 1;
304                         ilim = ilim1 = i = ndigits;
305                         break;
306                 case 3:
307                         leftright = 0;
308                         /* no break */
309                 case 5:
310                         i = ndigits + k + 1;
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
319         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;
328                 dval(d2) = dval(d);
329                 k0 = k;
330                 ilim0 = ilim;
331                 ieps = 2; /* conservative */
332                 if (k > 0) {
333                         ds = tens[k&0xf];
334                         j = k >> 4;
335                         if (j & Bletch) {
336                                 /* prevent overflows */
337                                 j &= Bletch - 1;
338                                 dval(d) /= bigtens[n_bigtens-1];
339                                 ieps++;
340                                 }
341                         for(; j; j >>= 1, i++)
342                                 if (j & 1) {
343                                         ieps++;
344                                         ds *= bigtens[i];
345                                         }
346                         dval(d) /= ds;
347                         }
348                 else if (( j1 = -k )!=0) {
349                         dval(d) *= tens[j1 & 0xf];
350                         for(j = j1 >> 4; j; j >>= 1, i++)
351                                 if (j & 1) {
352                                         ieps++;
353                                         dval(d) *= bigtens[i];
354                                         }
355                         }
356                 if (k_check && dval(d) < 1. && ilim > 0) {
357                         if (ilim1 <= 0)
358                                 goto fast_failed;
359                         ilim = ilim1;
360                         k--;
361                         dval(d) *= 10.;
362                         ieps++;
363                         }
364                 dval(eps) = ieps*dval(d) + 7.;
365                 word0(eps) -= (P-1)*Exp_msk1;
366                 if (ilim == 0) {
367                         S = mhi = 0;
368                         dval(d) -= 5.;
369                         if (dval(d) > dval(eps))
370                                 goto one_digit;
371                         if (dval(d) < -dval(eps))
372                                 goto no_digits;
373                         goto fast_failed;
374                         }
375 #ifndef No_leftright
376                 if (leftright) {
377                         /* Use Steele & White method of only
378                          * generating digits needed.
379                          */
380                         dval(eps) = 0.5/tens[ilim-1] - dval(eps);
381                         for(i = 0;;) {
382                                 L = dval(d);
383                                 dval(d) -= L;
384                                 *s++ = '0' + (int)L;
385                                 if (dval(d) < dval(eps))
386                                         goto ret1;
387                                 if (1. - dval(d) < dval(eps))
388                                         goto bump_up;
389                                 if (++i >= ilim)
390                                         break;
391                                 dval(eps) *= 10.;
392                                 dval(d) *= 10.;
393                                 }
394                         }
395                 else {
396 #endif
397                         /* Generate ilim digits, then fix them up. */
398                         dval(eps) *= tens[ilim-1];
399                         for(i = 1;; i++, dval(d) *= 10.) {
400                                 L = (Long)(dval(d));
401                                 if (!(dval(d) -= L))
402                                         ilim = i;
403                                 *s++ = '0' + (int)L;
404                                 if (i == ilim) {
405                                         if (dval(d) > 0.5 + dval(eps))
406                                                 goto bump_up;
407                                         else if (dval(d) < 0.5 - dval(eps)) {
408                                                 while(*--s == '0');
409                                                 s++;
410                                                 goto ret1;
411                                                 }
412                                         break;
413                                         }
414                                 }
415 #ifndef No_leftright
416                         }
417 #endif
418  fast_failed:
419                 s = s0;
420                 dval(d) = dval(d2);
421                 k = k0;
422                 ilim = ilim0;
423                 }
424
425         /* Do we have a "small" integer? */
426
427         if (be >= 0 && k <= Int_max) {
428                 /* Yes. */
429                 ds = tens[k];
430                 if (ndigits < 0 && ilim <= 0) {
431                         S = mhi = 0;
432                         if (ilim < 0 || dval(d) <= 5*ds)
433                                 goto no_digits;
434                         goto one_digit;
435                         }
436                 for(i = 1;; i++, dval(d) *= 10.) {
437                         L = (Long)(dval(d) / ds);
438                         dval(d) -= L*ds;
439 #ifdef Check_FLT_ROUNDS
440                         /* If FLT_ROUNDS == 2, L will usually be high by 1 */
441                         if (dval(d) < 0) {
442                                 L--;
443                                 dval(d) += ds;
444                                 }
445 #endif
446                         *s++ = '0' + (int)L;
447                         if (!dval(d)) {
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)
456                                 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')
465                                                 if (s == s0) {
466                                                         k++;
467                                                         *s = '0';
468                                                         break;
469                                                         }
470                                         ++*s++;
471                                         }
472                                 break;
473                                 }
474                         }
475                 goto ret1;
476                 }
477
478         m2 = b2;
479         m5 = b5;
480         mhi = mlo = 0;
481         if (leftright) {
482                 i =
483 #ifndef Sudden_Underflow
484                         denorm ? be + (Bias + (P-1) - 1 + 1) :
485 #endif
486 #ifdef IBM
487                         1 + 4*P - 3 - bbits + ((bbits + be - 1) & 3);
488 #else
489                         1 + P - bbits;
490 #endif
491                 b2 += i;
492                 s2 += i;
493                 mhi = i2b(1);
494                 }
495         if (m2 > 0 && s2 > 0) {
496                 i = m2 < s2 ? m2 : s2;
497                 b2 -= i;
498                 m2 -= i;
499                 s2 -= i;
500                 }
501         if (b5 > 0) {
502                 if (leftright) {
503                         if (m5 > 0) {
504                                 mhi = pow5mult(mhi, m5);
505                                 b1 = mult(mhi, b);
506                                 Bfree(b);
507                                 b = b1;
508                                 }
509                         if (( j = b5 - m5 )!=0)
510                                 b = pow5mult(b, j);
511                         }
512                 else
513                         b = pow5mult(b, b5);
514                 }
515         S = i2b(1);
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
524                         && 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 */
533                         b2 += Log2P;
534                         s2 += Log2P;
535                         spec_case = 1;
536                         }
537                 }
538
539         /* Arrange for convenient computation of quotients:
540          * shift left if necessary so divisor has 4 leading 0 bits.
541          *
542          * Perhaps we should just compute leading 28 bits of S once
543          * and for all and pass them and a shift to quorem, so it
544          * can do shifts and ors to compute the numerator for q.
545          */
546 #ifdef Pack_32
547         if (( i = ((s5 ? 32 - hi0bits(S->x[S->wds-1]) : 1) + s2) & 0x1f )!=0)
548                 i = 32 - i;
549 #else
550         if (( i = ((s5 ? 32 - hi0bits(S->x[S->wds-1]) : 1) + s2) & 0xf )!=0)
551                 i = 16 - i;
552 #endif
553         if (i > 4) {
554                 i -= 4;
555                 b2 += i;
556                 m2 += i;
557                 s2 += i;
558                 }
559         else if (i < 4) {
560                 i += 28;
561                 b2 += i;
562                 m2 += i;
563                 s2 += i;
564                 }
565         if (b2 > 0)
566                 b = lshift(b, b2);
567         if (s2 > 0)
568                 S = lshift(S, s2);
569         if (k_check) {
570                 if (cmp(b,S) < 0) {
571                         k--;
572                         b = multadd(b, 10, 0);  /* we botched the k estimate */
573                         if (leftright)
574                                 mhi = multadd(mhi, 10, 0);
575                         ilim = ilim1;
576                         }
577                 }
578         if (ilim <= 0 && (mode == 3 || mode == 5)) {
579                 if (ilim < 0 || cmp(b,S = multadd(S,5,0)) <= 0) {
580                         /* no digits, fcvt style */
581  no_digits:
582                         k = -1 - ndigits;
583                         goto ret;
584                         }
585  one_digit:
586                 *s++ = '1';
587                 k++;
588                 goto ret;
589                 }
590         if (leftright) {
591                 if (m2 > 0)
592                         mhi = lshift(mhi, m2);
593
594                 /* Compute mlo -- check for special case
595                  * that d is a normalized power of 2.
596                  */
597
598                 mlo = mhi;
599                 if (spec_case) {
600                         mhi = Balloc(mhi->k);
601                         Bcopy(mhi, mlo);
602                         mhi = lshift(mhi, Log2P);
603                         }
604
605                 for(i = 1;;i++) {
606                         dig = quorem(b,S) + '0';
607                         /* Do we yet have the shortest decimal string
608                          * that will round to d?
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
617                                 && 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)
626                                         inexact = 0;
627 #endif
628                                 *s++ = dig;
629                                 goto ret;
630                                 }
631 #endif
632                         if (j < 0 || j == 0 && mode != 1
633 #ifndef ROUND_BIASED
634                                                         && !(word1(d) & 1)
635 #endif
636                                         ) {
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)
645                                  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
663                                 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;
672                                 goto ret;
673                                 }
674 #ifdef Honor_FLT_ROUNDS
675  keep_dig:
676 #endif
677                         *s++ = dig;
678                         if (i == ilim)
679                                 break;
680                         b = multadd(b, 10, 0);
681                         if (mlo == mhi)
682                                 mlo = mhi = multadd(mhi, 10, 0);
683                         else {
684                                 mlo = multadd(mlo, 10, 0);
685                                 mhi = multadd(mhi, 10, 0);
686                                 }
687                         }
688                 }
689         else
690                 for(i = 1;; i++) {
691                         *s++ = dig = quorem(b,S) + '0';
692                         if (!b->x[0] && b->wds <= 1) {
693 #ifdef SET_INEXACT
694                                 inexact = 0;
695 #endif
696                                 goto ret;
697                                 }
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
706         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:
715                 while(*--s == '9')
716                         if (s == s0) {
717                                 k++;
718                                 *s++ = '1';
719                                 goto ret;
720                                 }
721                 ++*s++;
722                 }
723         else {
724  trimzeros:
725                 while(*--s == '0');
726                 s++;
727                 }
728  ret:
729         Bfree(S);
730         if (mhi) {
731                 if (mlo && mlo != mhi)
732                         Bfree(mlo);
733                 Bfree(mhi);
734                 }
735  ret1:
736 #ifdef SET_INEXACT
737         if (inexact) {
738                 if (!oldinexact) {
739                         word0(d) = Exp_1 + (70 << Exp_shift);
740                         word1(d) = 0;
741                         dval(d) += 1.;
742                         }
743                 }
744         else if (!oldinexact)
745                 clear_inexact();
746 #endif
747         Bfree(b);
748         *s = 0;
749         *decpt = k + 1;
750         if (rve)
751                 *rve = s;
752         return s0;
753         }