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 <newlib.h>
33 #include <sys/config.h>
34 
35 #ifdef _USE_GDTOA
36 #include "gdtoaimp.h"
37 
38  static Bigint *
39 #ifdef KR_headers
bitstob(ptr,bits,nbits,bbits)40 bitstob(ptr, bits, nbits, bbits) ULong *bits;
41 struct _reent ptr, int nbits; int *bbits;
42 #else
43 bitstob(struct _reent *ptr, ULong *bits, int nbits, int *bbits)
44 #endif
45 {
46 	int i, k;
47 	Bigint *b;
48 	ULong *be, *x, *x0;
49 
50 	i = ULbits;
51 	k = 0;
52 	while(i < nbits) {
53 		i <<= 1;
54 		k++;
55 		}
56 #ifndef Pack_32
57 	if (!k)
58 		k = 1;
59 #endif
60 	b = Balloc(ptr, k);
61 	if (b == NULL)
62 		return (NULL);
63 	be = bits + ((nbits - 1) >> kshift);
64 	x = x0 = b->_x;
65 	do {
66 		*x++ = *bits & ALL_ON;
67 #ifdef Pack_16
68 		*x++ = (*bits >> 16) & ALL_ON;
69 #endif
70 		} while(++bits <= be);
71 	i = x - x0;
72 	while(!x0[--i])
73 		if (!i) {
74 			b->_wds = 0;
75 			*bbits = 0;
76 			goto ret;
77 			}
78 	b->_wds = i + 1;
79 	*bbits = i*ULbits + 32 - hi0bits(b->_x[i]);
80  ret:
81 	return b;
82 	}
83 
84 /* dtoa for IEEE arithmetic (dmg): convert double to ASCII string.
85  *
86  * Inspired by "How to Print Floating-Point Numbers Accurately" by
87  * Guy L. Steele, Jr. and Jon L. White [Proc. ACM SIGPLAN '90, pp. 112-126].
88  *
89  * Modifications:
90  *	1. Rather than iterating, we use a simple numeric overestimate
91  *	   to determine k = floor(log10(d)).  We scale relevant
92  *	   quantities using O(log2(k)) rather than O(k) multiplications.
93  *	2. For some modes > 2 (corresponding to ecvt and fcvt), we don't
94  *	   try to generate digits strictly left to right.  Instead, we
95  *	   compute with fewer bits and propagate the carry if necessary
96  *	   when rounding the final digit up.  This is often faster.
97  *	3. Under the assumption that input will be rounded nearest,
98  *	   mode 0 renders 1e23 as 1e23 rather than 9.999999999999999e22.
99  *	   That is, we allow equality in stopping tests when the
100  *	   round-nearest rule will give the same floating-point value
101  *	   as would satisfaction of the stopping test with strict
102  *	   inequality.
103  *	4. We remove common factors of powers of 2 from relevant
104  *	   quantities.
105  *	5. When converting floating-point integers less than 1e16,
106  *	   we use floating-point arithmetic rather than resorting
107  *	   to multiple-precision integers.
108  *	6. When asked to produce fewer than 15 digits, we first try
109  *	   to get by with floating-point arithmetic; we resort to
110  *	   multiple-precision integer arithmetic only if we cannot
111  *	   guarantee that the floating-point calculation has given
112  *	   the correctly rounded result.  For k requested digits and
113  *	   "uniformly" distributed input, the probability is
114  *	   something like 10^(k-15) that we must resort to the Long
115  *	   calculation.
116  */
117 
118  char *
gdtoa(ptr,fpi,be,bits,kindp,mode,ndigits,decpt,rve)119 gdtoa
120 #ifdef KR_headers
121 	(ptr, fpi, be, bits, kindp, mode, ndigits, decpt, rve)
122 	struct _reent *ptr, FPI *fpi; int be; ULong *bits;
123 	int *kindp, mode, ndigits, *decpt; char **rve;
124 #else
125 	(struct _reent *ptr, FPI *fpi, int be, ULong *bits, int *kindp,
126 	 int mode, int ndigits, int *decpt, char **rve)
127 #endif
128 {
129  /*	Arguments ndigits and decpt are similar to the second and third
130 	arguments of ecvt and fcvt; trailing zeros are suppressed from
131 	the returned string.  If not null, *rve is set to point
132 	to the end of the return value.  If d is +-Infinity or NaN,
133 	then *decpt is set to 9999.
134 	be = exponent: value = (integer represented by bits) * (2 to the power of be).
135 
136 	mode:
137 		0 ==> shortest string that yields d when read in
138 			and rounded to nearest.
139 		1 ==> like 0, but with Steele & White stopping rule;
140 			e.g. with IEEE P754 arithmetic , mode 0 gives
141 			1e23 whereas mode 1 gives 9.999999999999999e22.
142 		2 ==> max(1,ndigits) significant digits.  This gives a
143 			return value similar to that of ecvt, except
144 			that trailing zeros are suppressed.
145 		3 ==> through ndigits past the decimal point.  This
146 			gives a return value similar to that from fcvt,
147 			except that trailing zeros are suppressed, and
148 			ndigits can be negative.
149 		4-9 should give the same return values as 2-3, i.e.,
150 			4 <= mode <= 9 ==> same return as mode
151 			2 + (mode & 1).  These modes are mainly for
152 			debugging; often they run slower but sometimes
153 			faster than modes 2-3.
154 		4,5,8,9 ==> left-to-right digit generation.
155 		6-9 ==> don't try fast floating-point estimate
156 			(if applicable).
157 
158 		Values of mode other than 0-9 are treated as mode 0.
159 
160 		Sufficient space is allocated to the return value
161 		to hold the suppressed trailing zeros.
162 	*/
163 
164 	int bbits, b2, b5, be0, dig, i, ieps, ilim, ilim0, ilim1, inex;
165 	int j, j1, k, k0, k_check, kind, leftright, m2, m5, nbits;
166 	int rdir, s2, s5, spec_case, try_quick;
167 	Long L;
168 	Bigint *b, *b1, *delta, *mlo, *mhi, *mhi1, *S;
169 	double d2, ds;
170 	char *s, *s0;
171 	U d, eps;
172 
173 #ifndef MULTIPLE_THREADS
174 	if (dtoa_result) {
175 		freedtoa(ptr, dtoa_result);
176 		dtoa_result = 0;
177 		}
178 #endif
179 	inex = 0;
180 	kind = *kindp &= ~STRTOG_Inexact;
181 	switch(kind & STRTOG_Retmask) {
182 	  case STRTOG_Zero:
183 		goto ret_zero;
184 	  case STRTOG_Normal:
185 	  case STRTOG_Denormal:
186 		break;
187 	  case STRTOG_Infinite:
188 		*decpt = -32768;
189 		return nrv_alloc(ptr, "Infinity", rve, 8);
190 	  case STRTOG_NaN:
191 		*decpt = -32768;
192 		return nrv_alloc(ptr, "NaN", rve, 3);
193 	  default:
194 		return 0;
195 	  }
196 	b = bitstob(ptr, bits, nbits = fpi->nbits, &bbits);
197 	if (b == NULL)
198 		return (NULL);
199 	be0 = be;
200 	if ( (i = trailz(b)) !=0) {
201 		rshift(b, i);
202 		be += i;
203 		bbits -= i;
204 		}
205 	if (!b->_wds) {
206 		Bfree(ptr, b);
207  ret_zero:
208 		*decpt = 1;
209 		return nrv_alloc(ptr, "0", rve, 1);
210 		}
211 
212 	dval(d) = b2d(b, &i);
213 	i = be + bbits - 1;
214 	word0(d) &= Frac_mask1;
215 	word0(d) |= Exp_11;
216 #ifdef IBM
217 	if ( (j = 11 - hi0bits(word0(d) & Frac_mask)) !=0)
218 		dval(d) /= 1 << j;
219 #endif
220 
221 	/* log(x)	~=~ log(1.5) + (x-1.5)/1.5
222 	 * log10(x)	 =  log(x) / log(10)
223 	 *		~=~ log(1.5)/log(10) + (x-1.5)/(1.5*log(10))
224 	 * log10(&d) = (i-Bias)*log(2)/log(10) + log10(d2)
225 	 *
226 	 * This suggests computing an approximation k to log10(&d) by
227 	 *
228 	 * k = (i - Bias)*0.301029995663981
229 	 *	+ ( (d2-1.5)*0.289529654602168 + 0.176091259055681 );
230 	 *
231 	 * We want k to be too large rather than too small.
232 	 * The error in the first-order Taylor series approximation
233 	 * is in our favor, so we just round up the constant enough
234 	 * to compensate for any error in the multiplication of
235 	 * (i - Bias) by 0.301029995663981; since |i - Bias| <= 1077,
236 	 * and 1077 * 0.30103 * 2^-52 ~=~ 7.2e-14,
237 	 * adding 1e-13 to the constant term more than suffices.
238 	 * Hence we adjust the constant term to 0.1760912590558.
239 	 * (We could get a more accurate k by invoking log10,
240 	 *  but this is probably not worthwhile.)
241 	 */
242 #ifdef IBM
243 	i <<= 2;
244 	i += j;
245 #endif
246 	ds = (dval(d)-1.5)*0.289529654602168 + 0.1760912590558 + i*0.301029995663981;
247 
248 	/* correct assumption about exponent range */
249 	if ((j = i) < 0)
250 		j = -j;
251 	if ((j -= 1077) > 0)
252 		ds += j * 7e-17;
253 
254 	k = (int)ds;
255 	if (ds < 0. && ds != k)
256 		k--;	/* want k = floor(ds) */
257 	k_check = 1;
258 #ifdef IBM
259 	j = be + bbits - 1;
260 	if ( (j1 = j & 3) !=0)
261 		dval(d) *= 1 << j1;
262 	word0(d) += j << Exp_shift - 2 & Exp_mask;
263 #else
264 	word0(d) += (be + bbits - 1) << Exp_shift;
265 #endif
266 	if (k >= 0 && k <= Ten_pmax) {
267 		if (dval(d) < tens[k])
268 			k--;
269 		k_check = 0;
270 		}
271 	j = bbits - i - 1;
272 	if (j >= 0) {
273 		b2 = 0;
274 		s2 = j;
275 		}
276 	else {
277 		b2 = -j;
278 		s2 = 0;
279 		}
280 	if (k >= 0) {
281 		b5 = 0;
282 		s5 = k;
283 		s2 += k;
284 		}
285 	else {
286 		b2 -= k;
287 		b5 = -k;
288 		s5 = 0;
289 		}
290 	if (mode < 0 || mode > 9)
291 		mode = 0;
292 	try_quick = 1;
293 	if (mode > 5) {
294 		mode -= 4;
295 		try_quick = 0;
296 		}
297 	else if (i >= -4 - Emin || i < Emin)
298 		try_quick = 0;
299 	leftright = 1;
300 	ilim = ilim1 = -1;	/* Values for cases 0 and 1; done here to */
301 				/* silence erroneous "gcc -Wall" warning. */
302 	switch(mode) {
303 		case 0:
304 		case 1:
305 			i = (int)(nbits * .30103) + 3;
306 			ndigits = 0;
307 			break;
308 		case 2:
309 			leftright = 0;
310 			/* no break */
311 		case 4:
312 			if (ndigits <= 0)
313 				ndigits = 1;
314 			ilim = ilim1 = i = ndigits;
315 			break;
316 		case 3:
317 			leftright = 0;
318 			/* no break */
319 		case 5:
320 			i = ndigits + k + 1;
321 			ilim = i;
322 			ilim1 = i - 1;
323 			if (i <= 0)
324 				i = 1;
325 		}
326 	s = s0 = rv_alloc(ptr, i);
327 	if (s == NULL)
328 		return (NULL);
329 
330 	if ( (rdir = fpi->rounding - 1) !=0) {
331 		if (rdir < 0)
332 			rdir = 2;
333 		if (kind & STRTOG_Neg)
334 			rdir = 3 - rdir;
335 		}
336 
337 	/* Now rdir = 0 ==> round near, 1 ==> round up, 2 ==> round down. */
338 
339 	if (ilim >= 0 && ilim <= Quick_max && try_quick && !rdir
340 #ifndef IMPRECISE_INEXACT
341 		&& k == 0
342 #endif
343 								) {
344 
345 		/* Try to get by with floating-point arithmetic. */
346 
347 		i = 0;
348 		d2 = dval(d);
349 #ifdef IBM
350 		if ( (j = 11 - hi0bits(word0(d) & Frac_mask)) !=0)
351 			dval(d) /= 1 << j;
352 #endif
353 		k0 = k;
354 		ilim0 = ilim;
355 		ieps = 2; /* conservative */
356 		if (k > 0) {
357 			ds = tens[k&0xf];
358 			j = k >> 4;
359 			if (j & Bletch) {
360 				/* prevent overflows */
361 				j &= Bletch - 1;
362 				dval(d) /= bigtens[n_bigtens-1];
363 				ieps++;
364 				}
365 			for(; j; j >>= 1, i++)
366 				if (j & 1) {
367 					ieps++;
368 					ds *= bigtens[i];
369 					}
370 			}
371 		else  {
372 			ds = 1.;
373 			if ( (j1 = -k) !=0) {
374 				dval(d) *= tens[j1 & 0xf];
375 				for(j = j1 >> 4; j; j >>= 1, i++)
376 					if (j & 1) {
377 						ieps++;
378 						dval(d) *= bigtens[i];
379 						}
380 				}
381 			}
382 		if (k_check && dval(d) < 1. && ilim > 0) {
383 			if (ilim1 <= 0)
384 				goto fast_failed;
385 			ilim = ilim1;
386 			k--;
387 			dval(d) *= 10.;
388 			ieps++;
389 			}
390 		dval(eps) = ieps*dval(d) + 7.;
391 		word0(eps) -= (P-1)*Exp_msk1;
392 		if (ilim == 0) {
393 			S = mhi = 0;
394 			dval(d) -= 5.;
395 			if (dval(d) > dval(eps))
396 				goto one_digit;
397 			if (dval(d) < -dval(eps))
398 				goto no_digits;
399 			goto fast_failed;
400 			}
401 #ifndef No_leftright
402 		if (leftright) {
403 			/* Use Steele & White method of only
404 			 * generating digits needed.
405 			 */
406 			dval(eps) = ds*0.5/tens[ilim-1] - dval(eps);
407 			for(i = 0;;) {
408 				L = (Long)(dval(d)/ds);
409 				dval(d) -= L*ds;
410 				*s++ = '0' + (int)L;
411 				if (dval(d) < dval(eps)) {
412 					if (dval(d))
413 						inex = STRTOG_Inexlo;
414 					goto ret1;
415 					}
416 				if (ds - dval(d) < dval(eps))
417 					goto bump_up;
418 				if (++i >= ilim)
419 					break;
420 				dval(eps) *= 10.;
421 				dval(d) *= 10.;
422 				}
423 			}
424 		else {
425 #endif
426 			/* Generate ilim digits, then fix them up. */
427 			dval(eps) *= tens[ilim-1];
428 			for(i = 1;; i++, dval(d) *= 10.) {
429 				if ( (L = (Long)(dval(d)/ds)) !=0)
430 					dval(d) -= L*ds;
431 				*s++ = '0' + (int)L;
432 				if (i == ilim) {
433 					ds *= 0.5;
434 					if (dval(d) > ds + dval(eps))
435 						goto bump_up;
436 					else if (dval(d) < ds - dval(eps)) {
437 						if (dval(d))
438 							inex = STRTOG_Inexlo;
439 						goto clear_trailing0;
440 						}
441 					break;
442 					}
443 				}
444 #ifndef No_leftright
445 			}
446 #endif
447  fast_failed:
448 		s = s0;
449 		dval(d) = d2;
450 		k = k0;
451 		ilim = ilim0;
452 		}
453 
454 	/* Do we have a "small" integer? */
455 
456 	if (be >= 0 && k <= Int_max) {
457 		/* Yes. */
458 		ds = tens[k];
459 		if (ndigits < 0 && ilim <= 0) {
460 			S = mhi = 0;
461 			if (ilim < 0 || dval(d) <= 5*ds)
462 				goto no_digits;
463 			goto one_digit;
464 			}
465 		for(i = 1;; i++, dval(d) *= 10.) {
466 			L = dval(d) / ds;
467 			dval(d) -= L*ds;
468 #ifdef Check_FLT_ROUNDS
469 			/* If FLT_ROUNDS == 2, L will usually be high by 1 */
470 			if (dval(d) < 0) {
471 				L--;
472 				dval(d) += ds;
473 				}
474 #endif
475 			*s++ = '0' + (int)L;
476 			if (dval(d) == 0.)
477 				break;
478 			if (i == ilim) {
479 				if (rdir) {
480 					if (rdir == 1)
481 						goto bump_up;
482 					inex = STRTOG_Inexlo;
483 					goto ret1;
484 					}
485 				dval(d) += dval(d);
486 #ifdef ROUND_BIASED
487 				if (dval(d) >= ds)
488 #else
489 				if (dval(d) > ds || (dval(d) == ds && L & 1))
490 #endif
491 					{
492  bump_up:
493 					inex = STRTOG_Inexhi;
494 					while(*--s == '9')
495 						if (s == s0) {
496 							k++;
497 							*s = '0';
498 							break;
499 							}
500 					++*s++;
501 					}
502 				else {
503 					inex = STRTOG_Inexlo;
504  clear_trailing0:
505 					while(*--s == '0'){}
506 					++s;
507 					}
508 				break;
509 				}
510 			}
511 		goto ret1;
512 		}
513 
514 	m2 = b2;
515 	m5 = b5;
516 	mhi = mlo = 0;
517 	if (leftright) {
518 		i = nbits - bbits;
519 		if (be - i++ < fpi->emin && mode != 3 && mode != 5) {
520 			/* denormal */
521 			i = be - fpi->emin + 1;
522 			if (mode >= 2 && ilim > 0 && ilim < i)
523 				goto small_ilim;
524 			}
525 		else if (mode >= 2) {
526  small_ilim:
527 			j = ilim - 1;
528 			if (m5 >= j)
529 				m5 -= j;
530 			else {
531 				s5 += j -= m5;
532 				b5 += j;
533 				m5 = 0;
534 				}
535 			if ((i = ilim) < 0) {
536 				m2 -= i;
537 				i = 0;
538 				}
539 			}
540 		b2 += i;
541 		s2 += i;
542 		mhi = i2b(ptr, 1);
543 		if (mhi == NULL)
544 			return (NULL);
545 		}
546 	if (m2 > 0 && s2 > 0) {
547 		i = m2 < s2 ? m2 : s2;
548 		b2 -= i;
549 		m2 -= i;
550 		s2 -= i;
551 		}
552 	if (b5 > 0) {
553 		if (leftright) {
554 			if (m5 > 0) {
555 				mhi = pow5mult(ptr, mhi, m5);
556 				if (mhi == NULL)
557 					return (NULL);
558 				b1 = mult(ptr, mhi, b);
559 				if (b1 == NULL)
560 					return (NULL);
561 				Bfree(ptr, b);
562 				b = b1;
563 				}
564 			if ( (j = b5 - m5) !=0) {
565 				b = pow5mult(ptr, b, j);
566 				if (b == NULL)
567 					return (NULL);
568 				}
569 			}
570 		else {
571 			b = pow5mult(ptr, b, b5);
572 			if (b == NULL)
573 				return (NULL);
574 			}
575 		}
576 	S = i2b(ptr, 1);
577 	if (S == NULL)
578 		return (NULL);
579 	if (s5 > 0) {
580 		S = pow5mult(ptr, S, s5);
581 		if (S == NULL)
582 			return (NULL);
583 		}
584 
585 	/* Check for special case that d is a normalized power of 2. */
586 
587 	spec_case = 0;
588 	if (mode < 2) {
589 		if (bbits == 1 && be0 > fpi->emin + 1) {
590 			/* The special case */
591 			b2++;
592 			s2++;
593 			spec_case = 1;
594 			}
595 		}
596 
597 	/* Arrange for convenient computation of quotients:
598 	 * shift left if necessary so divisor has 4 leading 0 bits.
599 	 *
600 	 * Perhaps we should just compute leading 28 bits of S once
601 	 * and for all and pass them and a shift to quorem, so it
602 	 * can do shifts and ors to compute the numerator for q.
603 	 */
604 	i = ((s5 ? hi0bits(S->_x[S->_wds-1]) : ULbits - 1) - s2 - 4) & kmask;
605 	m2 += i;
606 	if ((b2 += i) > 0) {
607 		b = lshift(ptr, b, b2);
608 		if (b == NULL)
609 			return (NULL);
610 		}
611 	if ((s2 += i) > 0) {
612 		S = lshift(ptr, S, s2);
613 		if (S == NULL)
614 			return (NULL);
615 		}
616 	if (k_check) {
617 		if (cmp(b,S) < 0) {
618 			k--;
619 			b = multadd(ptr, b, 10, 0); /* we botched the k estimate */
620 			if (b == NULL)
621 				return (NULL);
622 			if (leftright) {
623 				mhi = multadd(ptr, mhi, 10, 0);
624 				if (mhi == NULL)
625 					return (NULL);
626 				}
627 			ilim = ilim1;
628 			}
629 		}
630 	if (ilim <= 0 && mode > 2) {
631 		S = multadd(ptr, S,5,0);
632 		if (S == NULL)
633 			return (NULL);
634 		if (ilim < 0 || cmp(b,S) <= 0) {
635 			/* no digits, fcvt style */
636  no_digits:
637 			k = -1 - ndigits;
638 			inex = STRTOG_Inexlo;
639 			goto ret;
640 			}
641  one_digit:
642 		inex = STRTOG_Inexhi;
643 		*s++ = '1';
644 		k++;
645 		goto ret;
646 		}
647 	if (leftright) {
648 		if (m2 > 0) {
649 			mhi = lshift(ptr, mhi, m2);
650 			if (mhi == NULL)
651 				return (NULL);
652 			}
653 
654 		/* Compute mlo -- check for special case
655 		 * that d is a normalized power of 2.
656 		 */
657 
658 		mlo = mhi;
659 		if (spec_case) {
660 			mhi = Balloc(ptr, mhi->_k);
661 			if (mhi == NULL)
662 				return (NULL);
663 			Bcopy(mhi, mlo);
664 			mhi = lshift(ptr, mhi, 1);
665 			if (mhi == NULL)
666 				return (NULL);
667 			}
668 
669 		for(i = 1;;i++) {
670 			dig = quorem(b,S) + '0';
671 			/* Do we yet have the shortest decimal string
672 			 * that will round to d?
673 			 */
674 			j = cmp(b, mlo);
675 			delta = diff(ptr, S, mhi);
676 			if (delta == NULL)
677 				return (NULL);
678 			j1 = delta->_sign ? 1 : cmp(b, delta);
679 			Bfree(ptr, delta);
680 #ifndef ROUND_BIASED
681 			if (j1 == 0 && !mode && !(bits[0] & 1) && !rdir) {
682 				if (dig == '9')
683 					goto round_9_up;
684 				if (j <= 0) {
685 					if (b->_wds > 1 || b->_x[0])
686 						inex = STRTOG_Inexlo;
687 					}
688 				else {
689 					dig++;
690 					inex = STRTOG_Inexhi;
691 					}
692 				*s++ = dig;
693 				goto ret;
694 				}
695 #endif
696 			if (j < 0 || (j == 0 && !mode
697 #ifndef ROUND_BIASED
698 							&& !(bits[0] & 1)
699 #endif
700 					)) {
701 				if (rdir && (b->_wds > 1 || b->_x[0])) {
702 					if (rdir == 2) {
703 						inex = STRTOG_Inexlo;
704 						goto accept;
705 						}
706 					while (cmp(S,mhi) > 0) {
707 						*s++ = dig;
708 						mhi1 = multadd(ptr, mhi, 10, 0);
709 						if (mhi1 == NULL)
710 							return (NULL);
711 						if (mlo == mhi)
712 							mlo = mhi1;
713 						mhi = mhi1;
714 						b = multadd(ptr, b, 10, 0);
715 						if (b == NULL)
716 							return (NULL);
717 						dig = quorem(b,S) + '0';
718 						}
719 					if (dig++ == '9')
720 						goto round_9_up;
721 					inex = STRTOG_Inexhi;
722 					goto accept;
723 					}
724 				if (j1 > 0) {
725 					b = lshift(ptr, b, 1);
726 					if (b == NULL)
727 						return (NULL);
728 					j1 = cmp(b, S);
729 #ifdef ROUND_BIASED
730 					if (j1 >= 0 /*)*/
731 #else
732 					if ((j1 > 0 || (j1 == 0 && dig & 1))
733 #endif
734 					&& dig++ == '9')
735 						goto round_9_up;
736 					inex = STRTOG_Inexhi;
737 					}
738 				if (b->_wds > 1 || b->_x[0])
739 					inex = STRTOG_Inexlo;
740  accept:
741 				*s++ = dig;
742 				goto ret;
743 				}
744 			if (j1 > 0 && rdir != 2) {
745 				if (dig == '9') { /* possible if i == 1 */
746  round_9_up:
747 					*s++ = '9';
748 					inex = STRTOG_Inexhi;
749 					goto roundoff;
750 					}
751 				inex = STRTOG_Inexhi;
752 				*s++ = dig + 1;
753 				goto ret;
754 				}
755 			*s++ = dig;
756 			if (i == ilim)
757 				break;
758 			b = multadd(ptr, b, 10, 0);
759 			if (b == NULL)
760 				return (NULL);
761 			if (mlo == mhi) {
762 				mlo = mhi = multadd(ptr, mhi, 10, 0);
763 				if (mlo == NULL)
764 					return (NULL);
765 				}
766 			else {
767 				mlo = multadd(ptr, mlo, 10, 0);
768 				if (mlo == NULL)
769 					return (NULL);
770 				mhi = multadd(ptr, mhi, 10, 0);
771 				if (mhi == NULL)
772 					return (NULL);
773 				}
774 			}
775 		}
776 	else
777 		for(i = 1;; i++) {
778 			*s++ = dig = quorem(b,S) + '0';
779 			if (i >= ilim)
780 				break;
781 			b = multadd(ptr, b, 10, 0);
782 			if (b == NULL)
783 				return (NULL);
784 			}
785 
786 	/* Round off last digit */
787 
788 	if (rdir) {
789 		if (rdir == 2 || (b->_wds <= 1 && !b->_x[0]))
790 			goto chopzeros;
791 		goto roundoff;
792 		}
793 	b = lshift(ptr, b, 1);
794 	if (b == NULL)
795 		return (NULL);
796 	j = cmp(b, S);
797 #ifdef ROUND_BIASED
798 	if (j >= 0)
799 #else
800 	if (j > 0 || (j == 0 && dig & 1))
801 #endif
802 		{
803  roundoff:
804 		inex = STRTOG_Inexhi;
805 		while(*--s == '9')
806 			if (s == s0) {
807 				k++;
808 				*s++ = '1';
809 				goto ret;
810 				}
811 		++*s++;
812 		}
813 	else {
814  chopzeros:
815 		if (b->_wds > 1 || b->_x[0])
816 			inex = STRTOG_Inexlo;
817 		while(*--s == '0'){}
818 		++s;
819 		}
820  ret:
821 	Bfree(ptr, S);
822 	if (mhi) {
823 		if (mlo && mlo != mhi)
824 			Bfree(ptr, mlo);
825 		Bfree(ptr, mhi);
826 		}
827  ret1:
828 	Bfree(ptr, b);
829 	*s = 0;
830 	*decpt = k + 1;
831 	if (rve)
832 		*rve = s;
833 	*kindp |= inex;
834 	return s0;
835 	}
836 DEF_STRONG(gdtoa);
837 #endif /* _USE_GDTOA */
838