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