dtoa.c revision 1.5 1 1.5 christos /* $NetBSD: dtoa.c,v 1.5 2008/03/21 23:13:48 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 /* 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.5 christos if (b == NULL)
196 1.5 christos return NULL;
197 1.1 kleink #ifdef Sudden_Underflow
198 1.1 kleink i = (int)(word0(d) >> Exp_shift1 & (Exp_mask>>Exp_shift1));
199 1.1 kleink #else
200 1.1 kleink if (( i = (int)(word0(d) >> Exp_shift1 & (Exp_mask>>Exp_shift1)) )!=0) {
201 1.1 kleink #endif
202 1.1 kleink dval(d2) = dval(d);
203 1.1 kleink word0(d2) &= Frac_mask1;
204 1.1 kleink word0(d2) |= Exp_11;
205 1.1 kleink #ifdef IBM
206 1.1 kleink if (( j = 11 - hi0bits(word0(d2) & Frac_mask) )!=0)
207 1.1 kleink dval(d2) /= 1 << j;
208 1.1 kleink #endif
209 1.1 kleink
210 1.1 kleink /* log(x) ~=~ log(1.5) + (x-1.5)/1.5
211 1.1 kleink * log10(x) = log(x) / log(10)
212 1.1 kleink * ~=~ log(1.5)/log(10) + (x-1.5)/(1.5*log(10))
213 1.1 kleink * log10(d) = (i-Bias)*log(2)/log(10) + log10(d2)
214 1.1 kleink *
215 1.1 kleink * This suggests computing an approximation k to log10(d) by
216 1.1 kleink *
217 1.1 kleink * k = (i - Bias)*0.301029995663981
218 1.1 kleink * + ( (d2-1.5)*0.289529654602168 + 0.176091259055681 );
219 1.1 kleink *
220 1.1 kleink * We want k to be too large rather than too small.
221 1.1 kleink * The error in the first-order Taylor series approximation
222 1.1 kleink * is in our favor, so we just round up the constant enough
223 1.1 kleink * to compensate for any error in the multiplication of
224 1.1 kleink * (i - Bias) by 0.301029995663981; since |i - Bias| <= 1077,
225 1.1 kleink * and 1077 * 0.30103 * 2^-52 ~=~ 7.2e-14,
226 1.1 kleink * adding 1e-13 to the constant term more than suffices.
227 1.1 kleink * Hence we adjust the constant term to 0.1760912590558.
228 1.1 kleink * (We could get a more accurate k by invoking log10,
229 1.1 kleink * but this is probably not worthwhile.)
230 1.1 kleink */
231 1.1 kleink
232 1.1 kleink i -= Bias;
233 1.1 kleink #ifdef IBM
234 1.1 kleink i <<= 2;
235 1.1 kleink i += j;
236 1.1 kleink #endif
237 1.1 kleink #ifndef Sudden_Underflow
238 1.1 kleink denorm = 0;
239 1.1 kleink }
240 1.1 kleink else {
241 1.1 kleink /* d is denormalized */
242 1.1 kleink
243 1.1 kleink i = bbits + be + (Bias + (P-1) - 1);
244 1.2 kleink x = i > 32 ? word0(d) << (64 - i) | word1(d) >> (i - 32)
245 1.2 kleink : word1(d) << (32 - i);
246 1.1 kleink dval(d2) = x;
247 1.1 kleink word0(d2) -= 31*Exp_msk1; /* adjust exponent */
248 1.1 kleink i -= (Bias + (P-1) - 1) + 1;
249 1.1 kleink denorm = 1;
250 1.1 kleink }
251 1.1 kleink #endif
252 1.1 kleink ds = (dval(d2)-1.5)*0.289529654602168 + 0.1760912590558 + i*0.301029995663981;
253 1.1 kleink k = (int)ds;
254 1.1 kleink if (ds < 0. && ds != k)
255 1.1 kleink k--; /* want k = floor(ds) */
256 1.1 kleink k_check = 1;
257 1.1 kleink if (k >= 0 && k <= Ten_pmax) {
258 1.1 kleink if (dval(d) < tens[k])
259 1.1 kleink k--;
260 1.1 kleink k_check = 0;
261 1.1 kleink }
262 1.1 kleink j = bbits - i - 1;
263 1.1 kleink if (j >= 0) {
264 1.1 kleink b2 = 0;
265 1.1 kleink s2 = j;
266 1.1 kleink }
267 1.1 kleink else {
268 1.1 kleink b2 = -j;
269 1.1 kleink s2 = 0;
270 1.1 kleink }
271 1.1 kleink if (k >= 0) {
272 1.1 kleink b5 = 0;
273 1.1 kleink s5 = k;
274 1.1 kleink s2 += k;
275 1.1 kleink }
276 1.1 kleink else {
277 1.1 kleink b2 -= k;
278 1.1 kleink b5 = -k;
279 1.1 kleink s5 = 0;
280 1.1 kleink }
281 1.1 kleink if (mode < 0 || mode > 9)
282 1.1 kleink mode = 0;
283 1.1 kleink
284 1.1 kleink #ifndef SET_INEXACT
285 1.1 kleink #ifdef Check_FLT_ROUNDS
286 1.1 kleink try_quick = Rounding == 1;
287 1.1 kleink #else
288 1.1 kleink try_quick = 1;
289 1.1 kleink #endif
290 1.1 kleink #endif /*SET_INEXACT*/
291 1.1 kleink
292 1.1 kleink if (mode > 5) {
293 1.1 kleink mode -= 4;
294 1.1 kleink try_quick = 0;
295 1.1 kleink }
296 1.1 kleink leftright = 1;
297 1.1 kleink switch(mode) {
298 1.1 kleink case 0:
299 1.1 kleink case 1:
300 1.1 kleink ilim = ilim1 = -1;
301 1.1 kleink i = 18;
302 1.1 kleink ndigits = 0;
303 1.1 kleink break;
304 1.1 kleink case 2:
305 1.1 kleink leftright = 0;
306 1.2 kleink /* FALLTHROUGH */
307 1.1 kleink case 4:
308 1.1 kleink if (ndigits <= 0)
309 1.1 kleink ndigits = 1;
310 1.1 kleink ilim = ilim1 = i = ndigits;
311 1.1 kleink break;
312 1.1 kleink case 3:
313 1.1 kleink leftright = 0;
314 1.2 kleink /* FALLTHROUGH */
315 1.1 kleink case 5:
316 1.1 kleink i = ndigits + k + 1;
317 1.1 kleink ilim = i;
318 1.1 kleink ilim1 = i - 1;
319 1.1 kleink if (i <= 0)
320 1.1 kleink i = 1;
321 1.1 kleink }
322 1.4 christos s = s0 = rv_alloc((size_t)i);
323 1.5 christos if (s == NULL)
324 1.5 christos return NULL;
325 1.1 kleink
326 1.1 kleink #ifdef Honor_FLT_ROUNDS
327 1.1 kleink if (mode > 1 && rounding != 1)
328 1.1 kleink leftright = 0;
329 1.1 kleink #endif
330 1.1 kleink
331 1.1 kleink if (ilim >= 0 && ilim <= Quick_max && try_quick) {
332 1.1 kleink
333 1.1 kleink /* Try to get by with floating-point arithmetic. */
334 1.1 kleink
335 1.1 kleink i = 0;
336 1.1 kleink dval(d2) = dval(d);
337 1.1 kleink k0 = k;
338 1.1 kleink ilim0 = ilim;
339 1.1 kleink ieps = 2; /* conservative */
340 1.1 kleink if (k > 0) {
341 1.1 kleink ds = tens[k&0xf];
342 1.2 kleink j = (unsigned int)k >> 4;
343 1.1 kleink if (j & Bletch) {
344 1.1 kleink /* prevent overflows */
345 1.1 kleink j &= Bletch - 1;
346 1.1 kleink dval(d) /= bigtens[n_bigtens-1];
347 1.1 kleink ieps++;
348 1.1 kleink }
349 1.2 kleink for(; j; j = (unsigned int)j >> 1, i++)
350 1.1 kleink if (j & 1) {
351 1.1 kleink ieps++;
352 1.1 kleink ds *= bigtens[i];
353 1.1 kleink }
354 1.1 kleink dval(d) /= ds;
355 1.1 kleink }
356 1.2 kleink else if (( jj1 = -k )!=0) {
357 1.2 kleink dval(d) *= tens[jj1 & 0xf];
358 1.2 kleink for(j = jj1 >> 4; j; j >>= 1, i++)
359 1.1 kleink if (j & 1) {
360 1.1 kleink ieps++;
361 1.1 kleink dval(d) *= bigtens[i];
362 1.1 kleink }
363 1.1 kleink }
364 1.1 kleink if (k_check && dval(d) < 1. && ilim > 0) {
365 1.1 kleink if (ilim1 <= 0)
366 1.1 kleink goto fast_failed;
367 1.1 kleink ilim = ilim1;
368 1.1 kleink k--;
369 1.1 kleink dval(d) *= 10.;
370 1.1 kleink ieps++;
371 1.1 kleink }
372 1.1 kleink dval(eps) = ieps*dval(d) + 7.;
373 1.1 kleink word0(eps) -= (P-1)*Exp_msk1;
374 1.1 kleink if (ilim == 0) {
375 1.1 kleink S = mhi = 0;
376 1.1 kleink dval(d) -= 5.;
377 1.1 kleink if (dval(d) > dval(eps))
378 1.1 kleink goto one_digit;
379 1.1 kleink if (dval(d) < -dval(eps))
380 1.1 kleink goto no_digits;
381 1.1 kleink goto fast_failed;
382 1.1 kleink }
383 1.1 kleink #ifndef No_leftright
384 1.1 kleink if (leftright) {
385 1.1 kleink /* Use Steele & White method of only
386 1.1 kleink * generating digits needed.
387 1.1 kleink */
388 1.1 kleink dval(eps) = 0.5/tens[ilim-1] - dval(eps);
389 1.1 kleink for(i = 0;;) {
390 1.1 kleink L = dval(d);
391 1.1 kleink dval(d) -= L;
392 1.1 kleink *s++ = '0' + (int)L;
393 1.1 kleink if (dval(d) < dval(eps))
394 1.1 kleink goto ret1;
395 1.1 kleink if (1. - dval(d) < dval(eps))
396 1.1 kleink goto bump_up;
397 1.1 kleink if (++i >= ilim)
398 1.1 kleink break;
399 1.1 kleink dval(eps) *= 10.;
400 1.1 kleink dval(d) *= 10.;
401 1.1 kleink }
402 1.1 kleink }
403 1.1 kleink else {
404 1.1 kleink #endif
405 1.1 kleink /* Generate ilim digits, then fix them up. */
406 1.1 kleink dval(eps) *= tens[ilim-1];
407 1.1 kleink for(i = 1;; i++, dval(d) *= 10.) {
408 1.1 kleink L = (Long)(dval(d));
409 1.1 kleink if (!(dval(d) -= L))
410 1.1 kleink ilim = i;
411 1.1 kleink *s++ = '0' + (int)L;
412 1.1 kleink if (i == ilim) {
413 1.1 kleink if (dval(d) > 0.5 + dval(eps))
414 1.1 kleink goto bump_up;
415 1.1 kleink else if (dval(d) < 0.5 - dval(eps)) {
416 1.1 kleink while(*--s == '0');
417 1.1 kleink s++;
418 1.1 kleink goto ret1;
419 1.1 kleink }
420 1.1 kleink break;
421 1.1 kleink }
422 1.1 kleink }
423 1.1 kleink #ifndef No_leftright
424 1.1 kleink }
425 1.1 kleink #endif
426 1.1 kleink fast_failed:
427 1.1 kleink s = s0;
428 1.1 kleink dval(d) = dval(d2);
429 1.1 kleink k = k0;
430 1.1 kleink ilim = ilim0;
431 1.1 kleink }
432 1.1 kleink
433 1.1 kleink /* Do we have a "small" integer? */
434 1.1 kleink
435 1.1 kleink if (be >= 0 && k <= Int_max) {
436 1.1 kleink /* Yes. */
437 1.1 kleink ds = tens[k];
438 1.1 kleink if (ndigits < 0 && ilim <= 0) {
439 1.1 kleink S = mhi = 0;
440 1.1 kleink if (ilim < 0 || dval(d) <= 5*ds)
441 1.1 kleink goto no_digits;
442 1.1 kleink goto one_digit;
443 1.1 kleink }
444 1.1 kleink for(i = 1;; i++, dval(d) *= 10.) {
445 1.1 kleink L = (Long)(dval(d) / ds);
446 1.1 kleink dval(d) -= L*ds;
447 1.1 kleink #ifdef Check_FLT_ROUNDS
448 1.1 kleink /* If FLT_ROUNDS == 2, L will usually be high by 1 */
449 1.1 kleink if (dval(d) < 0) {
450 1.1 kleink L--;
451 1.1 kleink dval(d) += ds;
452 1.1 kleink }
453 1.1 kleink #endif
454 1.1 kleink *s++ = '0' + (int)L;
455 1.1 kleink if (!dval(d)) {
456 1.1 kleink #ifdef SET_INEXACT
457 1.1 kleink inexact = 0;
458 1.1 kleink #endif
459 1.1 kleink break;
460 1.1 kleink }
461 1.1 kleink if (i == ilim) {
462 1.1 kleink #ifdef Honor_FLT_ROUNDS
463 1.1 kleink if (mode > 1)
464 1.1 kleink switch(rounding) {
465 1.1 kleink case 0: goto ret1;
466 1.1 kleink case 2: goto bump_up;
467 1.1 kleink }
468 1.1 kleink #endif
469 1.1 kleink dval(d) += dval(d);
470 1.2 kleink if (dval(d) > ds || (dval(d) == ds && L & 1)) {
471 1.1 kleink bump_up:
472 1.1 kleink while(*--s == '9')
473 1.1 kleink if (s == s0) {
474 1.1 kleink k++;
475 1.1 kleink *s = '0';
476 1.1 kleink break;
477 1.1 kleink }
478 1.1 kleink ++*s++;
479 1.1 kleink }
480 1.1 kleink break;
481 1.1 kleink }
482 1.1 kleink }
483 1.1 kleink goto ret1;
484 1.1 kleink }
485 1.1 kleink
486 1.1 kleink m2 = b2;
487 1.1 kleink m5 = b5;
488 1.1 kleink mhi = mlo = 0;
489 1.1 kleink if (leftright) {
490 1.1 kleink i =
491 1.1 kleink #ifndef Sudden_Underflow
492 1.1 kleink denorm ? be + (Bias + (P-1) - 1 + 1) :
493 1.1 kleink #endif
494 1.1 kleink #ifdef IBM
495 1.1 kleink 1 + 4*P - 3 - bbits + ((bbits + be - 1) & 3);
496 1.1 kleink #else
497 1.1 kleink 1 + P - bbits;
498 1.1 kleink #endif
499 1.1 kleink b2 += i;
500 1.1 kleink s2 += i;
501 1.1 kleink mhi = i2b(1);
502 1.5 christos if (mhi == NULL)
503 1.5 christos return NULL;
504 1.1 kleink }
505 1.1 kleink if (m2 > 0 && s2 > 0) {
506 1.1 kleink i = m2 < s2 ? m2 : s2;
507 1.1 kleink b2 -= i;
508 1.1 kleink m2 -= i;
509 1.1 kleink s2 -= i;
510 1.1 kleink }
511 1.1 kleink if (b5 > 0) {
512 1.1 kleink if (leftright) {
513 1.1 kleink if (m5 > 0) {
514 1.1 kleink mhi = pow5mult(mhi, m5);
515 1.5 christos if (mhi == NULL)
516 1.5 christos return NULL;
517 1.1 kleink b1 = mult(mhi, b);
518 1.5 christos if (b1 == NULL)
519 1.5 christos return NULL;
520 1.1 kleink Bfree(b);
521 1.1 kleink b = b1;
522 1.1 kleink }
523 1.1 kleink if (( j = b5 - m5 )!=0)
524 1.1 kleink b = pow5mult(b, j);
525 1.5 christos if (b == NULL)
526 1.5 christos return NULL;
527 1.1 kleink }
528 1.1 kleink else
529 1.1 kleink b = pow5mult(b, b5);
530 1.5 christos if (b == NULL)
531 1.5 christos return NULL;
532 1.1 kleink }
533 1.1 kleink S = i2b(1);
534 1.5 christos if (S == NULL)
535 1.5 christos return NULL;
536 1.5 christos if (s5 > 0) {
537 1.1 kleink S = pow5mult(S, s5);
538 1.5 christos if (S == NULL)
539 1.5 christos return NULL;
540 1.5 christos }
541 1.1 kleink
542 1.1 kleink /* Check for special case that d is a normalized power of 2. */
543 1.1 kleink
544 1.1 kleink spec_case = 0;
545 1.1 kleink if ((mode < 2 || leftright)
546 1.1 kleink #ifdef Honor_FLT_ROUNDS
547 1.1 kleink && rounding == 1
548 1.1 kleink #endif
549 1.1 kleink ) {
550 1.1 kleink if (!word1(d) && !(word0(d) & Bndry_mask)
551 1.1 kleink #ifndef Sudden_Underflow
552 1.1 kleink && word0(d) & (Exp_mask & ~Exp_msk1)
553 1.1 kleink #endif
554 1.1 kleink ) {
555 1.1 kleink /* The special case */
556 1.1 kleink b2 += Log2P;
557 1.1 kleink s2 += Log2P;
558 1.1 kleink spec_case = 1;
559 1.1 kleink }
560 1.1 kleink }
561 1.1 kleink
562 1.1 kleink /* Arrange for convenient computation of quotients:
563 1.1 kleink * shift left if necessary so divisor has 4 leading 0 bits.
564 1.1 kleink *
565 1.1 kleink * Perhaps we should just compute leading 28 bits of S once
566 1.1 kleink * and for all and pass them and a shift to quorem, so it
567 1.1 kleink * can do shifts and ors to compute the numerator for q.
568 1.1 kleink */
569 1.1 kleink #ifdef Pack_32
570 1.1 kleink if (( i = ((s5 ? 32 - hi0bits(S->x[S->wds-1]) : 1) + s2) & 0x1f )!=0)
571 1.1 kleink i = 32 - i;
572 1.1 kleink #else
573 1.1 kleink if (( i = ((s5 ? 32 - hi0bits(S->x[S->wds-1]) : 1) + s2) & 0xf )!=0)
574 1.1 kleink i = 16 - i;
575 1.1 kleink #endif
576 1.1 kleink if (i > 4) {
577 1.1 kleink i -= 4;
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 else if (i < 4) {
583 1.1 kleink i += 28;
584 1.1 kleink b2 += i;
585 1.1 kleink m2 += i;
586 1.1 kleink s2 += i;
587 1.1 kleink }
588 1.5 christos if (b2 > 0) {
589 1.1 kleink b = lshift(b, b2);
590 1.5 christos if (b == NULL)
591 1.5 christos return NULL;
592 1.5 christos }
593 1.5 christos if (s2 > 0) {
594 1.1 kleink S = lshift(S, s2);
595 1.5 christos if (S == NULL)
596 1.5 christos return NULL;
597 1.5 christos }
598 1.1 kleink if (k_check) {
599 1.1 kleink if (cmp(b,S) < 0) {
600 1.1 kleink k--;
601 1.1 kleink b = multadd(b, 10, 0); /* we botched the k estimate */
602 1.5 christos if (b == NULL)
603 1.5 christos return NULL;
604 1.5 christos if (leftright) {
605 1.1 kleink mhi = multadd(mhi, 10, 0);
606 1.5 christos if (mhi == NULL)
607 1.5 christos return NULL;
608 1.5 christos }
609 1.1 kleink ilim = ilim1;
610 1.1 kleink }
611 1.1 kleink }
612 1.1 kleink if (ilim <= 0 && (mode == 3 || mode == 5)) {
613 1.1 kleink if (ilim < 0 || cmp(b,S = multadd(S,5,0)) <= 0) {
614 1.1 kleink /* no digits, fcvt style */
615 1.1 kleink no_digits:
616 1.1 kleink k = -1 - ndigits;
617 1.1 kleink goto ret;
618 1.1 kleink }
619 1.1 kleink one_digit:
620 1.1 kleink *s++ = '1';
621 1.1 kleink k++;
622 1.1 kleink goto ret;
623 1.1 kleink }
624 1.1 kleink if (leftright) {
625 1.5 christos if (m2 > 0) {
626 1.1 kleink mhi = lshift(mhi, m2);
627 1.5 christos if (mhi == NULL)
628 1.5 christos return NULL;
629 1.5 christos }
630 1.1 kleink
631 1.1 kleink /* Compute mlo -- check for special case
632 1.1 kleink * that d is a normalized power of 2.
633 1.1 kleink */
634 1.1 kleink
635 1.1 kleink mlo = mhi;
636 1.1 kleink if (spec_case) {
637 1.1 kleink mhi = Balloc(mhi->k);
638 1.5 christos if (mhi == NULL)
639 1.5 christos return NULL;
640 1.1 kleink Bcopy(mhi, mlo);
641 1.1 kleink mhi = lshift(mhi, Log2P);
642 1.5 christos if (mhi == NULL)
643 1.5 christos return NULL;
644 1.1 kleink }
645 1.1 kleink
646 1.1 kleink for(i = 1;;i++) {
647 1.1 kleink dig = quorem(b,S) + '0';
648 1.1 kleink /* Do we yet have the shortest decimal string
649 1.1 kleink * that will round to d?
650 1.1 kleink */
651 1.1 kleink j = cmp(b, mlo);
652 1.1 kleink delta = diff(S, mhi);
653 1.5 christos if (delta == NULL)
654 1.5 christos return NULL;
655 1.2 kleink jj1 = delta->sign ? 1 : cmp(b, delta);
656 1.1 kleink Bfree(delta);
657 1.1 kleink #ifndef ROUND_BIASED
658 1.2 kleink if (jj1 == 0 && mode != 1 && !(word1(d) & 1)
659 1.1 kleink #ifdef Honor_FLT_ROUNDS
660 1.1 kleink && rounding >= 1
661 1.1 kleink #endif
662 1.1 kleink ) {
663 1.1 kleink if (dig == '9')
664 1.1 kleink goto round_9_up;
665 1.1 kleink if (j > 0)
666 1.1 kleink dig++;
667 1.1 kleink #ifdef SET_INEXACT
668 1.1 kleink else if (!b->x[0] && b->wds <= 1)
669 1.1 kleink inexact = 0;
670 1.1 kleink #endif
671 1.1 kleink *s++ = dig;
672 1.1 kleink goto ret;
673 1.1 kleink }
674 1.1 kleink #endif
675 1.2 kleink if (j < 0 || (j == 0 && mode != 1
676 1.1 kleink #ifndef ROUND_BIASED
677 1.1 kleink && !(word1(d) & 1)
678 1.1 kleink #endif
679 1.2 kleink )) {
680 1.1 kleink if (!b->x[0] && b->wds <= 1) {
681 1.1 kleink #ifdef SET_INEXACT
682 1.1 kleink inexact = 0;
683 1.1 kleink #endif
684 1.1 kleink goto accept_dig;
685 1.1 kleink }
686 1.1 kleink #ifdef Honor_FLT_ROUNDS
687 1.1 kleink if (mode > 1)
688 1.1 kleink switch(rounding) {
689 1.1 kleink case 0: goto accept_dig;
690 1.1 kleink case 2: goto keep_dig;
691 1.1 kleink }
692 1.1 kleink #endif /*Honor_FLT_ROUNDS*/
693 1.2 kleink if (jj1 > 0) {
694 1.1 kleink b = lshift(b, 1);
695 1.5 christos if (b == NULL)
696 1.5 christos return NULL;
697 1.2 kleink jj1 = cmp(b, S);
698 1.2 kleink if ((jj1 > 0 || (jj1 == 0 && dig & 1))
699 1.1 kleink && dig++ == '9')
700 1.1 kleink goto round_9_up;
701 1.1 kleink }
702 1.1 kleink accept_dig:
703 1.1 kleink *s++ = dig;
704 1.1 kleink goto ret;
705 1.1 kleink }
706 1.2 kleink if (jj1 > 0) {
707 1.1 kleink #ifdef Honor_FLT_ROUNDS
708 1.1 kleink if (!rounding)
709 1.1 kleink goto accept_dig;
710 1.1 kleink #endif
711 1.1 kleink if (dig == '9') { /* possible if i == 1 */
712 1.1 kleink round_9_up:
713 1.1 kleink *s++ = '9';
714 1.1 kleink goto roundoff;
715 1.1 kleink }
716 1.1 kleink *s++ = dig + 1;
717 1.1 kleink goto ret;
718 1.1 kleink }
719 1.1 kleink #ifdef Honor_FLT_ROUNDS
720 1.1 kleink keep_dig:
721 1.1 kleink #endif
722 1.1 kleink *s++ = dig;
723 1.1 kleink if (i == ilim)
724 1.1 kleink break;
725 1.1 kleink b = multadd(b, 10, 0);
726 1.5 christos if (b == NULL)
727 1.5 christos return NULL;
728 1.5 christos if (mlo == mhi) {
729 1.1 kleink mlo = mhi = multadd(mhi, 10, 0);
730 1.5 christos if (mlo == NULL)
731 1.5 christos return NULL;
732 1.5 christos }
733 1.1 kleink else {
734 1.1 kleink mlo = multadd(mlo, 10, 0);
735 1.5 christos if (mlo == NULL)
736 1.5 christos return NULL;
737 1.1 kleink mhi = multadd(mhi, 10, 0);
738 1.5 christos if (mhi == NULL)
739 1.5 christos return NULL;
740 1.1 kleink }
741 1.1 kleink }
742 1.1 kleink }
743 1.1 kleink else
744 1.1 kleink for(i = 1;; i++) {
745 1.1 kleink *s++ = dig = quorem(b,S) + '0';
746 1.1 kleink if (!b->x[0] && b->wds <= 1) {
747 1.1 kleink #ifdef SET_INEXACT
748 1.1 kleink inexact = 0;
749 1.1 kleink #endif
750 1.1 kleink goto ret;
751 1.1 kleink }
752 1.1 kleink if (i >= ilim)
753 1.1 kleink break;
754 1.1 kleink b = multadd(b, 10, 0);
755 1.5 christos if (b == NULL)
756 1.5 christos return NULL;
757 1.1 kleink }
758 1.1 kleink
759 1.1 kleink /* Round off last digit */
760 1.1 kleink
761 1.1 kleink #ifdef Honor_FLT_ROUNDS
762 1.1 kleink switch(rounding) {
763 1.1 kleink case 0: goto trimzeros;
764 1.1 kleink case 2: goto roundoff;
765 1.1 kleink }
766 1.1 kleink #endif
767 1.1 kleink b = lshift(b, 1);
768 1.1 kleink j = cmp(b, S);
769 1.2 kleink if (j > 0 || (j == 0 && dig & 1)) {
770 1.1 kleink roundoff:
771 1.1 kleink while(*--s == '9')
772 1.1 kleink if (s == s0) {
773 1.1 kleink k++;
774 1.1 kleink *s++ = '1';
775 1.1 kleink goto ret;
776 1.1 kleink }
777 1.1 kleink ++*s++;
778 1.1 kleink }
779 1.1 kleink else {
780 1.2 kleink #ifdef Honor_FLT_ROUNDS
781 1.1 kleink trimzeros:
782 1.2 kleink #endif
783 1.1 kleink while(*--s == '0');
784 1.1 kleink s++;
785 1.1 kleink }
786 1.1 kleink ret:
787 1.1 kleink Bfree(S);
788 1.1 kleink if (mhi) {
789 1.1 kleink if (mlo && mlo != mhi)
790 1.1 kleink Bfree(mlo);
791 1.1 kleink Bfree(mhi);
792 1.1 kleink }
793 1.1 kleink ret1:
794 1.1 kleink #ifdef SET_INEXACT
795 1.1 kleink if (inexact) {
796 1.1 kleink if (!oldinexact) {
797 1.1 kleink word0(d) = Exp_1 + (70 << Exp_shift);
798 1.1 kleink word1(d) = 0;
799 1.1 kleink dval(d) += 1.;
800 1.1 kleink }
801 1.1 kleink }
802 1.1 kleink else if (!oldinexact)
803 1.1 kleink clear_inexact();
804 1.1 kleink #endif
805 1.1 kleink Bfree(b);
806 1.3 kleink if (s == s0) { /* don't return empty string */
807 1.3 kleink *s++ = '0';
808 1.3 kleink k = 0;
809 1.3 kleink }
810 1.1 kleink *s = 0;
811 1.1 kleink *decpt = k + 1;
812 1.1 kleink if (rve)
813 1.1 kleink *rve = s;
814 1.1 kleink return s0;
815 1.1 kleink }
816