]>
git.saurik.com Git - apple/libc.git/blob - gdtoa/FreeBSD/gdtoa-dtoa.c
1 /****************************************************************
3 The author of this software is David M. Gay.
5 Copyright (C) 1998, 1999 by Lucent Technologies
8 Permission to use, copy, modify, and distribute this software and
9 its documentation for any purpose and without fee is hereby
10 granted, provided that the above copyright notice appear in all
11 copies and that both that the copyright notice and this
12 permission notice and warranty disclaimer appear in supporting
13 documentation, and that the name of Lucent or any of its entities
14 not be used in advertising or publicity pertaining to
15 distribution of the software without specific, written prior
18 LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
19 INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
20 IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
21 SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
22 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
23 IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
24 ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
27 ****************************************************************/
29 /* Please send bug reports to
31 Bell Laboratories, Room 2C-463
33 Murray Hill, NJ 07974-0636
40 /* dtoa for IEEE arithmetic (dmg): convert double to ASCII string.
42 * Inspired by "How to Print Floating-Point Numbers Accurately" by
43 * Guy L. Steele, Jr. and Jon L. White [Proc. ACM SIGPLAN '90, pp. 92-101].
46 * 1. Rather than iterating, we use a simple numeric overestimate
47 * to determine k = floor(log10(d)). We scale relevant
48 * quantities using O(log2(k)) rather than O(k) multiplications.
49 * 2. For some modes > 2 (corresponding to ecvt and fcvt), we don't
50 * try to generate digits strictly left to right. Instead, we
51 * compute with fewer bits and propagate the carry if necessary
52 * when rounding the final digit up. This is often faster.
53 * 3. Under the assumption that input will be rounded nearest,
54 * mode 0 renders 1e23 as 1e23 rather than 9.999999999999999e22.
55 * That is, we allow equality in stopping tests when the
56 * round-nearest rule will give the same floating-point value
57 * as would satisfaction of the stopping test with strict
59 * 4. We remove common factors of powers of 2 from relevant
61 * 5. When converting floating-point integers less than 1e16,
62 * we use floating-point arithmetic rather than resorting
63 * to multiple-precision integers.
64 * 6. When asked to produce fewer than 15 digits, we first try
65 * to get by with floating-point arithmetic; we resort to
66 * multiple-precision integer arithmetic only if we cannot
67 * guarantee that the floating-point calculation has given
68 * the correctly rounded result. For k requested digits and
69 * "uniformly" distributed input, the probability is
70 * something like 10^(k-15) that we must resort to the Long
74 #ifdef Honor_FLT_ROUNDS
75 #define Rounding rounding
76 #undef Check_FLT_ROUNDS
77 #define Check_FLT_ROUNDS
79 #define Rounding Flt_Rounds
85 (d
, mode
, ndigits
, decpt
, sign
, rve
)
86 double d
; int mode
, ndigits
, *decpt
, *sign
; char **rve
;
88 (double d
, int mode
, int ndigits
, int *decpt
, int *sign
, char **rve
)
91 /* Arguments ndigits, decpt, sign are similar to those
92 of ecvt and fcvt; trailing zeros are suppressed from
93 the returned string. If not null, *rve is set to point
94 to the end of the return value. If d is +-Infinity or NaN,
95 then *decpt is set to 9999.
98 0 ==> shortest string that yields d when read in
99 and rounded to nearest.
100 1 ==> like 0, but with Steele & White stopping rule;
101 e.g. with IEEE P754 arithmetic , mode 0 gives
102 1e23 whereas mode 1 gives 9.999999999999999e22.
103 2 ==> max(1,ndigits) significant digits. This gives a
104 return value similar to that of ecvt, except
105 that trailing zeros are suppressed.
106 3 ==> through ndigits past the decimal point. This
107 gives a return value similar to that from fcvt,
108 except that trailing zeros are suppressed, and
109 ndigits can be negative.
110 4,5 ==> similar to 2 and 3, respectively, but (in
111 round-nearest mode) with the tests of mode 0 to
112 possibly return a shorter string that rounds to d.
113 With IEEE arithmetic and compilation with
114 -DHonor_FLT_ROUNDS, modes 4 and 5 behave the same
115 as modes 2 and 3 when FLT_ROUNDS != 1.
116 6-9 ==> Debugging modes similar to mode - 4: don't try
117 fast floating-point estimate (if applicable).
119 Values of mode other than 0-9 are treated as mode 0.
121 Sufficient space is allocated to the return value
122 to hold the suppressed trailing zeros.
125 int bbits
, b2
, b5
, be
, dig
, i
, ieps
, ilim
, ilim0
, ilim1
,
126 j
, j1
, k
, k0
, k_check
, leftright
, m2
, m5
, s2
, s5
,
127 spec_case
, try_quick
;
129 #ifndef Sudden_Underflow
133 Bigint
*b
, *b1
, *delta
, *mlo
, *mhi
, *S
;
136 #ifdef Honor_FLT_ROUNDS
140 int inexact
, oldinexact
;
143 #ifndef MULTIPLE_THREADS
145 freedtoa(dtoa_result
);
150 if (word0(d
) & Sign_bit
) {
151 /* set sign for everything, including 0's and NaNs */
153 word0(d
) &= ~Sign_bit
; /* clear sign bit */
158 #if defined(IEEE_Arith) + defined(VAX)
160 if ((word0(d
) & Exp_mask
) == Exp_mask
)
162 if (word0(d
) == 0x8000)
165 /* Infinity or NaN */
168 if (!word1(d
) && !(word0(d
) & 0xfffff))
169 return nrv_alloc("Infinity", rve
, 8);
171 return nrv_alloc("NaN", rve
, 3);
175 dval(d
) += 0; /* normalize */
179 return nrv_alloc("0", rve
, 1);
183 try_quick
= oldinexact
= get_inexact();
186 #ifdef Honor_FLT_ROUNDS
187 if ((rounding
= Flt_Rounds
) >= 2) {
189 rounding
= rounding
== 2 ? 0 : 2;
196 b
= d2b(dval(d
), &be
, &bbits
);
197 #ifdef Sudden_Underflow
198 i
= (int)(word0(d
) >> Exp_shift1
& (Exp_mask
>>Exp_shift1
));
200 if (( i
= (int)(word0(d
) >> Exp_shift1
& (Exp_mask
>>Exp_shift1
)) )!=0) {
203 word0(d2
) &= Frac_mask1
;
206 if (( j
= 11 - hi0bits(word0(d2
) & Frac_mask
) )!=0)
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)
215 * This suggests computing an approximation k to log10(d) by
217 * k = (i - Bias)*0.301029995663981
218 * + ( (d2-1.5)*0.289529654602168 + 0.176091259055681 );
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.)
237 #ifndef Sudden_Underflow
241 /* d is denormalized */
243 i
= bbits
+ be
+ (Bias
+ (P
-1) - 1);
244 x
= i
> 32 ? word0(d
) << 64 - i
| word1(d
) >> i
- 32
245 : word1(d
) << 32 - i
;
247 word0(d2
) -= 31*Exp_msk1
; /* adjust exponent */
248 i
-= (Bias
+ (P
-1) - 1) + 1;
252 ds
= (dval(d2
)-1.5)*0.289529654602168 + 0.1760912590558 + i
*0.301029995663981;
254 if (ds
< 0. && ds
!= k
)
255 k
--; /* want k = floor(ds) */
257 if (k
>= 0 && k
<= Ten_pmax
) {
258 if (dval(d
) < tens
[k
])
281 if (mode
< 0 || mode
> 9)
285 #ifdef Check_FLT_ROUNDS
286 try_quick
= Rounding
== 1;
290 #endif /*SET_INEXACT*/
310 ilim
= ilim1
= i
= ndigits
;
322 s
= s0
= rv_alloc(i
);
324 #ifdef Honor_FLT_ROUNDS
325 if (mode
> 1 && rounding
!= 1)
329 if (ilim
>= 0 && ilim
<= Quick_max
&& try_quick
) {
331 /* Try to get by with floating-point arithmetic. */
337 ieps
= 2; /* conservative */
342 /* prevent overflows */
344 dval(d
) /= bigtens
[n_bigtens
-1];
347 for(; j
; j
>>= 1, i
++)
354 else if (( j1
= -k
)!=0) {
355 dval(d
) *= tens
[j1
& 0xf];
356 for(j
= j1
>> 4; j
; j
>>= 1, i
++)
359 dval(d
) *= bigtens
[i
];
362 if (k_check
&& dval(d
) < 1. && ilim
> 0) {
370 dval(eps
) = ieps
*dval(d
) + 7.;
371 word0(eps
) -= (P
-1)*Exp_msk1
;
375 if (dval(d
) > dval(eps
))
377 if (dval(d
) < -dval(eps
))
383 /* Use Steele & White method of only
384 * generating digits needed.
386 dval(eps
) = 0.5/tens
[ilim
-1] - dval(eps
);
391 if (dval(d
) < dval(eps
))
393 if (1. - dval(d
) < dval(eps
))
403 /* Generate ilim digits, then fix them up. */
404 dval(eps
) *= tens
[ilim
-1];
405 for(i
= 1;; i
++, dval(d
) *= 10.) {
411 if (dval(d
) > 0.5 + dval(eps
))
413 else if (dval(d
) < 0.5 - dval(eps
)) {
431 /* Do we have a "small" integer? */
433 if (be
>= 0 && k
<= Int_max
) {
436 if (ndigits
< 0 && ilim
<= 0) {
438 if (ilim
< 0 || dval(d
) <= 5*ds
)
442 for(i
= 1;; i
++, dval(d
) *= 10.) {
443 L
= (Long
)(dval(d
) / ds
);
445 #ifdef Check_FLT_ROUNDS
446 /* If FLT_ROUNDS == 2, L will usually be high by 1 */
460 #ifdef Honor_FLT_ROUNDS
464 case 2: goto bump_up
;
468 if (dval(d
) > ds
|| dval(d
) == ds
&& L
& 1) {
489 #ifndef Sudden_Underflow
490 denorm
? be
+ (Bias
+ (P
-1) - 1 + 1) :
493 1 + 4*P
- 3 - bbits
+ ((bbits
+ be
- 1) & 3);
501 if (m2
> 0 && s2
> 0) {
502 i
= m2
< s2
? m2
: s2
;
510 mhi
= pow5mult(mhi
, m5
);
515 if (( j
= b5
- m5
)!=0)
525 /* Check for special case that d is a normalized power of 2. */
528 if ((mode
< 2 || leftright
)
529 #ifdef Honor_FLT_ROUNDS
533 if (!word1(d
) && !(word0(d
) & Bndry_mask
)
534 #ifndef Sudden_Underflow
535 && word0(d
) & (Exp_mask
& ~Exp_msk1
)
538 /* The special case */
545 /* Arrange for convenient computation of quotients:
546 * shift left if necessary so divisor has 4 leading 0 bits.
548 * Perhaps we should just compute leading 28 bits of S once
549 * and for all and pass them and a shift to quorem, so it
550 * can do shifts and ors to compute the numerator for q.
553 if (( i
= ((s5
? 32 - hi0bits(S
->x
[S
->wds
-1]) : 1) + s2
) & 0x1f )!=0)
556 if (( i
= ((s5
? 32 - hi0bits(S
->x
[S
->wds
-1]) : 1) + s2
) & 0xf )!=0)
578 b
= multadd(b
, 10, 0); /* we botched the k estimate */
580 mhi
= multadd(mhi
, 10, 0);
584 if (ilim
<= 0 && (mode
== 3 || mode
== 5)) {
585 if (ilim
< 0 || cmp(b
,S
= multadd(S
,5,0)) <= 0) {
586 /* no digits, fcvt style */
598 mhi
= lshift(mhi
, m2
);
600 /* Compute mlo -- check for special case
601 * that d is a normalized power of 2.
606 mhi
= Balloc(mhi
->k
);
608 mhi
= lshift(mhi
, Log2P
);
612 dig
= quorem(b
,S
) + '0';
613 /* Do we yet have the shortest decimal string
614 * that will round to d?
617 delta
= diff(S
, mhi
);
618 j1
= delta
->sign
? 1 : cmp(b
, delta
);
621 if (j1
== 0 && mode
!= 1 && !(word1(d
) & 1)
622 #ifdef Honor_FLT_ROUNDS
631 else if (!b
->x
[0] && b
->wds
<= 1)
638 if (j
< 0 || j
== 0 && mode
!= 1
643 if (!b
->x
[0] && b
->wds
<= 1) {
649 #ifdef Honor_FLT_ROUNDS
652 case 0: goto accept_dig
;
653 case 2: goto keep_dig
;
655 #endif /*Honor_FLT_ROUNDS*/
659 if ((j1
> 0 || j1
== 0 && dig
& 1)
668 #ifdef Honor_FLT_ROUNDS
672 if (dig
== '9') { /* possible if i == 1 */
680 #ifdef Honor_FLT_ROUNDS
686 b
= multadd(b
, 10, 0);
688 mlo
= mhi
= multadd(mhi
, 10, 0);
690 mlo
= multadd(mlo
, 10, 0);
691 mhi
= multadd(mhi
, 10, 0);
697 *s
++ = dig
= quorem(b
,S
) + '0';
698 if (!b
->x
[0] && b
->wds
<= 1) {
706 b
= multadd(b
, 10, 0);
709 /* Round off last digit */
711 #ifdef Honor_FLT_ROUNDS
713 case 0: goto trimzeros
;
714 case 2: goto roundoff
;
719 if (j
> 0 || j
== 0 && dig
& 1) {
737 if (mlo
&& mlo
!= mhi
)
745 word0(d
) = Exp_1
+ (70 << Exp_shift
);
750 else if (!oldinexact
)