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;
336 denorm = sign = nz0 = nz = 0;
340 for(s = s00;;s++) switch(*s) {
350 irv = STRTOG_NoNumber;
369 irv = gethex(&s, fpi, exp, &rvb, sign);
370 if (irv == STRTOG_NoNumber) {
382 sudden_underflow = fpi->sudden_underflow;
385 for(decpt = nd = nf = 0; (c = *s) >= '0' && c <= '9'; nd++, s++)
392 if (c == *localeconv()->decimal_point)
400 for(; c == '0'; c = *++s)
402 if (c > '0' && c <= '9') {
410 for(; c >= '0' && c <= '9'; c = *++s) {
415 for(i = 1; i < nz; i++)
418 else if (nd <= DBL_DIG + 1)
422 else if (nd <= DBL_DIG + 1)
430 if (c == 'e' || c == 'E') {
431 if (!nd && !nz && !nz0) {
432 irv = STRTOG_NoNumber;
444 if (c >= '0' && c <= '9') {
447 if (c > '0' && c <= '9') {
450 while((c = *++s) >= '0' && c <= '9')
452 if (s - s1 > 8 || L > 19999)
453 /* Avoid confusion from exponents
454 * so large that e might overflow.
456 e = 19999; /* safe for 16 bit ints */
471 /* Check for Nan and Infinity */
476 if (match(&s,"nf")) {
478 if (!match(&s,"inity"))
480 irv = STRTOG_Infinite;
486 if (match(&s, "an")) {
488 *exp = fpi->emax + 1;
491 irv = hexnan(&s, fpi, bits);
496 #endif /* INFNAN_CHECK */
497 irv = STRTOG_NoNumber;
506 switch(fpi->rounding & 3) {
517 /* Now we have nd0 digits, starting at s0, followed by a
518 * decimal point, followed by nd-nd0 digits. The number we're
519 * after is the integer represented by those digits times
524 k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1;
527 dval(rv) = tens[k - 9] * dval(rv) + z;
529 if (nbits <= P && nd <= DBL_DIG) {
531 if (rvOK(dval(rv), fpi, exp, bits, 1, rd, &irv))
539 i = fivesbits[e] + mantbits(dval(rv)) <= P;
540 /* rv = */ rounded_product(dval(rv), tens[e]);
541 if (rvOK(dval(rv), fpi, exp, bits, i, rd, &irv))
548 if (e <= Ten_pmax + i) {
549 /* A fancier test would sometimes let us do
550 * this for larger i values.
556 /* VAX exponent range is so narrow we must
557 * worry about overflow here...
560 dval(adj) = dval(rv);
561 word0(adj) -= P*Exp_msk1;
562 /* adj = */ rounded_product(dval(adj), tens[e2]);
563 if ((word0(adj) & Exp_mask)
564 > Exp_msk1*(DBL_MAX_EXP+Bias-1-P))
566 word0(adj) += P*Exp_msk1;
567 dval(rv) = dval(adj);
569 /* rv = */ rounded_product(dval(rv), tens[e2]);
571 if (rvOK(dval(rv), fpi, exp, bits, 0, rd, &irv))
576 #ifndef Inaccurate_Divide
577 else if (e >= -Ten_pmax) {
578 /* rv = */ rounded_quotient(dval(rv), tens[-e]);
579 if (rvOK(dval(rv), fpi, exp, bits, 0, rd, &irv))
588 /* Get starting approximation = rv * 10**e1 */
592 if ( (i = e1 & 15) !=0)
596 while(e1 >= (1 << n_bigtens-1)) {
597 e2 += ((word0(rv) & Exp_mask)
598 >> Exp_shift1) - Bias;
599 word0(rv) &= ~Exp_mask;
600 word0(rv) |= Bias << Exp_shift1;
601 dval(rv) *= bigtens[n_bigtens-1];
602 e1 -= 1 << n_bigtens-1;
604 e2 += ((word0(rv) & Exp_mask) >> Exp_shift1) - Bias;
605 word0(rv) &= ~Exp_mask;
606 word0(rv) |= Bias << Exp_shift1;
607 for(j = 0; e1 > 0; j++, e1 >>= 1)
609 dval(rv) *= bigtens[j];
614 if ( (i = e1 & 15) !=0)
618 while(e1 >= (1 << n_bigtens-1)) {
619 e2 += ((word0(rv) & Exp_mask)
620 >> Exp_shift1) - Bias;
621 word0(rv) &= ~Exp_mask;
622 word0(rv) |= Bias << Exp_shift1;
623 dval(rv) *= tinytens[n_bigtens-1];
624 e1 -= 1 << n_bigtens-1;
626 e2 += ((word0(rv) & Exp_mask) >> Exp_shift1) - Bias;
627 word0(rv) &= ~Exp_mask;
628 word0(rv) |= Bias << Exp_shift1;
629 for(j = 0; e1 > 0; j++, e1 >>= 1)
631 dval(rv) *= tinytens[j];
635 /* e2 is a correction to the (base 2) exponent of the return
636 * value, reflecting adjustments above to avoid overflow in the
637 * native arithmetic. For native IBM (base 16) arithmetic, we
638 * must multiply e2 by 4 to change from base 16 to 2.
642 rvb = d2b(dval(rv), &rve, &rvbits); /* rv = rvb * 2^rve */
644 if ((j = rvbits - nbits) > 0) {
649 bb0 = 0; /* trailing zero bits in rvb */
650 e2 = rve + rvbits - nbits;
651 if (e2 > fpi->emax + 1)
653 rve1 = rve + rvbits - nbits;
654 if (e2 < (emin = fpi->emin)) {
658 rvb = lshift(rvb, j);
669 irv = STRTOG_Underflow | STRTOG_Inexlo;
672 rvb->x[0] = rvb->wds = rvbits = 1;
678 if (sudden_underflow && e2 + 1 < emin)
682 /* Now the hard part -- adjusting rv to the correct value.*/
684 /* Put digits into bd: true value = bd * 10^e */
686 bd0 = s2b(s0, nd0, nd, y);
693 bbbits = rvbits - bb0;
710 j = nbits + 1 - bbbits;
711 i = bbe + bbbits - nbits;
712 if (i < emin) /* denormal */
716 i = bb2 < bd2 ? bb2 : bd2;
725 bs = pow5mult(bs, bb5);
732 bb = lshift(bb, bb2);
736 bd = pow5mult(bd, bd5);
738 bd = lshift(bd, bd2);
740 bs = lshift(bs, bs2);
742 inex = STRTOG_Inexhi;
743 delta = diff(bb, bd);
744 if (delta->wds <= 1 && !delta->x[0])
747 delta->sign = finished = 0;
752 if ( (finished = dsign ^ (rd&1)) !=0) {
754 irv |= STRTOG_Inexhi;
757 irv |= STRTOG_Inexlo;
760 for(i = 0, j = nbits; j >= ULbits;
762 if (rvb->x[i] & ALL_ON)
765 if (j > 1 && lo0bits(rvb->x + i) < j - 1)
768 rvb = set_ones(rvb, rvbits = nbits);
771 irv |= dsign ? STRTOG_Inexlo : STRTOG_Inexhi;
775 /* Error is less than half an ulp -- check for
776 * special case of mantissa a power of two.
779 ? STRTOG_Normal | STRTOG_Inexlo
780 : STRTOG_Normal | STRTOG_Inexhi;
781 if (dsign || bbbits > 1 || denorm || rve1 == emin)
783 delta = lshift(delta,1);
784 if (cmp(delta, bs) > 0) {
785 irv = STRTOG_Normal | STRTOG_Inexlo;
791 /* exactly half-way between */
793 if (denorm && all_on(rvb, rvbits)) {
794 /*boundary case -- increment exponent*/
797 rve = emin + nbits - (rvbits = 1);
798 irv = STRTOG_Normal | STRTOG_Inexhi;
802 irv = STRTOG_Normal | STRTOG_Inexlo;
804 else if (bbbits == 1) {
807 /* boundary case -- decrement exponent */
809 irv = STRTOG_Normal | STRTOG_Inexhi;
810 if (rvb->wds == 1 && rvb->x[0] == 1)
811 sudden_underflow = 1;
815 rvb = set_ones(rvb, rvbits = nbits);
819 irv = STRTOG_Normal | STRTOG_Inexhi;
820 if (bbbits < nbits && !denorm || !(rvb->x[0] & 1))
823 rvb = increment(rvb);
824 j = kmask & (ULbits - (rvbits & kmask));
825 if (hi0bits(rvb->x[rvb->wds - 1]) != j)
827 irv = STRTOG_Normal | STRTOG_Inexhi;
833 irv = STRTOG_Normal | STRTOG_Inexlo;
837 if ((dval(adj) = ratio(delta, bs)) <= 2.) {
839 inex = STRTOG_Inexlo;
842 inex = STRTOG_Inexhi;
844 else if (denorm && bbbits <= 1) {
848 irv = STRTOG_Underflow | STRTOG_Inexlo;
851 adj0 = dval(adj) = 1.;
854 adj0 = dval(adj) *= 0.5;
857 inex = STRTOG_Inexlo;
859 if (dval(adj) < 2147483647.) {
868 if (asub && adj0 > 0.)
872 if (!asub && adj0 > 0.) {
875 inex = STRTOG_Inexact - inex;
883 /* adj *= ulp(dval(rv)); */
884 /* if (asub) rv -= adj; else rv += adj; */
886 if (!denorm && rvbits < nbits) {
887 rvb = lshift(rvb, j = nbits - rvbits);
891 ab = d2b(dval(adj), &abe, &abits);
895 ab = lshift(ab, abe);
899 j = hi0bits(rvb->x[rvb->wds-1]);
904 else if (rvb->wds <= k
905 || hi0bits( rvb->x[k]) >
906 hi0bits(rvb0->x[k])) {
907 /* unlikely; can only have lost 1 high bit */
913 rvb = lshift(rvb, 1);
924 || hi0bits(rvb->x[k]) < hi0bits(rvb0->x[k])) {
926 if (++rvbits == nbits)
944 /* Can we stop now? */
945 tol = dval(adj) * 5e-16; /* > max rel error */
946 dval(adj) = adj0 - .5;
947 if (dval(adj) < -tol) {
953 else if (dval(adj) > tol && adj0 < 1. - tol) {
958 bb0 = denorm ? 0 : trailz(rvb);
964 if (!denorm && (j = nbits - rvbits)) {
966 rvb = lshift(rvb, j);
977 if (rve > fpi->emax) {
978 switch(fpi->rounding & 3) {
989 /* Round to largest representable magnitude */
992 irv = STRTOG_Normal | STRTOG_Inexlo;
995 be = b + (fpi->nbits >> 5) + 1;
998 if ((j = fpi->nbits & 0x1f))
1003 irv = STRTOG_Infinite | STRTOG_Overflow | STRTOG_Inexhi;
1008 *exp = fpi->emax + 1;
1012 if (sudden_underflow) {
1014 irv = STRTOG_Underflow | STRTOG_Inexlo;
1020 irv = (irv & ~STRTOG_Retmask) |
1021 (rvb->wds > 0 ? STRTOG_Denormal : STRTOG_Zero);
1022 if (irv & STRTOG_Inexact) {
1023 irv |= STRTOG_Underflow;
1035 copybits(bits, nbits, rvb);