]>
git.saurik.com Git - apple/libc.git/blob - gdtoa/FreeBSD/gdtoa-strtodg.c
1 /****************************************************************
3 The author of this software is David M. Gay.
5 Copyright (C) 1998-2001 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 David M. Gay (dmg at acm dot org,
30 * with " at " changed at "@" and " dot " changed to "."). */
39 fivesbits
[] = { 0, 3, 5, 7, 10, 12, 14, 17, 19, 21,
40 24, 26, 28, 31, 33, 35, 38, 40, 42, 45,
49 increment(b
) Bigint
*b
;
64 if (*x
< (ULong
)0xffffffffL
) {
81 if (b
->wds
>= b
->maxwds
) {
94 decrement(b
) Bigint
*b
;
118 borrow
= (y
& 0x10000) >> 16;
120 } while(borrow
&& x
< xe
);
122 return STRTOG_Inexlo
;
127 all_on(b
, n
) Bigint
*b
; int n
;
129 all_on(Bigint
*b
, int n
)
135 xe
= x
+ (n
>> kshift
);
137 if ((*x
++ & ALL_ON
) != ALL_ON
)
140 return ((*x
| (ALL_ON
<< n
)) & ALL_ON
) == ALL_ON
;
146 set_ones(b
, n
) Bigint
*b
; int n
;
148 set_ones(Bigint
*b
, int n
)
154 k
= (n
+ ((1 << kshift
) - 1)) >> kshift
;
168 x
[-1] >>= ULbits
- n
;
175 (d
, fpi
, exp
, bits
, exact
, rd
, irv
)
176 double d
; FPI
*fpi
; Long
*exp
; ULong
*bits
; int exact
, rd
, *irv
;
178 (double d
, FPI
*fpi
, Long
*exp
, ULong
*bits
, int exact
, int rd
, int *irv
)
182 ULong carry
, inex
, lostbits
;
183 int bdif
, e
, j
, k
, k1
, nb
, rv
;
186 b
= d2b(d
, &e
, &bdif
);
187 bdif
-= nb
= fpi
->nbits
;
196 #ifndef IMPRECISE_INEXACT
213 default: /* round near */
224 if (b
->x
[k
>>kshift
] & ((ULong
)1 << (k
& kmask
)))
228 /* "break" cases: round up 1 bit, then truncate; bdif > 0 */
233 if ( (lostbits
= any_on(b
, bdif
)) !=0)
234 inex
= STRTOG_Inexlo
;
237 inex
= STRTOG_Inexhi
;
239 if ( (j
= nb
& kmask
) !=0)
241 if (hi0bits(b
->x
[b
->wds
- 1]) != j
) {
243 lostbits
= b
->x
[0] & 1;
250 b
= lshift(b
, -bdif
);
254 if (k
> nb
|| fpi
->sudden_underflow
) {
256 *irv
= STRTOG_Underflow
| STRTOG_Inexlo
;
260 if (k1
> 0 && !lostbits
)
261 lostbits
= any_on(b
, k1
);
262 if (!lostbits
&& !exact
)
265 carry
= b
->x
[k1
>>kshift
] & (1 << (k1
& kmask
));
267 *irv
= STRTOG_Denormal
;
270 inex
= STRTOG_Inexhi
| STRTOG_Underflow
;
273 inex
= STRTOG_Inexlo
| STRTOG_Underflow
;
276 else if (e
> fpi
->emax
) {
278 *irv
= STRTOG_Infinite
| STRTOG_Overflow
| STRTOG_Inexhi
;
285 copybits(bits
, nb
, b
);
295 mantbits(d
) double d
;
302 L
= word1(d
) << 16 | word1(d
) >> 16;
305 if ( (L
= word1(d
)) !=0)
307 return P
- lo0bits(&L
);
309 L
= word0(d
) << 16 | word0(d
) >> 16 | Exp_msk11
;
311 L
= word0(d
) | Exp_msk1
;
313 return P
- 32 - lo0bits(&L
);
319 (s00
, se
, fpi
, exp
, bits
)
320 CONST
char *s00
; char **se
; FPI
*fpi
; Long
*exp
; ULong
*bits
;
322 (CONST
char *s00
, char **se
, FPI
*fpi
, Long
*exp
, ULong
*bits
)
325 int abe
, abits
, asub
;
326 int bb0
, bb2
, bb5
, bbe
, bd2
, bd5
, bbbits
, bs2
, c
, decpt
, denorm
;
327 int dsign
, e
, e1
, e2
, emin
, esign
, finished
, i
, inex
, irv
;
328 int j
, k
, nbits
, nd
, nd0
, nf
, nz
, nz0
, rd
, rvbits
, rve
, rve1
, sign
;
329 int sudden_underflow
;
330 CONST
char *s
, *s0
, *s1
;
331 double adj
, adj0
, rv
, tol
;
334 Bigint
*ab
, *bb
, *bb1
, *bd
, *bd0
, *bs
, *delta
, *rvb
, *rvb0
;
337 denorm
= sign
= nz0
= nz
= 0;
341 for(s
= s00
;;s
++) switch(*s
) {
351 irv
= STRTOG_NoNumber
;
370 irv
= gethex(&s
, fpi
, exp
, &rvb
, sign
);
371 if (irv
== STRTOG_NoNumber
) {
383 sudden_underflow
= fpi
->sudden_underflow
;
386 for(decpt
= nd
= nf
= 0; (c
= *s
) >= '0' && c
<= '9'; nd
++, s
++)
393 if (c
== *localeconv()->decimal_point
)
401 for(; c
== '0'; c
= *++s
)
403 if (c
> '0' && c
<= '9') {
411 for(; c
>= '0' && c
<= '9'; c
= *++s
) {
416 for(i
= 1; i
< nz
; i
++)
419 else if (nd
<= DBL_DIG
+ 1)
423 else if (nd
<= DBL_DIG
+ 1)
431 if (c
== 'e' || c
== 'E') {
432 if (!nd
&& !nz
&& !nz0
) {
433 irv
= STRTOG_NoNumber
;
445 if (c
>= '0' && c
<= '9') {
448 if (c
> '0' && c
<= '9') {
451 while((c
= *++s
) >= '0' && c
<= '9')
453 if (s
- s1
> 8 || L
> 19999)
454 /* Avoid confusion from exponents
455 * so large that e might overflow.
457 e
= 19999; /* safe for 16 bit ints */
472 /* Check for Nan and Infinity */
477 if (match(&s
,"nf")) {
479 if (!match(&s
,"inity"))
481 irv
= STRTOG_Infinite
;
487 if (match(&s
, "an")) {
489 *exp
= fpi
->emax
+ 1;
492 irv
= hexnan(&s
, fpi
, bits
);
497 #endif /* INFNAN_CHECK */
498 irv
= STRTOG_NoNumber
;
507 switch(fpi
->rounding
& 3) {
518 /* Now we have nd0 digits, starting at s0, followed by a
519 * decimal point, followed by nd-nd0 digits. The number we're
520 * after is the integer represented by those digits times
525 k
= nd
< DBL_DIG
+ 1 ? nd
: DBL_DIG
+ 1;
528 dval(rv
) = tens
[k
- 9] * dval(rv
) + z
;
530 if (nbits
<= P
&& nd
<= DBL_DIG
) {
532 if (rvOK(dval(rv
), fpi
, exp
, bits
, 1, rd
, &irv
))
540 i
= fivesbits
[e
] + mantbits(dval(rv
)) <= P
;
541 /* rv = */ rounded_product(dval(rv
), tens
[e
]);
542 if (rvOK(dval(rv
), fpi
, exp
, bits
, i
, rd
, &irv
))
549 if (e
<= Ten_pmax
+ i
) {
550 /* A fancier test would sometimes let us do
551 * this for larger i values.
557 /* VAX exponent range is so narrow we must
558 * worry about overflow here...
561 dval(adj
) = dval(rv
);
562 word0(adj
) -= P
*Exp_msk1
;
563 /* adj = */ rounded_product(dval(adj
), tens
[e2
]);
564 if ((word0(adj
) & Exp_mask
)
565 > Exp_msk1
*(DBL_MAX_EXP
+Bias
-1-P
))
567 word0(adj
) += P
*Exp_msk1
;
568 dval(rv
) = dval(adj
);
570 /* rv = */ rounded_product(dval(rv
), tens
[e2
]);
572 if (rvOK(dval(rv
), fpi
, exp
, bits
, 0, rd
, &irv
))
577 #ifndef Inaccurate_Divide
578 else if (e
>= -Ten_pmax
) {
579 /* rv = */ rounded_quotient(dval(rv
), tens
[-e
]);
580 if (rvOK(dval(rv
), fpi
, exp
, bits
, 0, rd
, &irv
))
589 /* Get starting approximation = rv * 10**e1 */
593 if ( (i
= e1
& 15) !=0)
597 while(e1
>= (1 << n_bigtens
-1)) {
598 e2
+= ((word0(rv
) & Exp_mask
)
599 >> Exp_shift1
) - Bias
;
600 word0(rv
) &= ~Exp_mask
;
601 word0(rv
) |= Bias
<< Exp_shift1
;
602 dval(rv
) *= bigtens
[n_bigtens
-1];
603 e1
-= 1 << n_bigtens
-1;
605 e2
+= ((word0(rv
) & Exp_mask
) >> Exp_shift1
) - Bias
;
606 word0(rv
) &= ~Exp_mask
;
607 word0(rv
) |= Bias
<< Exp_shift1
;
608 for(j
= 0; e1
> 0; j
++, e1
>>= 1)
610 dval(rv
) *= bigtens
[j
];
615 if ( (i
= e1
& 15) !=0)
619 while(e1
>= (1 << n_bigtens
-1)) {
620 e2
+= ((word0(rv
) & Exp_mask
)
621 >> Exp_shift1
) - Bias
;
622 word0(rv
) &= ~Exp_mask
;
623 word0(rv
) |= Bias
<< Exp_shift1
;
624 dval(rv
) *= tinytens
[n_bigtens
-1];
625 e1
-= 1 << n_bigtens
-1;
627 e2
+= ((word0(rv
) & Exp_mask
) >> Exp_shift1
) - Bias
;
628 word0(rv
) &= ~Exp_mask
;
629 word0(rv
) |= Bias
<< Exp_shift1
;
630 for(j
= 0; e1
> 0; j
++, e1
>>= 1)
632 dval(rv
) *= tinytens
[j
];
636 /* e2 is a correction to the (base 2) exponent of the return
637 * value, reflecting adjustments above to avoid overflow in the
638 * native arithmetic. For native IBM (base 16) arithmetic, we
639 * must multiply e2 by 4 to change from base 16 to 2.
643 rvb
= d2b(dval(rv
), &rve
, &rvbits
); /* rv = rvb * 2^rve */
645 if ((j
= rvbits
- nbits
) > 0) {
650 bb0
= 0; /* trailing zero bits in rvb */
651 e2
= rve
+ rvbits
- nbits
;
652 if (e2
> fpi
->emax
) {
654 irv
= STRTOG_Infinite
| STRTOG_Overflow
| STRTOG_Inexhi
;
659 *exp
= fpi
->emax
+ 1;
662 rve1
= rve
+ rvbits
- nbits
;
663 if (e2
< (emin
= fpi
->emin
)) {
667 rvb
= lshift(rvb
, j
);
678 irv
= STRTOG_Underflow
| STRTOG_Inexlo
;
681 rvb
->x
[0] = rvb
->wds
= rvbits
= 1;
687 if (sudden_underflow
&& e2
+ 1 < emin
)
691 /* Now the hard part -- adjusting rv to the correct value.*/
693 /* Put digits into bd: true value = bd * 10^e */
695 bd0
= s2b(s0
, nd0
, nd
, y
);
702 bbbits
= rvbits
- bb0
;
719 j
= nbits
+ 1 - bbbits
;
720 i
= bbe
+ bbbits
- nbits
;
721 if (i
< emin
) /* denormal */
725 i
= bb2
< bd2
? bb2
: bd2
;
734 bs
= pow5mult(bs
, bb5
);
741 bb
= lshift(bb
, bb2
);
745 bd
= pow5mult(bd
, bd5
);
747 bd
= lshift(bd
, bd2
);
749 bs
= lshift(bs
, bs2
);
751 inex
= STRTOG_Inexhi
;
752 delta
= diff(bb
, bd
);
753 if (delta
->wds
<= 1 && !delta
->x
[0])
756 delta
->sign
= finished
= 0;
761 if ( (finished
= dsign
^ (rd
&1)) !=0) {
763 irv
|= STRTOG_Inexhi
;
766 irv
|= STRTOG_Inexlo
;
769 for(i
= 0, j
= nbits
; j
>= ULbits
;
771 if (rvb
->x
[i
] & ALL_ON
)
774 if (j
> 1 && lo0bits(rvb
->x
+ i
) < j
- 1)
777 rvb
= set_ones(rvb
, rvbits
= nbits
);
780 irv
|= dsign
? STRTOG_Inexlo
: STRTOG_Inexhi
;
784 /* Error is less than half an ulp -- check for
785 * special case of mantissa a power of two.
788 ? STRTOG_Normal
| STRTOG_Inexlo
789 : STRTOG_Normal
| STRTOG_Inexhi
;
790 if (dsign
|| bbbits
> 1 || denorm
|| rve1
== emin
)
792 delta
= lshift(delta
,1);
793 if (cmp(delta
, bs
) > 0) {
794 irv
= STRTOG_Normal
| STRTOG_Inexlo
;
800 /* exactly half-way between */
802 if (denorm
&& all_on(rvb
, rvbits
)) {
803 /*boundary case -- increment exponent*/
806 rve
= emin
+ nbits
- (rvbits
= 1);
807 irv
= STRTOG_Normal
| STRTOG_Inexhi
;
811 irv
= STRTOG_Normal
| STRTOG_Inexlo
;
813 else if (bbbits
== 1) {
816 /* boundary case -- decrement exponent */
818 irv
= STRTOG_Normal
| STRTOG_Inexhi
;
819 if (rvb
->wds
== 1 && rvb
->x
[0] == 1)
820 sudden_underflow
= 1;
824 rvb
= set_ones(rvb
, rvbits
= nbits
);
828 irv
= STRTOG_Normal
| STRTOG_Inexhi
;
829 if (bbbits
< nbits
&& !denorm
|| !(rvb
->x
[0] & 1))
832 rvb
= increment(rvb
);
833 if ( (j
= rvbits
& kmask
) !=0)
835 if (hi0bits(rvb
->x
[(rvb
->wds
- 1) >> kshift
])
838 irv
= STRTOG_Normal
| STRTOG_Inexhi
;
844 irv
= STRTOG_Normal
| STRTOG_Inexlo
;
848 if ((dval(adj
) = ratio(delta
, bs
)) <= 2.) {
850 inex
= STRTOG_Inexlo
;
853 inex
= STRTOG_Inexhi
;
855 else if (denorm
&& bbbits
<= 1) {
859 irv
= STRTOG_Underflow
| STRTOG_Inexlo
;
862 adj0
= dval(adj
) = 1.;
865 adj0
= dval(adj
) *= 0.5;
868 inex
= STRTOG_Inexlo
;
870 if (dval(adj
) < 2147483647.) {
879 if (asub
&& adj0
> 0.)
883 if (!asub
&& adj0
> 0.) {
886 inex
= STRTOG_Inexact
- inex
;
894 /* adj *= ulp(dval(rv)); */
895 /* if (asub) rv -= adj; else rv += adj; */
897 if (!denorm
&& rvbits
< nbits
) {
898 rvb
= lshift(rvb
, j
= nbits
- rvbits
);
902 ab
= d2b(dval(adj
), &abe
, &abits
);
906 ab
= lshift(ab
, abe
);
910 j
= hi0bits(rvb
->x
[rvb
->wds
-1]);
915 else if (rvb
->wds
<= k
916 || hi0bits( rvb
->x
[k
]) >
917 hi0bits(rvb0
->x
[k
])) {
918 /* unlikely; can only have lost 1 high bit */
924 rvb
= lshift(rvb
, 1);
935 || hi0bits(rvb
->x
[k
]) < hi0bits(rvb0
->x
[k
])) {
937 if (++rvbits
== nbits
)
955 /* Can we stop now? */
956 tol
= dval(adj
) * 5e-16; /* > max rel error */
957 dval(adj
) = adj0
- .5;
958 if (dval(adj
) < -tol
) {
964 else if (dval(adj
) > tol
&& adj0
< 1. - tol
) {
969 bb0
= denorm
? 0 : trailz(rvb
);
975 if (!denorm
&& (j
= nbits
- rvbits
)) {
977 rvb
= lshift(rvb
, j
);
990 if (sudden_underflow
) {
992 irv
= STRTOG_Underflow
| STRTOG_Inexlo
;
995 irv
= (irv
& ~STRTOG_Retmask
) |
996 (rvb
->wds
> 0 ? STRTOG_Denormal
: STRTOG_Zero
);
997 if (irv
& STRTOG_Inexact
)
998 irv
|= STRTOG_Underflow
;
1006 copybits(bits
, nbits
, rvb
);