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