]>
git.saurik.com Git - apple/libc.git/blob - gdtoa/gdtoa-strtodg-fbsd.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 "."). */
32 #include "xlocale_private.h"
40 #define fivesbits __fivesbits_D2A
41 #define all_on __all_on_D2A
42 #define set_ones __set_ones_D2A
43 #define rvOK __rvOK_D2A
44 #define mantbits __mantbits_D2A
46 #ifdef BUILDING_VARIANT
47 extern CONST
int fivesbits
[];
48 int all_on(Bigint
*b
, int n
);
49 Bigint
*set_ones(Bigint
*b
, int n
);
50 int rvOK(double d
, FPI
*fpi
, Long
*exp
, ULong
*bits
, int exact
, int rd
, int *irv
);
51 int mantbits(double d
);
52 #else /* !BUILDING_VARIANT */
54 __private_extern__ CONST
int
55 fivesbits
[] = { 0, 3, 5, 7, 10, 12, 14, 17, 19, 21,
56 24, 26, 28, 31, 33, 35, 38, 40, 42, 45,
65 increment(b
) Bigint
*b
;
80 if (*x
< (ULong
)0xffffffffL
) {
97 if (b
->wds
>= b
->maxwds
) {
110 decrement(b
) Bigint
*b
;
134 borrow
= (y
& 0x10000) >> 16;
136 } while(borrow
&& x
< xe
);
138 return STRTOG_Inexlo
;
141 __private_extern__
int
143 all_on(b
, n
) Bigint
*b
; int n
;
145 all_on(Bigint
*b
, int n
)
151 xe
= x
+ (n
>> kshift
);
153 if ((*x
++ & ALL_ON
) != ALL_ON
)
156 return ((*x
| (ALL_ON
<< n
)) & ALL_ON
) == ALL_ON
;
162 set_ones(b
, n
) Bigint
*b
; int n
;
164 set_ones(Bigint
*b
, int n
)
170 k
= (n
+ ((1 << kshift
) - 1)) >> kshift
;
184 x
[-1] >>= ULbits
- n
;
188 __private_extern__
int
191 (d
, fpi
, exp
, bits
, exact
, rd
, irv
)
192 double d
; FPI
*fpi
; Long
*exp
; ULong
*bits
; int exact
, rd
, *irv
;
194 (double d
, FPI
*fpi
, Long
*exp
, ULong
*bits
, int exact
, int rd
, int *irv
)
198 ULong carry
, inex
, lostbits
;
199 int bdif
, e
, j
, k
, k1
, nb
, rv
;
202 b
= d2b(d
, &e
, &bdif
);
203 bdif
-= nb
= fpi
->nbits
;
212 #ifndef IMPRECISE_INEXACT
229 default: /* round near */
240 if (b
->x
[k
>>kshift
] & ((ULong
)1 << (k
& kmask
)))
244 /* "break" cases: round up 1 bit, then truncate; bdif > 0 */
249 if ( (lostbits
= any_on(b
, bdif
)) !=0)
250 inex
= STRTOG_Inexlo
;
253 inex
= STRTOG_Inexhi
;
255 if ( (j
= nb
& kmask
) !=0)
257 if (hi0bits(b
->x
[b
->wds
- 1]) != j
) {
259 lostbits
= b
->x
[0] & 1;
266 b
= lshift(b
, -bdif
);
270 if (k
> nb
|| fpi
->sudden_underflow
) {
272 *irv
= STRTOG_Underflow
| STRTOG_Inexlo
;
276 if (k1
> 0 && !lostbits
)
277 lostbits
= any_on(b
, k1
);
278 if (!lostbits
&& !exact
)
281 carry
= b
->x
[k1
>>kshift
] & (1 << (k1
& kmask
));
283 *irv
= STRTOG_Denormal
;
286 inex
= STRTOG_Inexhi
| STRTOG_Underflow
;
289 inex
= STRTOG_Inexlo
| STRTOG_Underflow
;
292 else if (e
> fpi
->emax
) {
294 *irv
= STRTOG_Infinite
| STRTOG_Overflow
| STRTOG_Inexhi
;
301 copybits(bits
, nb
, b
);
309 __private_extern__
int
311 mantbits(d
) double d
;
318 L
= word1(d
) << 16 | word1(d
) >> 16;
321 if ( (L
= word1(d
)) !=0)
323 return P
- lo0bits(&L
);
325 L
= word0(d
) << 16 | word0(d
) >> 16 | Exp_msk11
;
327 L
= word0(d
) | Exp_msk1
;
329 return P
- 32 - lo0bits(&L
);
332 #endif /* BUILDING_VARIANT */
337 (s00
, se
, fpi
, exp
, bits
, loc
)
338 CONST
char *s00
; char **se
; FPI
*fpi
; Long
*exp
; ULong
*bits
; locale_t loc
;
340 (CONST
char *s00
, char **se
, FPI
*fpi
, Long
*exp
, ULong
*bits
, locale_t loc
)
343 int abe
, abits
, asub
;
344 int bb0
, bb2
, bb5
, bbe
, bd2
, bd5
, bbbits
, bs2
, c
, decpt
, denorm
;
345 int dsign
, e
, e1
, e2
, emin
, esign
, finished
, i
, inex
, irv
;
346 int j
, k
, nbits
, nd
, nd0
, nf
, nz
, nz0
, rd
, rvbits
, rve
, rve1
, sign
;
347 int sudden_underflow
;
348 CONST
char *s
, *s0
, *s1
;
349 double adj
, adj0
, rv
, tol
;
352 Bigint
*ab
, *bb
, *bb1
, *bd
, *bd0
, *bs
, *delta
, *rvb
, *rvb0
;
355 int decimal_point_len
;
356 #endif /* USE_LOCALE */
359 denorm
= sign
= nz0
= nz
= 0;
363 for(s
= s00
;;s
++) switch(*s
) {
373 irv
= STRTOG_NoNumber
;
392 irv
= gethex(&s
, fpi
, exp
, &rvb
, sign
, loc
);
393 if (irv
== STRTOG_NoNumber
) {
405 sudden_underflow
= fpi
->sudden_underflow
;
408 for(decpt
= nd
= nf
= 0; (c
= *s
) >= '0' && c
<= '9'; nd
++, s
++)
414 NORMALIZE_LOCALE(loc
);
416 decimal_point
= localeconv_l(loc
)->decimal_point
;
417 decimal_point_len
= strlen(decimal_point
);
418 if (strncmp(s
, decimal_point
, decimal_point_len
) == 0)
425 s
+= decimal_point_len
;
431 for(; c
== '0'; c
= *++s
)
433 if (c
> '0' && c
<= '9') {
441 for(; c
>= '0' && c
<= '9'; c
= *++s
) {
446 for(i
= 1; i
< nz
; i
++)
449 else if (nd
<= DBL_DIG
+ 1)
453 else if (nd
<= DBL_DIG
+ 1)
461 if (c
== 'e' || c
== 'E') {
462 if (!nd
&& !nz
&& !nz0
) {
463 irv
= STRTOG_NoNumber
;
475 if (c
>= '0' && c
<= '9') {
478 if (c
> '0' && c
<= '9') {
481 while((c
= *++s
) >= '0' && c
<= '9')
483 if (s
- s1
> 8 || L
> 19999)
484 /* Avoid confusion from exponents
485 * so large that e might overflow.
487 e
= 19999; /* safe for 16 bit ints */
502 /* Check for Nan and Infinity */
507 if (match(&s
,"nf")) {
509 if (!match(&s
,"inity"))
511 irv
= STRTOG_Infinite
;
517 if (match(&s
, "an")) {
519 *exp
= fpi
->emax
+ 1;
522 irv
= hexnan(&s
, fpi
, bits
);
527 #endif /* INFNAN_CHECK */
528 irv
= STRTOG_NoNumber
;
537 switch(fpi
->rounding
& 3) {
548 /* Now we have nd0 digits, starting at s0, followed by a
549 * decimal point, followed by nd-nd0 digits. The number we're
550 * after is the integer represented by those digits times
555 k
= nd
< DBL_DIG
+ 1 ? nd
: DBL_DIG
+ 1;
558 dval(rv
) = tens
[k
- 9] * dval(rv
) + z
;
560 if (nbits
<= P
&& nd
<= DBL_DIG
) {
562 if (rvOK(dval(rv
), fpi
, exp
, bits
, 1, rd
, &irv
))
570 i
= fivesbits
[e
] + mantbits(dval(rv
)) <= P
;
571 /* rv = */ rounded_product(dval(rv
), tens
[e
]);
572 if (rvOK(dval(rv
), fpi
, exp
, bits
, i
, rd
, &irv
))
579 if (e
<= Ten_pmax
+ i
) {
580 /* A fancier test would sometimes let us do
581 * this for larger i values.
587 /* VAX exponent range is so narrow we must
588 * worry about overflow here...
591 dval(adj
) = dval(rv
);
592 word0(adj
) -= P
*Exp_msk1
;
593 /* adj = */ rounded_product(dval(adj
), tens
[e2
]);
594 if ((word0(adj
) & Exp_mask
)
595 > Exp_msk1
*(DBL_MAX_EXP
+Bias
-1-P
))
597 word0(adj
) += P
*Exp_msk1
;
598 dval(rv
) = dval(adj
);
600 /* rv = */ rounded_product(dval(rv
), tens
[e2
]);
602 if (rvOK(dval(rv
), fpi
, exp
, bits
, 0, rd
, &irv
))
607 #ifndef Inaccurate_Divide
608 else if (e
>= -Ten_pmax
) {
609 /* rv = */ rounded_quotient(dval(rv
), tens
[-e
]);
610 if (rvOK(dval(rv
), fpi
, exp
, bits
, 0, rd
, &irv
))
619 /* Get starting approximation = rv * 10**e1 */
623 if ( (i
= e1
& 15) !=0)
627 while(e1
>= (1 << n_bigtens
-1)) {
628 e2
+= ((word0(rv
) & Exp_mask
)
629 >> Exp_shift1
) - Bias
;
630 word0(rv
) &= ~Exp_mask
;
631 word0(rv
) |= Bias
<< Exp_shift1
;
632 dval(rv
) *= bigtens
[n_bigtens
-1];
633 e1
-= 1 << n_bigtens
-1;
635 e2
+= ((word0(rv
) & Exp_mask
) >> Exp_shift1
) - Bias
;
636 word0(rv
) &= ~Exp_mask
;
637 word0(rv
) |= Bias
<< Exp_shift1
;
638 for(j
= 0; e1
> 0; j
++, e1
>>= 1)
640 dval(rv
) *= bigtens
[j
];
645 if ( (i
= e1
& 15) !=0)
649 while(e1
>= (1 << n_bigtens
-1)) {
650 e2
+= ((word0(rv
) & Exp_mask
)
651 >> Exp_shift1
) - Bias
;
652 word0(rv
) &= ~Exp_mask
;
653 word0(rv
) |= Bias
<< Exp_shift1
;
654 dval(rv
) *= tinytens
[n_bigtens
-1];
655 e1
-= 1 << n_bigtens
-1;
657 e2
+= ((word0(rv
) & Exp_mask
) >> Exp_shift1
) - Bias
;
658 word0(rv
) &= ~Exp_mask
;
659 word0(rv
) |= Bias
<< Exp_shift1
;
660 for(j
= 0; e1
> 0; j
++, e1
>>= 1)
662 dval(rv
) *= tinytens
[j
];
666 /* e2 is a correction to the (base 2) exponent of the return
667 * value, reflecting adjustments above to avoid overflow in the
668 * native arithmetic. For native IBM (base 16) arithmetic, we
669 * must multiply e2 by 4 to change from base 16 to 2.
673 rvb
= d2b(dval(rv
), &rve
, &rvbits
); /* rv = rvb * 2^rve */
675 if ((j
= rvbits
- nbits
) > 0) {
680 bb0
= 0; /* trailing zero bits in rvb */
681 e2
= rve
+ rvbits
- nbits
;
682 if (e2
> fpi
->emax
+ 1)
684 rve1
= rve
+ rvbits
- nbits
;
685 if (e2
< (emin
= fpi
->emin
)) {
689 rvb
= lshift(rvb
, j
);
700 irv
= STRTOG_Underflow
| STRTOG_Inexlo
;
706 rvb
->x
[0] = rvb
->wds
= rvbits
= 1;
712 if (sudden_underflow
&& e2
+ 1 < emin
)
716 /* Now the hard part -- adjusting rv to the correct value.*/
718 /* Put digits into bd: true value = bd * 10^e */
721 bd0
= s2b(s0
, nd0
, nd
, y
, decimal_point_len
);
723 bd0
= s2b(s0
, nd0
, nd
, y
, 1);
731 bbbits
= rvbits
- bb0
;
748 j
= nbits
+ 1 - bbbits
;
749 i
= bbe
+ bbbits
- nbits
;
750 if (i
< emin
) /* denormal */
754 i
= bb2
< bd2
? bb2
: bd2
;
763 bs
= pow5mult(bs
, bb5
);
770 bb
= lshift(bb
, bb2
);
774 bd
= pow5mult(bd
, bd5
);
776 bd
= lshift(bd
, bd2
);
778 bs
= lshift(bs
, bs2
);
780 inex
= STRTOG_Inexhi
;
781 delta
= diff(bb
, bd
);
782 if (delta
->wds
<= 1 && !delta
->x
[0])
785 delta
->sign
= finished
= 0;
790 if ( (finished
= dsign
^ (rd
&1)) !=0) {
792 irv
|= STRTOG_Inexhi
;
795 irv
|= STRTOG_Inexlo
;
798 for(i
= 0, j
= nbits
; j
>= ULbits
;
800 if (rvb
->x
[i
] & ALL_ON
)
803 if (j
> 1 && lo0bits(rvb
->x
+ i
) < j
- 1)
806 rvb
= set_ones(rvb
, rvbits
= nbits
);
809 irv
|= dsign
? STRTOG_Inexlo
: STRTOG_Inexhi
;
813 /* Error is less than half an ulp -- check for
814 * special case of mantissa a power of two.
817 ? STRTOG_Normal
| STRTOG_Inexlo
818 : STRTOG_Normal
| STRTOG_Inexhi
;
819 if (dsign
|| bbbits
> 1 || denorm
|| rve1
== emin
)
821 delta
= lshift(delta
,1);
822 if (cmp(delta
, bs
) > 0) {
823 irv
= STRTOG_Normal
| STRTOG_Inexlo
;
829 /* exactly half-way between */
831 if (denorm
&& all_on(rvb
, rvbits
)) {
832 /*boundary case -- increment exponent*/
835 rve
= emin
+ nbits
- (rvbits
= 1);
836 irv
= STRTOG_Normal
| STRTOG_Inexhi
;
840 irv
= STRTOG_Normal
| STRTOG_Inexlo
;
842 else if (bbbits
== 1) {
845 /* boundary case -- decrement exponent */
847 irv
= STRTOG_Normal
| STRTOG_Inexhi
;
848 if (rvb
->wds
== 1 && rvb
->x
[0] == 1)
849 sudden_underflow
= 1;
853 rvb
= set_ones(rvb
, rvbits
= nbits
);
857 irv
= STRTOG_Normal
| STRTOG_Inexhi
;
858 if (bbbits
< nbits
&& !denorm
|| !(rvb
->x
[0] & 1))
861 rvb
= increment(rvb
);
862 if ( (j
= rvbits
& kmask
) !=0)
864 if (hi0bits(rvb
->x
[rvb
->wds
- 1])
867 irv
= STRTOG_Normal
| STRTOG_Inexhi
;
873 irv
= STRTOG_Normal
| STRTOG_Inexlo
;
877 if ((dval(adj
) = ratio(delta
, bs
)) <= 2.) {
879 inex
= STRTOG_Inexlo
;
882 inex
= STRTOG_Inexhi
;
884 else if (denorm
&& bbbits
<= 1) {
888 irv
= STRTOG_Underflow
| STRTOG_Inexlo
;
891 adj0
= dval(adj
) = 1.;
894 adj0
= dval(adj
) *= 0.5;
897 inex
= STRTOG_Inexlo
;
899 if (dval(adj
) < 2147483647.) {
908 if (asub
&& adj0
> 0.)
912 if (!asub
&& adj0
> 0.) {
915 inex
= STRTOG_Inexact
- inex
;
923 /* adj *= ulp(dval(rv)); */
924 /* if (asub) rv -= adj; else rv += adj; */
926 if (!denorm
&& rvbits
< nbits
) {
927 rvb
= lshift(rvb
, j
= nbits
- rvbits
);
931 ab
= d2b(dval(adj
), &abe
, &abits
);
935 ab
= lshift(ab
, abe
);
939 j
= hi0bits(rvb
->x
[rvb
->wds
-1]);
944 else if (rvb
->wds
<= k
945 || hi0bits( rvb
->x
[k
]) >
946 hi0bits(rvb0
->x
[k
])) {
947 /* unlikely; can only have lost 1 high bit */
953 rvb
= lshift(rvb
, 1);
964 || hi0bits(rvb
->x
[k
]) < hi0bits(rvb0
->x
[k
])) {
966 if (++rvbits
== nbits
)
984 /* Can we stop now? */
985 tol
= dval(adj
) * 5e-16; /* > max rel error */
986 dval(adj
) = adj0
- .5;
987 if (dval(adj
) < -tol
) {
993 else if (dval(adj
) > tol
&& adj0
< 1. - tol
) {
998 bb0
= denorm
? 0 : trailz(rvb
);
1004 if (!denorm
&& (j
= nbits
- rvbits
)) {
1006 rvb
= lshift(rvb
, j
);
1017 if (rve
> fpi
->emax
) {
1020 irv
= STRTOG_Infinite
| STRTOG_Overflow
| STRTOG_Inexhi
;
1025 *exp
= fpi
->emax
+ 1;
1029 if (sudden_underflow
) {
1031 irv
= STRTOG_Underflow
| STRTOG_Inexlo
;
1034 irv
= (irv
& ~STRTOG_Retmask
) |
1035 (rvb
->wds
> 0 ? STRTOG_Denormal
: STRTOG_Zero
);
1036 if (irv
& STRTOG_Inexact
)
1037 irv
|= STRTOG_Underflow
;
1045 copybits(bits
, nbits
, rvb
);
1048 #if !defined(NO_ERRNO) && __DARWIN_UNIX03
1049 if (irv
& STRTOG_Underflow
)