]>
git.proxmox.com Git - mirror_edk2.git/blob - StdLib/LibC/gdtoa/gdtoa.c
3 Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.<BR>
4 This program and the accompanying materials are licensed and made available under
5 the terms and conditions of the BSD License that accompanies this distribution.
6 The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php.
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12 ***************************************************************
14 The author of this software is David M. Gay.
16 Copyright (C) 1998, 1999 by Lucent Technologies
19 Permission to use, copy, modify, and distribute this software and
20 its documentation for any purpose and without fee is hereby
21 granted, provided that the above copyright notice appear in all
22 copies and that both that the copyright notice and this
23 permission notice and warranty disclaimer appear in supporting
24 documentation, and that the name of Lucent or any of its entities
25 not be used in advertising or publicity pertaining to
26 distribution of the software without specific, written prior
29 LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
30 INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
31 IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
32 SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
33 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
34 IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
35 ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
38 Please send bug reports to David M. Gay (dmg at acm dot org,
39 with " at " changed at "@" and " dot " changed to ".").
41 NetBSD: gdtoa.c,v 1.1.1.1.4.1.4.1 2008/04/08 21:10:55 jdc Exp
43 #include <LibConfig.h>
48 /* Disable warnings about conversions to narrower data types. */
49 #pragma warning ( disable : 4244 )
50 // Squelch bogus warnings about uninitialized variable use.
51 #pragma warning ( disable : 4701 )
55 bitstob(ULong
*bits
, int nbits
, int *bbits
)
74 be
= bits
+ (((unsigned int)nbits
- 1) >> kshift
);
77 *x
++ = *bits
& ALL_ON
;
79 *x
++ = (*bits
>> 16) & ALL_ON
;
81 } while(++bits
<= be
);
90 *bbits
= i
*ULbits
+ 32 - hi0bits(b
->x
[i
]);
95 /* dtoa for IEEE arithmetic (dmg): convert double to ASCII string.
97 * Inspired by "How to Print Floating-Point Numbers Accurately" by
98 * Guy L. Steele, Jr. and Jon L. White [Proc. ACM SIGPLAN '90, pp. 112-126].
101 * 1. Rather than iterating, we use a simple numeric overestimate
102 * to determine k = floor(log10(d)). We scale relevant
103 * quantities using O(log2(k)) rather than O(k) multiplications.
104 * 2. For some modes > 2 (corresponding to ecvt and fcvt), we don't
105 * try to generate digits strictly left to right. Instead, we
106 * compute with fewer bits and propagate the carry if necessary
107 * when rounding the final digit up. This is often faster.
108 * 3. Under the assumption that input will be rounded nearest,
109 * mode 0 renders 1e23 as 1e23 rather than 9.999999999999999e22.
110 * That is, we allow equality in stopping tests when the
111 * round-nearest rule will give the same floating-point value
112 * as would satisfaction of the stopping test with strict
114 * 4. We remove common factors of powers of 2 from relevant
116 * 5. When converting floating-point integers less than 1e16,
117 * we use floating-point arithmetic rather than resorting
118 * to multiple-precision integers.
119 * 6. When asked to produce fewer than 15 digits, we first try
120 * to get by with floating-point arithmetic; we resort to
121 * multiple-precision integer arithmetic only if we cannot
122 * guarantee that the floating-point calculation has given
123 * the correctly rounded result. For k requested digits and
124 * "uniformly" distributed input, the probability is
125 * something like 10^(k-15) that we must resort to the Long
131 (FPI
*fpi
, int be
, ULong
*bits
, int *kindp
, int mode
, int ndigits
, int *decpt
, char **rve
)
133 /* Arguments ndigits and decpt are similar to the second and third
134 arguments of ecvt and fcvt; trailing zeros are suppressed from
135 the returned string. If not null, *rve is set to point
136 to the end of the return value. If d is +-Infinity or NaN,
137 then *decpt is set to 9999.
140 0 ==> shortest string that yields d when read in
141 and rounded to nearest.
142 1 ==> like 0, but with Steele & White stopping rule;
143 e.g. with IEEE P754 arithmetic , mode 0 gives
144 1e23 whereas mode 1 gives 9.999999999999999e22.
145 2 ==> max(1,ndigits) significant digits. This gives a
146 return value similar to that of ecvt, except
147 that trailing zeros are suppressed.
148 3 ==> through ndigits past the decimal point. This
149 gives a return value similar to that from fcvt,
150 except that trailing zeros are suppressed, and
151 ndigits can be negative.
152 4-9 should give the same return values as 2-3, i.e.,
153 4 <= mode <= 9 ==> same return as mode
154 2 + (mode & 1). These modes are mainly for
155 debugging; often they run slower but sometimes
156 faster than modes 2-3.
157 4,5,8,9 ==> left-to-right digit generation.
158 6-9 ==> don't try fast floating-point estimate
161 Values of mode other than 0-9 are treated as mode 0.
163 Sufficient space is allocated to the return value
164 to hold the suppressed trailing zeros.
167 int bbits
, b2
, b5
, be0
, dig
, i
, ieps
, ilim
= 0, ilim0
, ilim1
= 0, inex
;
168 int j
, jj1
, k
, k0
, k_check
, kind
, leftright
, m2
, m5
, nbits
;
169 int rdir
, s2
, s5
, spec_case
, try_quick
;
171 Bigint
*b
, *b1
, *delta
, *mlo
, *mhi
, *mhi1
, *S
;
172 double d
, d2
, ds
, eps
;
177 #ifndef MULTIPLE_THREADS
179 freedtoa(dtoa_result
);
184 if (*kindp
& STRTOG_NoMemory
)
186 kind
= *kindp
&= ~STRTOG_Inexact
;
187 switch(kind
& STRTOG_Retmask
) {
191 case STRTOG_Denormal
:
193 case STRTOG_Infinite
:
195 return nrv_alloc("Infinity", rve
, 8);
198 return nrv_alloc("NaN", rve
, 3);
202 b
= bitstob(bits
, nbits
= fpi
->nbits
, &bbits
);
206 if ( (i
= trailz(b
)) !=0) {
215 return nrv_alloc("0", rve
, 1);
218 dval(d
) = b2d(b
, &i
);
220 word0(d
) &= Frac_mask1
;
223 if ( (j
= 11 - hi0bits(word0(d
) & Frac_mask
)) !=0)
227 /* log(x) ~=~ log(1.5) + (x-1.5)/1.5
228 * log10(x) = log(x) / log(10)
229 * ~=~ log(1.5)/log(10) + (x-1.5)/(1.5*log(10))
230 * log10(d) = (i-Bias)*log(2)/log(10) + log10(d2)
232 * This suggests computing an approximation k to log10(d) by
234 * k = (i - Bias)*0.301029995663981
235 * + ( (d2-1.5)*0.289529654602168 + 0.176091259055681 );
237 * We want k to be too large rather than too small.
238 * The error in the first-order Taylor series approximation
239 * is in our favor, so we just round up the constant enough
240 * to compensate for any error in the multiplication of
241 * (i - Bias) by 0.301029995663981; since |i - Bias| <= 1077,
242 * and 1077 * 0.30103 * 2^-52 ~=~ 7.2e-14,
243 * adding 1e-13 to the constant term more than suffices.
244 * Hence we adjust the constant term to 0.1760912590558.
245 * (We could get a more accurate k by invoking log10,
246 * but this is probably not worthwhile.)
252 ds
= (dval(d
)-1.5)*0.289529654602168 + 0.1760912590558 + i
*0.301029995663981;
254 /* correct assumption about exponent range */
261 if (ds
< 0. && ds
!= k
)
262 k
--; /* want k = floor(ds) */
266 if ( (jj1
= j
& 3) !=0)
268 word0(d
) += j
<< Exp_shift
- 2 & Exp_mask
;
270 word0(d
) += (be
+ bbits
- 1) << Exp_shift
;
272 if (k
>= 0 && k
<= Ten_pmax
) {
273 if (dval(d
) < tens
[k
])
296 if (mode
< 0 || mode
> 9)
308 i
= (int)(nbits
* .30103) + 3;
317 ilim
= ilim1
= i
= ndigits
;
329 s
= s0
= rv_alloc((size_t)i
);
333 if ( (rdir
= fpi
->rounding
- 1) !=0) {
336 if (kind
& STRTOG_Neg
)
340 /* Now rdir = 0 ==> round near, 1 ==> round up, 2 ==> round down. */
342 if (ilim
>= 0 && ilim
<= Quick_max
&& try_quick
&& !rdir
343 #ifndef IMPRECISE_INEXACT
348 /* Try to get by with floating-point arithmetic. */
353 if ( (j
= 11 - hi0bits(word0(d
) & Frac_mask
)) !=0)
358 ieps
= 2; /* conservative */
361 j
= (unsigned int)k
>> 4;
363 /* prevent overflows */
365 dval(d
) /= bigtens
[n_bigtens
-1];
368 for(; j
; j
/= 2, i
++)
376 if ( (jj1
= -k
) !=0) {
377 dval(d
) *= tens
[jj1
& 0xf];
378 for(j
= jj1
>> 4; j
; j
>>= 1, i
++)
381 dval(d
) *= bigtens
[i
];
385 if (k_check
&& dval(d
) < 1. && ilim
> 0) {
393 dval(eps
) = ieps
*dval(d
) + 7.;
394 word0(eps
) -= (P
-1)*Exp_msk1
;
398 if (dval(d
) > dval(eps
))
400 if (dval(d
) < -dval(eps
))
406 /* Use Steele & White method of only
407 * generating digits needed.
409 dval(eps
) = ds
*0.5/tens
[ilim
-1] - dval(eps
);
411 L
= (Long
)(dval(d
)/ds
);
414 if (dval(d
) < dval(eps
)) {
416 inex
= STRTOG_Inexlo
;
419 if (ds
- dval(d
) < dval(eps
))
429 /* Generate ilim digits, then fix them up. */
430 dval(eps
) *= tens
[ilim
-1];
431 for(i
= 1;; i
++, dval(d
) *= 10.) {
432 if ( (L
= (Long
)(dval(d
)/ds
)) !=0)
437 if (dval(d
) > ds
+ dval(eps
))
439 else if (dval(d
) < ds
- dval(eps
)) {
443 inex
= STRTOG_Inexlo
;
459 /* Do we have a "small" integer? */
461 if (be
>= 0 && k
<= Int_max
) {
464 if (ndigits
< 0 && ilim
<= 0) {
466 if (ilim
< 0 || dval(d
) <= 5*ds
)
470 for(i
= 1;; i
++, dval(d
) *= 10.) {
473 #ifdef Check_FLT_ROUNDS
474 /* If FLT_ROUNDS == 2, L will usually be high by 1 */
487 inex
= STRTOG_Inexlo
;
491 if (dval(d
) > ds
|| (dval(d
) == ds
&& L
& 1)) {
493 inex
= STRTOG_Inexhi
;
503 inex
= STRTOG_Inexlo
;
517 if (be
- i
++ < fpi
->emin
)
519 i
= be
- fpi
->emin
+ 1;
530 if ((i
= ilim
) < 0) {
539 if (m2
> 0 && s2
> 0) {
540 i
= m2
< s2
? m2
: s2
;
548 mhi
= pow5mult(mhi
, m5
);
557 if ( (j
= b5
- m5
) !=0) {
578 /* Check for special case that d is a normalized power of 2. */
582 if (bbits
== 1 && be0
> fpi
->emin
+ 1) {
583 /* The special case */
590 /* Arrange for convenient computation of quotients:
591 * shift left if necessary so divisor has 4 leading 0 bits.
593 * Perhaps we should just compute leading 28 bits of S once
594 * and for all and pass them and a shift to quorem, so it
595 * can do shifts and ors to compute the numerator for q.
598 if ( (i
= ((s5
? 32 - hi0bits(S
->x
[S
->wds
-1]) : 1) + s2
) & 0x1f) !=0)
601 if ( (i
= ((s5
? 32 - hi0bits(S
->x
[S
->wds
-1]) : 1) + s2
) & 0xf) !=0)
623 b
= multadd(b
, 10, 0); /* we botched the k estimate */
627 mhi
= multadd(mhi
, 10, 0);
634 if (ilim
<= 0 && mode
> 2) {
635 if (ilim
< 0 || cmp(b
,S
= multadd(S
,5,0)) <= 0) {
636 /* no digits, fcvt style */
639 inex
= STRTOG_Inexlo
;
643 inex
= STRTOG_Inexhi
;
650 mhi
= lshift(mhi
, m2
);
655 /* Compute mlo -- check for special case
656 * that d is a normalized power of 2.
661 mhi
= Balloc(mhi
->k
);
665 mhi
= lshift(mhi
, 1);
671 dig
= quorem(b
,S
) + '0';
672 /* Do we yet have the shortest decimal string
673 * that will round to d?
676 delta
= diff(S
, mhi
);
679 jj1
= delta
->sign
? 1 : cmp(b
, delta
);
682 if (jj1
== 0 && !mode
&& !(bits
[0] & 1) && !rdir
) {
686 if (b
->wds
> 1 || b
->x
[0])
687 inex
= STRTOG_Inexlo
;
691 inex
= STRTOG_Inexhi
;
697 if (j
< 0 || (j
== 0 && !mode
702 if (rdir
&& (b
->wds
> 1 || b
->x
[0])) {
704 inex
= STRTOG_Inexlo
;
707 while (cmp(S
,mhi
) > 0) {
709 mhi1
= multadd(mhi
, 10, 0);
715 b
= multadd(b
, 10, 0);
718 dig
= quorem(b
,S
) + '0';
722 inex
= STRTOG_Inexhi
;
730 if ((jj1
> 0 || (jj1
== 0 && dig
& 1))
733 inex
= STRTOG_Inexhi
;
735 if (b
->wds
> 1 || b
->x
[0])
736 inex
= STRTOG_Inexlo
;
741 if (jj1
> 0 && rdir
!= 2) {
742 if (dig
== '9') { /* possible if i == 1 */
745 inex
= STRTOG_Inexhi
;
748 inex
= STRTOG_Inexhi
;
755 b
= multadd(b
, 10, 0);
759 mlo
= mhi
= multadd(mhi
, 10, 0);
764 mlo
= multadd(mlo
, 10, 0);
767 mhi
= multadd(mhi
, 10, 0);
775 *s
++ = dig
= quorem(b
,S
) + '0';
778 b
= multadd(b
, 10, 0);
783 /* Round off last digit */
786 if (rdir
== 2 || (b
->wds
<= 1 && !b
->x
[0]))
794 if (j
> 0 || (j
== 0 && dig
& 1)) {
796 inex
= STRTOG_Inexhi
;
807 if (b
->wds
> 1 || b
->x
[0])
808 inex
= STRTOG_Inexlo
;
815 if (mlo
&& mlo
!= mhi
)