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