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
);
126 all_on(b
, n
) Bigint
*b
; int n
;
128 all_on(Bigint
*b
, int n
)
134 xe
= x
+ (n
>> kshift
);
136 if ((*x
++ & ALL_ON
) != ALL_ON
)
139 return ((*x
| (ALL_ON
<< n
)) & ALL_ON
) == ALL_ON
;
145 set_ones(b
, n
) Bigint
*b
; int n
;
147 set_ones(Bigint
*b
, int n
)
153 k
= (n
+ ((1 << kshift
) - 1)) >> kshift
;
167 x
[-1] >>= ULbits
- n
;
174 (d
, fpi
, exp
, bits
, exact
, rd
, irv
)
175 double d
; FPI
*fpi
; Long
*exp
; ULong
*bits
; int exact
, rd
, *irv
;
177 (double d
, FPI
*fpi
, Long
*exp
, ULong
*bits
, int exact
, int rd
, int *irv
)
181 ULong carry
, inex
, lostbits
;
182 int bdif
, e
, j
, k
, k1
, nb
, rv
;
185 b
= d2b(d
, &e
, &bdif
);
186 bdif
-= nb
= fpi
->nbits
;
195 #ifndef IMPRECISE_INEXACT
208 case 1: /* round down (toward -Infinity) */
210 case 2: /* round up (toward +Infinity) */
212 default: /* round near */
223 if (b
->x
[k
>>kshift
] & ((ULong
)1 << (k
& kmask
)))
227 /* "break" cases: round up 1 bit, then truncate; bdif > 0 */
232 if ( (lostbits
= any_on(b
, bdif
)) !=0)
233 inex
= STRTOG_Inexlo
;
236 inex
= STRTOG_Inexhi
;
238 if ( (j
= nb
& kmask
) !=0)
240 if (hi0bits(b
->x
[b
->wds
- 1]) != j
) {
242 lostbits
= b
->x
[0] & 1;
249 b
= lshift(b
, -bdif
);
253 if (k
> nb
|| fpi
->sudden_underflow
) {
255 *irv
= STRTOG_Underflow
| STRTOG_Inexlo
;
259 if (k1
> 0 && !lostbits
)
260 lostbits
= any_on(b
, k1
);
261 if (!lostbits
&& !exact
)
264 carry
= b
->x
[k1
>>kshift
] & (1 << (k1
& kmask
));
266 *irv
= STRTOG_Denormal
;
269 inex
= STRTOG_Inexhi
| STRTOG_Underflow
;
272 inex
= STRTOG_Inexlo
| STRTOG_Underflow
;
275 else if (e
> fpi
->emax
) {
277 *irv
= STRTOG_Infinite
| STRTOG_Overflow
| STRTOG_Inexhi
;
284 copybits(bits
, nb
, b
);
294 mantbits(d
) double d
;
301 L
= word1(d
) << 16 | word1(d
) >> 16;
304 if ( (L
= word1(d
)) !=0)
306 return P
- lo0bits(&L
);
308 L
= word0(d
) << 16 | word0(d
) >> 16 | Exp_msk11
;
310 L
= word0(d
) | Exp_msk1
;
312 return P
- 32 - lo0bits(&L
);
318 (s00
, se
, fpi
, exp
, bits
)
319 CONST
char *s00
; char **se
; FPI
*fpi
; Long
*exp
; ULong
*bits
;
321 (CONST
char *s00
, char **se
, FPI
*fpi
, Long
*exp
, ULong
*bits
)
324 int abe
, abits
, asub
;
325 int bb0
, bb2
, bb5
, bbe
, bd2
, bd5
, bbbits
, bs2
, c
, decpt
, denorm
;
326 int dsign
, e
, e1
, e2
, emin
, esign
, finished
, i
, inex
, irv
;
327 int j
, k
, nbits
, nd
, nd0
, nf
, nz
, nz0
, rd
, rvbits
, rve
, rve1
, sign
;
328 int sudden_underflow
;
329 CONST
char *s
, *s0
, *s1
;
330 double adj
, adj0
, rv
, tol
;
333 Bigint
*ab
, *bb
, *bb1
, *bd
, *bd0
, *bs
, *delta
, *rvb
, *rvb0
;
334 #ifdef USE_LOCALE /*{{*/
335 #ifdef NO_LOCALE_CACHE
336 char *decimalpoint
= localeconv()->decimal_point
;
337 int dplen
= strlen(decimalpoint
);
340 static char *decimalpoint_cache
;
342 if (!(s0
= decimalpoint_cache
)) {
343 s0
= localeconv()->decimal_point
;
344 if ((decimalpoint_cache
= (char*)malloc(strlen(s0
) + 1))) {
345 strcpy(decimalpoint_cache
, s0
);
346 s0
= decimalpoint_cache
;
350 decimalpoint
= (char*)s0
;
351 #endif /*NO_LOCALE_CACHE*/
352 #else /*USE_LOCALE}{*/
354 #endif /*USE_LOCALE}}*/
357 denorm
= sign
= nz0
= nz
= 0;
361 for(s
= s00
;;s
++) switch(*s
) {
371 irv
= STRTOG_NoNumber
;
390 irv
= gethex(&s
, fpi
, exp
, &rvb
, sign
);
391 if (irv
== STRTOG_NoNumber
) {
403 sudden_underflow
= fpi
->sudden_underflow
;
406 for(decpt
= nd
= nf
= 0; (c
= *s
) >= '0' && c
<= '9'; nd
++, s
++)
413 if (c
== *decimalpoint
) {
414 for(i
= 1; decimalpoint
[i
]; ++i
)
415 if (s
[i
] != decimalpoint
[i
])
425 for(; c
== '0'; c
= *++s
)
427 if (c
> '0' && c
<= '9') {
435 for(; c
>= '0' && c
<= '9'; c
= *++s
) {
440 for(i
= 1; i
< nz
; i
++)
443 else if (nd
<= DBL_DIG
+ 1)
447 else if (nd
<= DBL_DIG
+ 1)
455 if (c
== 'e' || c
== 'E') {
456 if (!nd
&& !nz
&& !nz0
) {
457 irv
= STRTOG_NoNumber
;
469 if (c
>= '0' && c
<= '9') {
472 if (c
> '0' && c
<= '9') {
475 while((c
= *++s
) >= '0' && c
<= '9')
477 if (s
- s1
> 8 || L
> 19999)
478 /* Avoid confusion from exponents
479 * so large that e might overflow.
481 e
= 19999; /* safe for 16 bit ints */
496 /* Check for Nan and Infinity */
501 if (match(&s
,"nf")) {
503 if (!match(&s
,"inity"))
505 irv
= STRTOG_Infinite
;
511 if (match(&s
, "an")) {
513 *exp
= fpi
->emax
+ 1;
516 irv
= hexnan(&s
, fpi
, bits
);
521 #endif /* INFNAN_CHECK */
522 irv
= STRTOG_NoNumber
;
531 switch(fpi
->rounding
& 3) {
542 /* Now we have nd0 digits, starting at s0, followed by a
543 * decimal point, followed by nd-nd0 digits. The number we're
544 * after is the integer represented by those digits times
549 k
= nd
< DBL_DIG
+ 1 ? nd
: DBL_DIG
+ 1;
552 dval(rv
) = tens
[k
- 9] * dval(rv
) + z
;
554 if (nbits
<= P
&& nd
<= DBL_DIG
) {
556 if (rvOK(dval(rv
), fpi
, exp
, bits
, 1, rd
, &irv
))
564 i
= fivesbits
[e
] + mantbits(dval(rv
)) <= P
;
565 /* rv = */ rounded_product(dval(rv
), tens
[e
]);
566 if (rvOK(dval(rv
), fpi
, exp
, bits
, i
, rd
, &irv
))
573 if (e
<= Ten_pmax
+ i
) {
574 /* A fancier test would sometimes let us do
575 * this for larger i values.
581 /* VAX exponent range is so narrow we must
582 * worry about overflow here...
585 dval(adj
) = dval(rv
);
586 word0(adj
) -= P
*Exp_msk1
;
587 /* adj = */ rounded_product(dval(adj
), tens
[e2
]);
588 if ((word0(adj
) & Exp_mask
)
589 > Exp_msk1
*(DBL_MAX_EXP
+Bias
-1-P
))
591 word0(adj
) += P
*Exp_msk1
;
592 dval(rv
) = dval(adj
);
594 /* rv = */ rounded_product(dval(rv
), tens
[e2
]);
596 if (rvOK(dval(rv
), fpi
, exp
, bits
, 0, rd
, &irv
))
601 #ifndef Inaccurate_Divide
602 else if (e
>= -Ten_pmax
) {
603 /* rv = */ rounded_quotient(dval(rv
), tens
[-e
]);
604 if (rvOK(dval(rv
), fpi
, exp
, bits
, 0, rd
, &irv
))
613 /* Get starting approximation = rv * 10**e1 */
617 if ( (i
= e1
& 15) !=0)
621 while(e1
>= (1 << n_bigtens
-1)) {
622 e2
+= ((word0(rv
) & Exp_mask
)
623 >> Exp_shift1
) - Bias
;
624 word0(rv
) &= ~Exp_mask
;
625 word0(rv
) |= Bias
<< Exp_shift1
;
626 dval(rv
) *= bigtens
[n_bigtens
-1];
627 e1
-= 1 << n_bigtens
-1;
629 e2
+= ((word0(rv
) & Exp_mask
) >> Exp_shift1
) - Bias
;
630 word0(rv
) &= ~Exp_mask
;
631 word0(rv
) |= Bias
<< Exp_shift1
;
632 for(j
= 0; e1
> 0; j
++, e1
>>= 1)
634 dval(rv
) *= bigtens
[j
];
639 if ( (i
= e1
& 15) !=0)
643 while(e1
>= (1 << n_bigtens
-1)) {
644 e2
+= ((word0(rv
) & Exp_mask
)
645 >> Exp_shift1
) - Bias
;
646 word0(rv
) &= ~Exp_mask
;
647 word0(rv
) |= Bias
<< Exp_shift1
;
648 dval(rv
) *= tinytens
[n_bigtens
-1];
649 e1
-= 1 << n_bigtens
-1;
651 e2
+= ((word0(rv
) & Exp_mask
) >> Exp_shift1
) - Bias
;
652 word0(rv
) &= ~Exp_mask
;
653 word0(rv
) |= Bias
<< Exp_shift1
;
654 for(j
= 0; e1
> 0; j
++, e1
>>= 1)
656 dval(rv
) *= tinytens
[j
];
660 /* e2 is a correction to the (base 2) exponent of the return
661 * value, reflecting adjustments above to avoid overflow in the
662 * native arithmetic. For native IBM (base 16) arithmetic, we
663 * must multiply e2 by 4 to change from base 16 to 2.
667 rvb
= d2b(dval(rv
), &rve
, &rvbits
); /* rv = rvb * 2^rve */
669 if ((j
= rvbits
- nbits
) > 0) {
674 bb0
= 0; /* trailing zero bits in rvb */
675 e2
= rve
+ rvbits
- nbits
;
676 if (e2
> fpi
->emax
+ 1)
678 rve1
= rve
+ rvbits
- nbits
;
679 if (e2
< (emin
= fpi
->emin
)) {
683 rvb
= lshift(rvb
, j
);
694 irv
= STRTOG_Underflow
| STRTOG_Inexlo
;
697 rvb
->x
[0] = rvb
->wds
= rvbits
= 1;
703 if (sudden_underflow
&& e2
+ 1 < emin
)
707 /* Now the hard part -- adjusting rv to the correct value.*/
709 /* Put digits into bd: true value = bd * 10^e */
711 bd0
= s2b(s0
, nd0
, nd
, y
, dplen
);
718 bbbits
= rvbits
- bb0
;
735 j
= nbits
+ 1 - bbbits
;
736 i
= bbe
+ bbbits
- nbits
;
737 if (i
< emin
) /* denormal */
741 i
= bb2
< bd2
? bb2
: bd2
;
750 bs
= pow5mult(bs
, bb5
);
757 bb
= lshift(bb
, bb2
);
761 bd
= pow5mult(bd
, bd5
);
763 bd
= lshift(bd
, bd2
);
765 bs
= lshift(bs
, bs2
);
767 inex
= STRTOG_Inexhi
;
768 delta
= diff(bb
, bd
);
769 if (delta
->wds
<= 1 && !delta
->x
[0])
772 delta
->sign
= finished
= 0;
777 if ( (finished
= dsign
^ (rd
&1)) !=0) {
779 irv
|= STRTOG_Inexhi
;
782 irv
|= STRTOG_Inexlo
;
785 for(i
= 0, j
= nbits
; j
>= ULbits
;
787 if (rvb
->x
[i
] & ALL_ON
)
790 if (j
> 1 && lo0bits(rvb
->x
+ i
) < j
- 1)
793 rvb
= set_ones(rvb
, rvbits
= nbits
);
796 irv
|= dsign
? STRTOG_Inexlo
: STRTOG_Inexhi
;
800 /* Error is less than half an ulp -- check for
801 * special case of mantissa a power of two.
804 ? STRTOG_Normal
| STRTOG_Inexlo
805 : STRTOG_Normal
| STRTOG_Inexhi
;
806 if (dsign
|| bbbits
> 1 || denorm
|| rve1
== emin
)
808 delta
= lshift(delta
,1);
809 if (cmp(delta
, bs
) > 0) {
810 irv
= STRTOG_Normal
| STRTOG_Inexlo
;
816 /* exactly half-way between */
818 if (denorm
&& all_on(rvb
, rvbits
)) {
819 /*boundary case -- increment exponent*/
822 rve
= emin
+ nbits
- (rvbits
= 1);
823 irv
= STRTOG_Normal
| STRTOG_Inexhi
;
827 irv
= STRTOG_Normal
| STRTOG_Inexlo
;
829 else if (bbbits
== 1) {
832 /* boundary case -- decrement exponent */
834 irv
= STRTOG_Normal
| STRTOG_Inexhi
;
835 if (rvb
->wds
== 1 && rvb
->x
[0] == 1)
836 sudden_underflow
= 1;
840 rvb
= set_ones(rvb
, rvbits
= nbits
);
844 irv
= STRTOG_Normal
| STRTOG_Inexhi
;
845 if (bbbits
< nbits
&& !denorm
|| !(rvb
->x
[0] & 1))
848 rvb
= increment(rvb
);
849 j
= kmask
& (ULbits
- (rvbits
& kmask
));
850 if (hi0bits(rvb
->x
[rvb
->wds
- 1]) != j
)
852 irv
= STRTOG_Normal
| STRTOG_Inexhi
;
858 irv
= STRTOG_Normal
| STRTOG_Inexlo
;
862 if ((dval(adj
) = ratio(delta
, bs
)) <= 2.) {
864 inex
= STRTOG_Inexlo
;
867 inex
= STRTOG_Inexhi
;
869 else if (denorm
&& bbbits
<= 1) {
873 irv
= STRTOG_Underflow
| STRTOG_Inexlo
;
876 adj0
= dval(adj
) = 1.;
879 adj0
= dval(adj
) *= 0.5;
882 inex
= STRTOG_Inexlo
;
884 if (dval(adj
) < 2147483647.) {
893 if (asub
&& adj0
> 0.)
897 if (!asub
&& adj0
> 0.) {
900 inex
= STRTOG_Inexact
- inex
;
908 /* adj *= ulp(dval(rv)); */
909 /* if (asub) rv -= adj; else rv += adj; */
911 if (!denorm
&& rvbits
< nbits
) {
912 rvb
= lshift(rvb
, j
= nbits
- rvbits
);
916 ab
= d2b(dval(adj
), &abe
, &abits
);
920 ab
= lshift(ab
, abe
);
924 j
= hi0bits(rvb
->x
[rvb
->wds
-1]);
929 else if (rvb
->wds
<= k
930 || hi0bits( rvb
->x
[k
]) >
931 hi0bits(rvb0
->x
[k
])) {
932 /* unlikely; can only have lost 1 high bit */
938 rvb
= lshift(rvb
, 1);
949 || hi0bits(rvb
->x
[k
]) < hi0bits(rvb0
->x
[k
])) {
951 if (++rvbits
== nbits
)
969 /* Can we stop now? */
970 tol
= dval(adj
) * 5e-16; /* > max rel error */
971 dval(adj
) = adj0
- .5;
972 if (dval(adj
) < -tol
) {
978 else if (dval(adj
) > tol
&& adj0
< 1. - tol
) {
983 bb0
= denorm
? 0 : trailz(rvb
);
989 if (!denorm
&& (j
= nbits
- rvbits
)) {
991 rvb
= lshift(rvb
, j
);
1002 if (rve
> fpi
->emax
) {
1003 switch(fpi
->rounding
& 3) {
1004 case FPI_Round_near
:
1010 case FPI_Round_down
:
1014 /* Round to largest representable magnitude */
1017 irv
= STRTOG_Normal
| STRTOG_Inexlo
;
1020 be
= b
+ ((fpi
->nbits
+ 31) >> 5);
1023 if ((j
= fpi
->nbits
& 0x1f))
1028 irv
= STRTOG_Infinite
| STRTOG_Overflow
| STRTOG_Inexhi
;
1033 *exp
= fpi
->emax
+ 1;
1037 if (sudden_underflow
) {
1039 irv
= STRTOG_Underflow
| STRTOG_Inexlo
;
1045 irv
= (irv
& ~STRTOG_Retmask
) |
1046 (rvb
->wds
> 0 ? STRTOG_Denormal
: STRTOG_Zero
);
1047 if (irv
& STRTOG_Inexact
) {
1048 irv
|= STRTOG_Underflow
;
1060 copybits(bits
, nbits
, rvb
);