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