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 } |