Deleted Added
full compact
strtodg.c (165744) strtodg.c (182709)
1/****************************************************************
2
3The author of this software is David M. Gay.
4
5Copyright (C) 1998-2001 by Lucent Technologies
6All Rights Reserved
7
8Permission to use, copy, modify, and distribute this software and

--- 75 unchanged lines hidden (view full) ---

84 Bfree(b);
85 b = b1;
86 }
87 b->x[b->wds++] = 1;
88 }
89 return b;
90 }
91
1/****************************************************************
2
3The author of this software is David M. Gay.
4
5Copyright (C) 1998-2001 by Lucent Technologies
6All Rights Reserved
7
8Permission to use, copy, modify, and distribute this software and

--- 75 unchanged lines hidden (view full) ---

84 Bfree(b);
85 b = b1;
86 }
87 b->x[b->wds++] = 1;
88 }
89 return b;
90 }
91
92 int
92 void
93#ifdef KR_headers
94decrement(b) Bigint *b;
95#else
96decrement(Bigint *b)
97#endif
98{
99 ULong *x, *xe;
100#ifdef Pack_16

--- 13 unchanged lines hidden (view full) ---

114 while(x < xe);
115#else
116 do {
117 y = *x - borrow;
118 borrow = (y & 0x10000) >> 16;
119 *x++ = y & 0xffff;
120 } while(borrow && x < xe);
121#endif
93#ifdef KR_headers
94decrement(b) Bigint *b;
95#else
96decrement(Bigint *b)
97#endif
98{
99 ULong *x, *xe;
100#ifdef Pack_16

--- 13 unchanged lines hidden (view full) ---

114 while(x < xe);
115#else
116 do {
117 y = *x - borrow;
118 borrow = (y & 0x10000) >> 16;
119 *x++ = y & 0xffff;
120 } while(borrow && x < xe);
121#endif
122 return STRTOG_Inexlo;
123 }
124
125 static int
126#ifdef KR_headers
127all_on(b, n) Bigint *b; int n;
128#else
129all_on(Bigint *b, int n)
130#endif

--- 70 unchanged lines hidden (view full) ---

201 FPI_Round_near
202#else
203 Flt_Rounds
204#endif
205 ) goto trunc;
206 goto ret;
207 }
208 switch(rd) {
122 }
123
124 static int
125#ifdef KR_headers
126all_on(b, n) Bigint *b; int n;
127#else
128all_on(Bigint *b, int n)
129#endif

--- 70 unchanged lines hidden (view full) ---

200 FPI_Round_near
201#else
202 Flt_Rounds
203#endif
204 ) goto trunc;
205 goto ret;
206 }
207 switch(rd) {
209 case 1:
208 case 1: /* round down (toward -Infinity) */
210 goto trunc;
209 goto trunc;
211 case 2:
210 case 2: /* round up (toward +Infinity) */
212 break;
213 default: /* round near */
214 k = bdif - 1;
215 if (k < 0)
216 goto trunc;
217 if (!k) {
218 if (!exact)
219 goto ret;

--- 105 unchanged lines hidden (view full) ---

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;
332 Long L;
211 break;
212 default: /* round near */
213 k = bdif - 1;
214 if (k < 0)
215 goto trunc;
216 if (!k) {
217 if (!exact)
218 goto ret;

--- 105 unchanged lines hidden (view full) ---

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;
331 Long L;
333 ULong y, z;
332 ULong *b, *be, y, z;
334 Bigint *ab, *bb, *bb1, *bd, *bd0, *bs, *delta, *rvb, *rvb0;
335
336 irv = STRTOG_Zero;
337 denorm = sign = nz0 = nz = 0;
338 dval(rv) = 0.;
339 rvb = 0;
340 nbits = fpi->nbits;
341 for(s = s00;;s++) switch(*s) {

--- 475 unchanged lines hidden (view full) ---

817 break;
818 }
819 else
820 irv = STRTOG_Normal | STRTOG_Inexhi;
821 if (bbbits < nbits && !denorm || !(rvb->x[0] & 1))
822 break;
823 if (dsign) {
824 rvb = increment(rvb);
333 Bigint *ab, *bb, *bb1, *bd, *bd0, *bs, *delta, *rvb, *rvb0;
334
335 irv = STRTOG_Zero;
336 denorm = sign = nz0 = nz = 0;
337 dval(rv) = 0.;
338 rvb = 0;
339 nbits = fpi->nbits;
340 for(s = s00;;s++) switch(*s) {

--- 475 unchanged lines hidden (view full) ---

816 break;
817 }
818 else
819 irv = STRTOG_Normal | STRTOG_Inexhi;
820 if (bbbits < nbits && !denorm || !(rvb->x[0] & 1))
821 break;
822 if (dsign) {
823 rvb = increment(rvb);
825 if ( (j = rvbits & kmask) !=0)
826 j = ULbits - j;
827 if (hi0bits(rvb->x[(rvb->wds - 1) >> kshift])
828 != j)
824 j = kmask & (ULbits - (rvbits & kmask));
825 if (hi0bits(rvb->x[rvb->wds - 1]) != j)
829 rvbits++;
830 irv = STRTOG_Normal | STRTOG_Inexhi;
831 }
832 else {
833 if (bbbits == 1)
834 goto undfl;
835 decrement(rvb);
836 irv = STRTOG_Normal | STRTOG_Inexlo;

--- 136 unchanged lines hidden (view full) ---

973 }
974 *exp = rve;
975 Bfree(bb);
976 Bfree(bd);
977 Bfree(bs);
978 Bfree(bd0);
979 Bfree(delta);
980 if (rve > fpi->emax) {
826 rvbits++;
827 irv = STRTOG_Normal | STRTOG_Inexhi;
828 }
829 else {
830 if (bbbits == 1)
831 goto undfl;
832 decrement(rvb);
833 irv = STRTOG_Normal | STRTOG_Inexlo;

--- 136 unchanged lines hidden (view full) ---

970 }
971 *exp = rve;
972 Bfree(bb);
973 Bfree(bd);
974 Bfree(bs);
975 Bfree(bd0);
976 Bfree(delta);
977 if (rve > fpi->emax) {
978 switch(fpi->rounding & 3) {
979 case FPI_Round_near:
980 goto huge;
981 case FPI_Round_up:
982 if (!sign)
983 goto huge;
984 break;
985 case FPI_Round_down:
986 if (sign)
987 goto huge;
988 }
989 /* Round to largest representable magnitude */
990 Bfree(rvb);
991 rvb = 0;
992 irv = STRTOG_Normal | STRTOG_Inexlo;
993 *exp = fpi->emax;
994 b = bits;
995 be = b + (fpi->nbits >> 5) + 1;
996 while(b < be)
997 *b++ = -1;
998 if ((j = fpi->nbits & 0x1f))
999 *--be >>= (32 - j);
1000 goto ret;
981 huge:
982 rvb->wds = 0;
983 irv = STRTOG_Infinite | STRTOG_Overflow | STRTOG_Inexhi;
984#ifndef NO_ERRNO
985 errno = ERANGE;
986#endif
987 infnanexp:
988 *exp = fpi->emax + 1;
989 }
990 ret:
991 if (denorm) {
992 if (sudden_underflow) {
993 rvb->wds = 0;
994 irv = STRTOG_Underflow | STRTOG_Inexlo;
1001 huge:
1002 rvb->wds = 0;
1003 irv = STRTOG_Infinite | STRTOG_Overflow | STRTOG_Inexhi;
1004#ifndef NO_ERRNO
1005 errno = ERANGE;
1006#endif
1007 infnanexp:
1008 *exp = fpi->emax + 1;
1009 }
1010 ret:
1011 if (denorm) {
1012 if (sudden_underflow) {
1013 rvb->wds = 0;
1014 irv = STRTOG_Underflow | STRTOG_Inexlo;
1015#ifndef NO_ERRNO
1016 errno = ERANGE;
1017#endif
995 }
996 else {
997 irv = (irv & ~STRTOG_Retmask) |
998 (rvb->wds > 0 ? STRTOG_Denormal : STRTOG_Zero);
1018 }
1019 else {
1020 irv = (irv & ~STRTOG_Retmask) |
1021 (rvb->wds > 0 ? STRTOG_Denormal : STRTOG_Zero);
999 if (irv & STRTOG_Inexact)
1022 if (irv & STRTOG_Inexact) {
1000 irv |= STRTOG_Underflow;
1023 irv |= STRTOG_Underflow;
1024#ifndef NO_ERRNO
1025 errno = ERANGE;
1026#endif
1027 }
1001 }
1002 }
1003 if (se)
1004 *se = (char *)s;
1005 if (sign)
1006 irv |= STRTOG_Neg;
1007 if (rvb) {
1008 copybits(bits, nbits, rvb);
1009 Bfree(rvb);
1010 }
1011 return irv;
1012 }
1028 }
1029 }
1030 if (se)
1031 *se = (char *)s;
1032 if (sign)
1033 irv |= STRTOG_Neg;
1034 if (rvb) {
1035 copybits(bits, nbits, rvb);
1036 Bfree(rvb);
1037 }
1038 return irv;
1039 }