Deleted Added
full compact
dtoa.c (182709) dtoa.c (219557)
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

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

70#define Check_FLT_ROUNDS
71#else
72#define Rounding Flt_Rounds
73#endif
74
75 char *
76dtoa
77#ifdef KR_headers
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

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

70#define Check_FLT_ROUNDS
71#else
72#define Rounding Flt_Rounds
73#endif
74
75 char *
76dtoa
77#ifdef KR_headers
78 (d, mode, ndigits, decpt, sign, rve)
79 double d; int mode, ndigits, *decpt, *sign; char **rve;
78 (d0, mode, ndigits, decpt, sign, rve)
79 double d0; int mode, ndigits, *decpt, *sign; char **rve;
80#else
80#else
81 (double d, int mode, int ndigits, int *decpt, int *sign, char **rve)
81 (double d0, int mode, int ndigits, int *decpt, int *sign, char **rve)
82#endif
83{
84 /* Arguments ndigits, decpt, sign are similar to those
85 of ecvt and fcvt; trailing zeros are suppressed from
86 the returned string. If not null, *rve is set to point
87 to the end of the return value. If d is +-Infinity or NaN,
88 then *decpt is set to 9999.
89

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

119 j, j1, k, k0, k_check, leftright, m2, m5, s2, s5,
120 spec_case, try_quick;
121 Long L;
122#ifndef Sudden_Underflow
123 int denorm;
124 ULong x;
125#endif
126 Bigint *b, *b1, *delta, *mlo, *mhi, *S;
82#endif
83{
84 /* Arguments ndigits, decpt, sign are similar to those
85 of ecvt and fcvt; trailing zeros are suppressed from
86 the returned string. If not null, *rve is set to point
87 to the end of the return value. If d is +-Infinity or NaN,
88 then *decpt is set to 9999.
89

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

119 j, j1, k, k0, k_check, leftright, m2, m5, s2, s5,
120 spec_case, try_quick;
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;
127 U d, d2, eps;
128 double ds;
128 char *s, *s0;
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;

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

144#endif /*}*/
145
146#ifndef MULTIPLE_THREADS
147 if (dtoa_result) {
148 freedtoa(dtoa_result);
149 dtoa_result = 0;
150 }
151#endif
129 char *s, *s0;
130#ifdef SET_INEXACT
131 int inexact, oldinexact;
132#endif
133#ifdef Honor_FLT_ROUNDS /*{*/
134 int Rounding;
135#ifdef Trust_FLT_ROUNDS /*{{ only define this if FLT_ROUNDS really works! */
136 Rounding = Flt_Rounds;

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

145#endif /*}*/
146
147#ifndef MULTIPLE_THREADS
148 if (dtoa_result) {
149 freedtoa(dtoa_result);
150 dtoa_result = 0;
151 }
152#endif
152
153 if (word0(d) & Sign_bit) {
153 d.d = d0;
154 if (word0(&d) & Sign_bit) {
154 /* set sign for everything, including 0's and NaNs */
155 *sign = 1;
155 /* set sign for everything, including 0's and NaNs */
156 *sign = 1;
156 word0(d) &= ~Sign_bit; /* clear sign bit */
157 word0(&d) &= ~Sign_bit; /* clear sign bit */
157 }
158 else
159 *sign = 0;
160
161#if defined(IEEE_Arith) + defined(VAX)
162#ifdef IEEE_Arith
158 }
159 else
160 *sign = 0;
161
162#if defined(IEEE_Arith) + defined(VAX)
163#ifdef IEEE_Arith
163 if ((word0(d) & Exp_mask) == Exp_mask)
164 if ((word0(&d) & Exp_mask) == Exp_mask)
164#else
165#else
165 if (word0(d) == 0x8000)
166 if (word0(&d) == 0x8000)
166#endif
167 {
168 /* Infinity or NaN */
169 *decpt = 9999;
170#ifdef IEEE_Arith
167#endif
168 {
169 /* Infinity or NaN */
170 *decpt = 9999;
171#ifdef IEEE_Arith
171 if (!word1(d) && !(word0(d) & 0xfffff))
172 if (!word1(&d) && !(word0(&d) & 0xfffff))
172 return nrv_alloc("Infinity", rve, 8);
173#endif
174 return nrv_alloc("NaN", rve, 3);
175 }
176#endif
177#ifdef IBM
173 return nrv_alloc("Infinity", rve, 8);
174#endif
175 return nrv_alloc("NaN", rve, 3);
176 }
177#endif
178#ifdef IBM
178 dval(d) += 0; /* normalize */
179 dval(&d) += 0; /* normalize */
179#endif
180#endif
180 if (!dval(d)) {
181 if (!dval(&d)) {
181 *decpt = 1;
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
190 if (Rounding >= 2) {
191 if (*sign)
192 Rounding = Rounding == 2 ? 0 : 2;
193 else
194 if (Rounding != 2)
195 Rounding = 0;
196 }
197#endif
198
182 *decpt = 1;
183 return nrv_alloc("0", rve, 1);
184 }
185
186#ifdef SET_INEXACT
187 try_quick = oldinexact = get_inexact();
188 inexact = 1;
189#endif
190#ifdef Honor_FLT_ROUNDS
191 if (Rounding >= 2) {
192 if (*sign)
193 Rounding = Rounding == 2 ? 0 : 2;
194 else
195 if (Rounding != 2)
196 Rounding = 0;
197 }
198#endif
199
199 b = d2b(dval(d), &be, &bbits);
200 b = d2b(dval(&d), &be, &bbits);
200#ifdef Sudden_Underflow
201#ifdef Sudden_Underflow
201 i = (int)(word0(d) >> Exp_shift1 & (Exp_mask>>Exp_shift1));
202 i = (int)(word0(&d) >> Exp_shift1 & (Exp_mask>>Exp_shift1));
202#else
203#else
203 if (( i = (int)(word0(d) >> Exp_shift1 & (Exp_mask>>Exp_shift1)) )!=0) {
204 if (( i = (int)(word0(&d) >> Exp_shift1 & (Exp_mask>>Exp_shift1)) )!=0) {
204#endif
205#endif
205 dval(d2) = dval(d);
206 word0(d2) &= Frac_mask1;
207 word0(d2) |= Exp_11;
206 dval(&d2) = dval(&d);
207 word0(&d2) &= Frac_mask1;
208 word0(&d2) |= Exp_11;
208#ifdef IBM
209#ifdef IBM
209 if (( j = 11 - hi0bits(word0(d2) & Frac_mask) )!=0)
210 dval(d2) /= 1 << j;
210 if (( j = 11 - hi0bits(word0(&d2) & Frac_mask) )!=0)
211 dval(&d2) /= 1 << j;
211#endif
212
213 /* log(x) ~=~ log(1.5) + (x-1.5)/1.5
214 * log10(x) = log(x) / log(10)
215 * ~=~ log(1.5)/log(10) + (x-1.5)/(1.5*log(10))
212#endif
213
214 /* log(x) ~=~ log(1.5) + (x-1.5)/1.5
215 * log10(x) = log(x) / log(10)
216 * ~=~ log(1.5)/log(10) + (x-1.5)/(1.5*log(10))
216 * log10(d) = (i-Bias)*log(2)/log(10) + log10(d2)
217 * log10(&d) = (i-Bias)*log(2)/log(10) + log10(&d2)
217 *
218 *
218 * This suggests computing an approximation k to log10(d) by
219 * This suggests computing an approximation k to log10(&d) by
219 *
220 * k = (i - Bias)*0.301029995663981
221 * + ( (d2-1.5)*0.289529654602168 + 0.176091259055681 );
222 *
223 * We want k to be too large rather than too small.
224 * The error in the first-order Taylor series approximation
225 * is in our favor, so we just round up the constant enough
226 * to compensate for any error in the multiplication of

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

239#endif
240#ifndef Sudden_Underflow
241 denorm = 0;
242 }
243 else {
244 /* d is denormalized */
245
246 i = bbits + be + (Bias + (P-1) - 1);
220 *
221 * k = (i - Bias)*0.301029995663981
222 * + ( (d2-1.5)*0.289529654602168 + 0.176091259055681 );
223 *
224 * We want k to be too large rather than too small.
225 * The error in the first-order Taylor series approximation
226 * is in our favor, so we just round up the constant enough
227 * to compensate for any error in the multiplication of

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

240#endif
241#ifndef Sudden_Underflow
242 denorm = 0;
243 }
244 else {
245 /* d is denormalized */
246
247 i = bbits + be + (Bias + (P-1) - 1);
247 x = i > 32 ? word0(d) << 64 - i | word1(d) >> i - 32
248 : word1(d) << 32 - i;
249 dval(d2) = x;
250 word0(d2) -= 31*Exp_msk1; /* adjust exponent */
248 x = i > 32 ? word0(&d) << (64 - i) | word1(&d) >> (i - 32)
249 : word1(&d) << (32 - i);
250 dval(&d2) = x;
251 word0(&d2) -= 31*Exp_msk1; /* adjust exponent */
251 i -= (Bias + (P-1) - 1) + 1;
252 denorm = 1;
253 }
254#endif
252 i -= (Bias + (P-1) - 1) + 1;
253 denorm = 1;
254 }
255#endif
255 ds = (dval(d2)-1.5)*0.289529654602168 + 0.1760912590558 + i*0.301029995663981;
256 ds = (dval(&d2)-1.5)*0.289529654602168 + 0.1760912590558 + i*0.301029995663981;
256 k = (int)ds;
257 if (ds < 0. && ds != k)
258 k--; /* want k = floor(ds) */
259 k_check = 1;
260 if (k >= 0 && k <= Ten_pmax) {
257 k = (int)ds;
258 if (ds < 0. && ds != k)
259 k--; /* want k = floor(ds) */
260 k_check = 1;
261 if (k >= 0 && k <= Ten_pmax) {
261 if (dval(d) < tens[k])
262 if (dval(&d) < tens[k])
262 k--;
263 k_check = 0;
264 }
265 j = bbits - i - 1;
266 if (j >= 0) {
267 b2 = 0;
268 s2 = j;
269 }

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

292#endif
293#endif /*SET_INEXACT*/
294
295 if (mode > 5) {
296 mode -= 4;
297 try_quick = 0;
298 }
299 leftright = 1;
263 k--;
264 k_check = 0;
265 }
266 j = bbits - i - 1;
267 if (j >= 0) {
268 b2 = 0;
269 s2 = j;
270 }

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

293#endif
294#endif /*SET_INEXACT*/
295
296 if (mode > 5) {
297 mode -= 4;
298 try_quick = 0;
299 }
300 leftright = 1;
301 ilim = ilim1 = -1; /* Values for cases 0 and 1; done here to */
302 /* silence erroneous "gcc -Wall" warning. */
300 switch(mode) {
301 case 0:
302 case 1:
303 switch(mode) {
304 case 0:
305 case 1:
303 ilim = ilim1 = -1;
304 i = 18;
305 ndigits = 0;
306 break;
307 case 2:
308 leftright = 0;
309 /* no break */
310 case 4:
311 if (ndigits <= 0)

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

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;
306 i = 18;
307 ndigits = 0;
308 break;
309 case 2:
310 leftright = 0;
311 /* no break */
312 case 4:
313 if (ndigits <= 0)

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

331 leftright = 0;
332#endif
333
334 if (ilim >= 0 && ilim <= Quick_max && try_quick) {
335
336 /* Try to get by with floating-point arithmetic. */
337
338 i = 0;
337 dval(d2) = dval(d);
339 dval(&d2) = dval(&d);
338 k0 = k;
339 ilim0 = ilim;
340 ieps = 2; /* conservative */
341 if (k > 0) {
342 ds = tens[k&0xf];
343 j = k >> 4;
344 if (j & Bletch) {
345 /* prevent overflows */
346 j &= Bletch - 1;
340 k0 = k;
341 ilim0 = ilim;
342 ieps = 2; /* conservative */
343 if (k > 0) {
344 ds = tens[k&0xf];
345 j = k >> 4;
346 if (j & Bletch) {
347 /* prevent overflows */
348 j &= Bletch - 1;
347 dval(d) /= bigtens[n_bigtens-1];
349 dval(&d) /= bigtens[n_bigtens-1];
348 ieps++;
349 }
350 for(; j; j >>= 1, i++)
351 if (j & 1) {
352 ieps++;
353 ds *= bigtens[i];
354 }
350 ieps++;
351 }
352 for(; j; j >>= 1, i++)
353 if (j & 1) {
354 ieps++;
355 ds *= bigtens[i];
356 }
355 dval(d) /= ds;
357 dval(&d) /= ds;
356 }
357 else if (( j1 = -k )!=0) {
358 }
359 else if (( j1 = -k )!=0) {
358 dval(d) *= tens[j1 & 0xf];
360 dval(&d) *= tens[j1 & 0xf];
359 for(j = j1 >> 4; j; j >>= 1, i++)
360 if (j & 1) {
361 ieps++;
361 for(j = j1 >> 4; j; j >>= 1, i++)
362 if (j & 1) {
363 ieps++;
362 dval(d) *= bigtens[i];
364 dval(&d) *= bigtens[i];
363 }
364 }
365 }
366 }
365 if (k_check && dval(d) < 1. && ilim > 0) {
367 if (k_check && dval(&d) < 1. && ilim > 0) {
366 if (ilim1 <= 0)
367 goto fast_failed;
368 ilim = ilim1;
369 k--;
368 if (ilim1 <= 0)
369 goto fast_failed;
370 ilim = ilim1;
371 k--;
370 dval(d) *= 10.;
372 dval(&d) *= 10.;
371 ieps++;
372 }
373 ieps++;
374 }
373 dval(eps) = ieps*dval(d) + 7.;
374 word0(eps) -= (P-1)*Exp_msk1;
375 dval(&eps) = ieps*dval(&d) + 7.;
376 word0(&eps) -= (P-1)*Exp_msk1;
375 if (ilim == 0) {
376 S = mhi = 0;
377 if (ilim == 0) {
378 S = mhi = 0;
377 dval(d) -= 5.;
378 if (dval(d) > dval(eps))
379 dval(&d) -= 5.;
380 if (dval(&d) > dval(&eps))
379 goto one_digit;
381 goto one_digit;
380 if (dval(d) < -dval(eps))
382 if (dval(&d) < -dval(&eps))
381 goto no_digits;
382 goto fast_failed;
383 }
384#ifndef No_leftright
385 if (leftright) {
386 /* Use Steele & White method of only
387 * generating digits needed.
388 */
383 goto no_digits;
384 goto fast_failed;
385 }
386#ifndef No_leftright
387 if (leftright) {
388 /* Use Steele & White method of only
389 * generating digits needed.
390 */
389 dval(eps) = 0.5/tens[ilim-1] - dval(eps);
391 dval(&eps) = 0.5/tens[ilim-1] - dval(&eps);
390 for(i = 0;;) {
392 for(i = 0;;) {
391 L = dval(d);
392 dval(d) -= L;
393 L = dval(&d);
394 dval(&d) -= L;
393 *s++ = '0' + (int)L;
395 *s++ = '0' + (int)L;
394 if (dval(d) < dval(eps))
396 if (dval(&d) < dval(&eps))
395 goto ret1;
397 goto ret1;
396 if (1. - dval(d) < dval(eps))
398 if (1. - dval(&d) < dval(&eps))
397 goto bump_up;
398 if (++i >= ilim)
399 break;
399 goto bump_up;
400 if (++i >= ilim)
401 break;
400 dval(eps) *= 10.;
401 dval(d) *= 10.;
402 dval(&eps) *= 10.;
403 dval(&d) *= 10.;
402 }
403 }
404 else {
405#endif
406 /* Generate ilim digits, then fix them up. */
404 }
405 }
406 else {
407#endif
408 /* Generate ilim digits, then fix them up. */
407 dval(eps) *= tens[ilim-1];
408 for(i = 1;; i++, dval(d) *= 10.) {
409 L = (Long)(dval(d));
410 if (!(dval(d) -= L))
409 dval(&eps) *= tens[ilim-1];
410 for(i = 1;; i++, dval(&d) *= 10.) {
411 L = (Long)(dval(&d));
412 if (!(dval(&d) -= L))
411 ilim = i;
412 *s++ = '0' + (int)L;
413 if (i == ilim) {
413 ilim = i;
414 *s++ = '0' + (int)L;
415 if (i == ilim) {
414 if (dval(d) > 0.5 + dval(eps))
416 if (dval(&d) > 0.5 + dval(&eps))
415 goto bump_up;
417 goto bump_up;
416 else if (dval(d) < 0.5 - dval(eps)) {
418 else if (dval(&d) < 0.5 - dval(&eps)) {
417 while(*--s == '0');
418 s++;
419 goto ret1;
420 }
421 break;
422 }
423 }
424#ifndef No_leftright
425 }
426#endif
427 fast_failed:
428 s = s0;
419 while(*--s == '0');
420 s++;
421 goto ret1;
422 }
423 break;
424 }
425 }
426#ifndef No_leftright
427 }
428#endif
429 fast_failed:
430 s = s0;
429 dval(d) = dval(d2);
431 dval(&d) = dval(&d2);
430 k = k0;
431 ilim = ilim0;
432 }
433
434 /* Do we have a "small" integer? */
435
436 if (be >= 0 && k <= Int_max) {
437 /* Yes. */
438 ds = tens[k];
439 if (ndigits < 0 && ilim <= 0) {
440 S = mhi = 0;
432 k = k0;
433 ilim = ilim0;
434 }
435
436 /* Do we have a "small" integer? */
437
438 if (be >= 0 && k <= Int_max) {
439 /* Yes. */
440 ds = tens[k];
441 if (ndigits < 0 && ilim <= 0) {
442 S = mhi = 0;
441 if (ilim < 0 || dval(d) <= 5*ds)
443 if (ilim < 0 || dval(&d) <= 5*ds)
442 goto no_digits;
443 goto one_digit;
444 }
444 goto no_digits;
445 goto one_digit;
446 }
445 for(i = 1;; i++, dval(d) *= 10.) {
446 L = (Long)(dval(d) / ds);
447 dval(d) -= L*ds;
447 for(i = 1;; i++, dval(&d) *= 10.) {
448 L = (Long)(dval(&d) / ds);
449 dval(&d) -= L*ds;
448#ifdef Check_FLT_ROUNDS
449 /* If FLT_ROUNDS == 2, L will usually be high by 1 */
450#ifdef Check_FLT_ROUNDS
451 /* If FLT_ROUNDS == 2, L will usually be high by 1 */
450 if (dval(d) < 0) {
452 if (dval(&d) < 0) {
451 L--;
453 L--;
452 dval(d) += ds;
454 dval(&d) += ds;
453 }
454#endif
455 *s++ = '0' + (int)L;
455 }
456#endif
457 *s++ = '0' + (int)L;
456 if (!dval(d)) {
458 if (!dval(&d)) {
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)
465 switch(Rounding) {
466 case 0: goto ret1;
467 case 2: goto bump_up;
468 }
469#endif
459#ifdef SET_INEXACT
460 inexact = 0;
461#endif
462 break;
463 }
464 if (i == ilim) {
465#ifdef Honor_FLT_ROUNDS
466 if (mode > 1)
467 switch(Rounding) {
468 case 0: goto ret1;
469 case 2: goto bump_up;
470 }
471#endif
470 dval(d) += dval(d);
471 if (dval(d) > ds || dval(d) == ds && L & 1) {
472 dval(&d) += dval(&d);
473#ifdef ROUND_BIASED
474 if (dval(&d) >= ds)
475#else
476 if (dval(&d) > ds || (dval(&d) == ds && L & 1))
477#endif
478 {
472 bump_up:
473 while(*--s == '9')
474 if (s == s0) {
475 k++;
476 *s = '0';
477 break;
478 }
479 ++*s++;

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

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
533 && Rounding == 1
534#endif
535 ) {
479 bump_up:
480 while(*--s == '9')
481 if (s == s0) {
482 k++;
483 *s = '0';
484 break;
485 }
486 ++*s++;

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

535 /* Check for special case that d is a normalized power of 2. */
536
537 spec_case = 0;
538 if ((mode < 2 || leftright)
539#ifdef Honor_FLT_ROUNDS
540 && Rounding == 1
541#endif
542 ) {
536 if (!word1(d) && !(word0(d) & Bndry_mask)
543 if (!word1(&d) && !(word0(&d) & Bndry_mask)
537#ifndef Sudden_Underflow
544#ifndef Sudden_Underflow
538 && word0(d) & (Exp_mask & ~Exp_msk1)
545 && word0(&d) & (Exp_mask & ~Exp_msk1)
539#endif
540 ) {
541 /* The special case */
542 b2 += Log2P;
543 s2 += Log2P;
544 spec_case = 1;
545 }
546 }

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

616 /* Do we yet have the shortest decimal string
617 * that will round to d?
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
546#endif
547 ) {
548 /* The special case */
549 b2 += Log2P;
550 s2 += Log2P;
551 spec_case = 1;
552 }
553 }

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

623 /* Do we yet have the shortest decimal string
624 * that will round to d?
625 */
626 j = cmp(b, mlo);
627 delta = diff(S, mhi);
628 j1 = delta->sign ? 1 : cmp(b, delta);
629 Bfree(delta);
630#ifndef ROUND_BIASED
624 if (j1 == 0 && mode != 1 && !(word1(d) & 1)
631 if (j1 == 0 && mode != 1 && !(word1(&d) & 1)
625#ifdef Honor_FLT_ROUNDS
626 && Rounding >= 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)
635 inexact = 0;
636#endif
637 *s++ = dig;
638 goto ret;
639 }
640#endif
632#ifdef Honor_FLT_ROUNDS
633 && Rounding >= 1
634#endif
635 ) {
636 if (dig == '9')
637 goto round_9_up;
638 if (j > 0)
639 dig++;
640#ifdef SET_INEXACT
641 else if (!b->x[0] && b->wds <= 1)
642 inexact = 0;
643#endif
644 *s++ = dig;
645 goto ret;
646 }
647#endif
641 if (j < 0 || j == 0 && mode != 1
648 if (j < 0 || (j == 0 && mode != 1
642#ifndef ROUND_BIASED
649#ifndef ROUND_BIASED
643 && !(word1(d) & 1)
650 && !(word1(&d) & 1)
644#endif
651#endif
645 ) {
652 )) {
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)
654 switch(Rounding) {
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);
653 if (!b->x[0] && b->wds <= 1) {
654#ifdef SET_INEXACT
655 inexact = 0;
656#endif
657 goto accept_dig;
658 }
659#ifdef Honor_FLT_ROUNDS
660 if (mode > 1)
661 switch(Rounding) {
662 case 0: goto accept_dig;
663 case 2: goto keep_dig;
664 }
665#endif /*Honor_FLT_ROUNDS*/
666 if (j1 > 0) {
667 b = lshift(b, 1);
668 j1 = cmp(b, S);
662 if ((j1 > 0 || j1 == 0 && dig & 1)
669#ifdef ROUND_BIASED
670 if (j1 >= 0 /*)*/
671#else
672 if ((j1 > 0 || (j1 == 0 && dig & 1))
673#endif
663 && dig++ == '9')
664 goto round_9_up;
665 }
666 accept_dig:
667 *s++ = dig;
668 goto ret;
669 }
670 if (j1 > 0) {

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

714#ifdef Honor_FLT_ROUNDS
715 switch(Rounding) {
716 case 0: goto trimzeros;
717 case 2: goto roundoff;
718 }
719#endif
720 b = lshift(b, 1);
721 j = cmp(b, S);
674 && dig++ == '9')
675 goto round_9_up;
676 }
677 accept_dig:
678 *s++ = dig;
679 goto ret;
680 }
681 if (j1 > 0) {

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

725#ifdef Honor_FLT_ROUNDS
726 switch(Rounding) {
727 case 0: goto trimzeros;
728 case 2: goto roundoff;
729 }
730#endif
731 b = lshift(b, 1);
732 j = cmp(b, S);
722 if (j > 0 || j == 0 && dig & 1) {
733#ifdef ROUND_BIASED
734 if (j >= 0)
735#else
736 if (j > 0 || (j == 0 && dig & 1))
737#endif
738 {
723 roundoff:
724 while(*--s == '9')
725 if (s == s0) {
726 k++;
727 *s++ = '1';
728 goto ret;
729 }
730 ++*s++;
731 }
732 else {
739 roundoff:
740 while(*--s == '9')
741 if (s == s0) {
742 k++;
743 *s++ = '1';
744 goto ret;
745 }
746 ++*s++;
747 }
748 else {
749#ifdef Honor_FLT_ROUNDS
733 trimzeros:
750 trimzeros:
751#endif
734 while(*--s == '0');
735 s++;
736 }
737 ret:
738 Bfree(S);
739 if (mhi) {
740 if (mlo && mlo != mhi)
741 Bfree(mlo);
742 Bfree(mhi);
743 }
744 ret1:
745#ifdef SET_INEXACT
746 if (inexact) {
747 if (!oldinexact) {
752 while(*--s == '0');
753 s++;
754 }
755 ret:
756 Bfree(S);
757 if (mhi) {
758 if (mlo && mlo != mhi)
759 Bfree(mlo);
760 Bfree(mhi);
761 }
762 ret1:
763#ifdef SET_INEXACT
764 if (inexact) {
765 if (!oldinexact) {
748 word0(d) = Exp_1 + (70 << Exp_shift);
749 word1(d) = 0;
750 dval(d) += 1.;
766 word0(&d) = Exp_1 + (70 << Exp_shift);
767 word1(&d) = 0;
768 dval(&d) += 1.;
751 }
752 }
753 else if (!oldinexact)
754 clear_inexact();
755#endif
756 Bfree(b);
757 *s = 0;
758 *decpt = k + 1;
759 if (rve)
760 *rve = s;
761 return s0;
762 }
769 }
770 }
771 else if (!oldinexact)
772 clear_inexact();
773#endif
774 Bfree(b);
775 *s = 0;
776 *decpt = k + 1;
777 if (rve)
778 *rve = s;
779 return s0;
780 }