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
+ 1)
654 rve1
= rve
+ rvbits
- nbits
;
655 if (e2
< (emin
= fpi
->emin
)) {
659 rvb
= lshift(rvb
, j
);
670 irv
= STRTOG_Underflow
| STRTOG_Inexlo
;
673 rvb
->x
[0] = rvb
->wds
= rvbits
= 1;
679 if (sudden_underflow
&& e2
+ 1 < emin
)
683 /* Now the hard part -- adjusting rv to the correct value.*/
685 /* Put digits into bd: true value = bd * 10^e */
687 bd0
= s2b(s0
, nd0
, nd
, y
);
694 bbbits
= rvbits
- bb0
;
711 j
= nbits
+ 1 - bbbits
;
712 i
= bbe
+ bbbits
- nbits
;
713 if (i
< emin
) /* denormal */
717 i
= bb2
< bd2
? bb2
: bd2
;
726 bs
= pow5mult(bs
, bb5
);
733 bb
= lshift(bb
, bb2
);
737 bd
= pow5mult(bd
, bd5
);
739 bd
= lshift(bd
, bd2
);
741 bs
= lshift(bs
, bs2
);
743 inex
= STRTOG_Inexhi
;
744 delta
= diff(bb
, bd
);
745 if (delta
->wds
<= 1 && !delta
->x
[0])
748 delta
->sign
= finished
= 0;
753 if ( (finished
= dsign
^ (rd
&1)) !=0) {
755 irv
|= STRTOG_Inexhi
;
758 irv
|= STRTOG_Inexlo
;
761 for(i
= 0, j
= nbits
; j
>= ULbits
;
763 if (rvb
->x
[i
] & ALL_ON
)
766 if (j
> 1 && lo0bits(rvb
->x
+ i
) < j
- 1)
769 rvb
= set_ones(rvb
, rvbits
= nbits
);
772 irv
|= dsign
? STRTOG_Inexlo
: STRTOG_Inexhi
;
776 /* Error is less than half an ulp -- check for
777 * special case of mantissa a power of two.
780 ? STRTOG_Normal
| STRTOG_Inexlo
781 : STRTOG_Normal
| STRTOG_Inexhi
;
782 if (dsign
|| bbbits
> 1 || denorm
|| rve1
== emin
)
784 delta
= lshift(delta
,1);
785 if (cmp(delta
, bs
) > 0) {
786 irv
= STRTOG_Normal
| STRTOG_Inexlo
;
792 /* exactly half-way between */
794 if (denorm
&& all_on(rvb
, rvbits
)) {
795 /*boundary case -- increment exponent*/
798 rve
= emin
+ nbits
- (rvbits
= 1);
799 irv
= STRTOG_Normal
| STRTOG_Inexhi
;
803 irv
= STRTOG_Normal
| STRTOG_Inexlo
;
805 else if (bbbits
== 1) {
808 /* boundary case -- decrement exponent */
810 irv
= STRTOG_Normal
| STRTOG_Inexhi
;
811 if (rvb
->wds
== 1 && rvb
->x
[0] == 1)
812 sudden_underflow
= 1;
816 rvb
= set_ones(rvb
, rvbits
= nbits
);
820 irv
= STRTOG_Normal
| STRTOG_Inexhi
;
821 if (((bbbits
< nbits
) && !denorm
) || !(rvb
->x
[0] & 1))
824 rvb
= increment(rvb
);
825 if ( (j
= rvbits
& kmask
) !=0)
827 if (hi0bits(rvb
->x
[(rvb
->wds
- 1) >> kshift
])
830 irv
= STRTOG_Normal
| STRTOG_Inexhi
;
836 irv
= STRTOG_Normal
| STRTOG_Inexlo
;
840 if ((dval(adj
) = ratio(delta
, bs
)) <= 2.) {
842 inex
= STRTOG_Inexlo
;
845 inex
= STRTOG_Inexhi
;
847 else if (denorm
&& bbbits
<= 1) {
851 irv
= STRTOG_Underflow
| STRTOG_Inexlo
;
854 adj0
= dval(adj
) = 1.;
857 adj0
= dval(adj
) *= 0.5;
860 inex
= STRTOG_Inexlo
;
862 if (dval(adj
) < 2147483647.) {
871 if (asub
&& adj0
> 0.)
875 if (!asub
&& adj0
> 0.) {
878 inex
= STRTOG_Inexact
- inex
;
886 /* adj *= ulp(dval(rv)); */
887 /* if (asub) rv -= adj; else rv += adj; */
889 if (!denorm
&& rvbits
< nbits
) {
890 rvb
= lshift(rvb
, j
= nbits
- rvbits
);
894 ab
= d2b(dval(adj
), &abe
, &abits
);
898 ab
= lshift(ab
, abe
);
902 j
= hi0bits(rvb
->x
[rvb
->wds
-1]);
907 else if (rvb
->wds
<= k
908 || hi0bits( rvb
->x
[k
]) >
909 hi0bits(rvb0
->x
[k
])) {
910 /* unlikely; can only have lost 1 high bit */
916 rvb
= lshift(rvb
, 1);
927 || hi0bits(rvb
->x
[k
]) < hi0bits(rvb0
->x
[k
])) {
929 if (++rvbits
== nbits
)
947 /* Can we stop now? */
948 tol
= dval(adj
) * 5e-16; /* > max rel error */
949 dval(adj
) = adj0
- .5;
950 if (dval(adj
) < -tol
) {
956 else if (dval(adj
) > tol
&& adj0
< 1. - tol
) {
961 bb0
= denorm
? 0 : trailz(rvb
);
967 if (!denorm
&& (j
= nbits
- rvbits
)) {
969 rvb
= lshift(rvb
, j
);
980 if (rve
> fpi
->emax
) {
983 irv
= STRTOG_Infinite
| STRTOG_Overflow
| STRTOG_Inexhi
;
988 *exp
= fpi
->emax
+ 1;
992 if (sudden_underflow
) {
994 irv
= STRTOG_Underflow
| STRTOG_Inexlo
;
997 irv
= (irv
& ~STRTOG_Retmask
) |
998 (rvb
->wds
> 0 ? STRTOG_Denormal
: STRTOG_Zero
);
999 if (irv
& STRTOG_Inexact
)
1000 irv
|= STRTOG_Underflow
;
1008 copybits(bits
, nbits
, rvb
);