Lines 190-200
Link Here
|
190 |
#else |
190 |
#else |
191 |
#ifdef IEEE_8087 |
191 |
#ifdef IEEE_8087 |
192 |
#define word0(x) ((U*)&x)->L[1] |
192 |
#define word0(x) (x)->L[1] |
193 |
#define word1(x) ((U*)&x)->L[0] |
193 |
#define word1(x) (x)->L[0] |
194 |
#else |
194 |
#else |
195 |
#define word0(x) ((U*)&x)->L[0] |
195 |
#define word0(x) (x)->L[0] |
196 |
#define word1(x) ((U*)&x)->L[1] |
196 |
#define word1(x) (x)->L[1] |
197 |
#endif |
197 |
#endif |
198 |
#define dval(x) ((U*)&x)->d |
198 |
#define dval(x) (x)->d |
199 |
#endif |
199 |
#endif |
200 |
|
200 |
|
Lines 773-780
Link Here
|
773 |
} |
773 |
} |
774 |
|
774 |
|
775 |
static double ulp(double x) |
775 |
static double ulp(U *x) |
776 |
{ |
776 |
{ |
777 |
register int32_t L; |
777 |
register int32_t L; |
778 |
double a; |
778 |
U u; |
779 |
|
779 |
|
780 |
L = (word0(x) & Exp_mask) - (P - 1) * Exp_msk1; |
780 |
L = (word0(x) & Exp_mask) - (P - 1) * Exp_msk1; |
Lines 784-789
Link Here
|
784 |
#endif |
784 |
#endif |
785 |
#endif |
785 |
#endif |
786 |
word0(a) = L; |
786 |
word0(&u) = L; |
787 |
word1(a) = 0; |
787 |
word1(&u) = 0; |
788 |
#ifndef Avoid_Underflow |
788 |
#ifndef Avoid_Underflow |
789 |
#ifndef Sudden_Underflow |
789 |
#ifndef Sudden_Underflow |
Lines 791-805
Link Here
|
791 |
L = -L >> Exp_shift; |
791 |
L = -L >> Exp_shift; |
792 |
if (L < Exp_shift) { |
792 |
if (L < Exp_shift) { |
793 |
word0(a) = 0x80000 >> L; |
793 |
word0(&u) = 0x80000 >> L; |
794 |
word1(a) = 0; |
794 |
word1(&u) = 0; |
795 |
} else { |
795 |
} else { |
796 |
word0(a) = 0; |
796 |
word0(&u) = 0; |
797 |
L -= Exp_shift; |
797 |
L -= Exp_shift; |
798 |
word1(a) = L >= 31 ? 1 : 1 << 31 - L; |
798 |
word1(&u) = L >= 31 ? 1 : 1 << 31 - L; |
799 |
} |
799 |
} |
800 |
} |
800 |
} |
801 |
#endif |
801 |
#endif |
802 |
#endif |
802 |
#endif |
803 |
return dval(a); |
803 |
return dval(&u); |
804 |
} |
804 |
} |
805 |
|
805 |
|
Lines 812-819
Link Here
|
812 |
uint32_t z; |
812 |
uint32_t z; |
813 |
int k; |
813 |
int k; |
814 |
double d; |
814 |
U d; |
815 |
|
815 |
|
816 |
#define d0 word0(d) |
816 |
#define d0 word0(&d) |
817 |
#define d1 word1(d) |
817 |
#define d1 word1(&d) |
818 |
|
818 |
|
819 |
xa0 = a->x; |
819 |
xa0 = a->x; |
Lines 858-865
Link Here
|
858 |
#undef d0 |
858 |
#undef d0 |
859 |
#undef d1 |
859 |
#undef d1 |
860 |
return dval(d); |
860 |
return dval(&d); |
861 |
} |
861 |
} |
862 |
|
862 |
|
863 |
static Bigint* d2b(double d, int* e, int* bits) |
863 |
static Bigint* d2b(U* d, int* e, int* bits) |
864 |
{ |
864 |
{ |
865 |
Bigint* b; |
865 |
Bigint* b; |
Lines 966-974
Link Here
|
966 |
static double ratio(Bigint* a, Bigint* b) |
966 |
static double ratio(Bigint* a, Bigint* b) |
967 |
{ |
967 |
{ |
968 |
double da, db; |
968 |
U da, db; |
969 |
int k, ka, kb; |
969 |
int k, ka, kb; |
970 |
|
970 |
|
971 |
dval(da) = b2d(a, &ka); |
971 |
dval(&da) = b2d(a, &ka); |
972 |
dval(db) = b2d(b, &kb); |
972 |
dval(&db) = b2d(b, &kb); |
973 |
#ifdef Pack_32 |
973 |
#ifdef Pack_32 |
974 |
k = ka - kb + 32 * (a->wds - b->wds); |
974 |
k = ka - kb + 32 * (a->wds - b->wds); |
Lines 977-986
Link Here
|
977 |
#endif |
977 |
#endif |
978 |
if (k > 0) |
978 |
if (k > 0) |
979 |
word0(da) += k * Exp_msk1; |
979 |
word0(&da) += k * Exp_msk1; |
980 |
else { |
980 |
else { |
981 |
k = -k; |
981 |
k = -k; |
982 |
word0(db) += k * Exp_msk1; |
982 |
word0(&db) += k * Exp_msk1; |
983 |
} |
983 |
} |
984 |
return dval(da) / dval(db); |
984 |
return dval(&da) / dval(&db); |
985 |
} |
985 |
} |
986 |
|
986 |
|
Lines 1032-1036
Link Here
|
1032 |
|
1032 |
|
1033 |
#ifndef No_Hex_NaN |
1033 |
#ifndef No_Hex_NaN |
1034 |
static void hexnan(double* rvp, const char** sp) |
1034 |
static void hexnan(U* rvp, const char** sp) |
1035 |
{ |
1035 |
{ |
1036 |
uint32_t c, x[2]; |
1036 |
uint32_t c, x[2]; |
Lines 1071-1076
Link Here
|
1071 |
} |
1071 |
} |
1072 |
if ((x[0] &= 0xfffff) || x[1]) { |
1072 |
if ((x[0] &= 0xfffff) || x[1]) { |
1073 |
word0(*rvp) = Exp_mask | x[0]; |
1073 |
word0(rvp) = Exp_mask | x[0]; |
1074 |
word1(*rvp) = x[1]; |
1074 |
word1(rvp) = x[1]; |
1075 |
} |
1075 |
} |
1076 |
} |
1076 |
} |
Lines 1086-1090
Link Here
|
1086 |
e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign; |
1086 |
e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign; |
1087 |
const char *s, *s0, *s1; |
1087 |
const char *s, *s0, *s1; |
1088 |
double aadj, aadj1, adj, rv, rv0; |
1088 |
double aadj, aadj1; |
|
|
1089 |
U aadj2, adj, rv, rv0; |
1089 |
int32_t L; |
1090 |
int32_t L; |
1090 |
uint32_t y, z; |
1091 |
uint32_t y, z; |
Lines 1095-1099
Link Here
|
1095 |
|
1096 |
|
1096 |
sign = nz0 = nz = 0; |
1097 |
sign = nz0 = nz = 0; |
1097 |
dval(rv) = 0.; |
1098 |
dval(&rv) = 0; |
1098 |
for (s = s00; ; s++) |
1099 |
for (s = s00; ; s++) |
1099 |
switch (*s) { |
1100 |
switch (*s) { |
Lines 1210-1215
Link Here
|
1210 |
if (!match(&s,"inity")) |
1211 |
if (!match(&s,"inity")) |
1211 |
++s; |
1212 |
++s; |
1212 |
word0(rv) = 0x7ff00000; |
1213 |
word0(&rv) = 0x7ff00000; |
1213 |
word1(rv) = 0; |
1214 |
word1(&rv) = 0; |
1214 |
goto ret; |
1215 |
goto ret; |
1215 |
} |
1216 |
} |
Lines 1218-1223
Link Here
|
1218 |
case 'N': |
1219 |
case 'N': |
1219 |
if (match(&s, "an")) { |
1220 |
if (match(&s, "an")) { |
1220 |
word0(rv) = NAN_WORD0; |
1221 |
word0(&rv) = NAN_WORD0; |
1221 |
word1(rv) = NAN_WORD1; |
1222 |
word1(&rv) = NAN_WORD1; |
1222 |
#ifndef No_Hex_NaN |
1223 |
#ifndef No_Hex_NaN |
1223 |
if (*s == '(') /*)*/ |
1224 |
if (*s == '(') /*)*/ |
Lines 1244-1248
Link Here
|
1244 |
nd0 = nd; |
1245 |
nd0 = nd; |
1245 |
k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1; |
1246 |
k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1; |
1246 |
dval(rv) = y; |
1247 |
dval(&rv) = y; |
1247 |
if (k > 9) { |
1248 |
if (k > 9) { |
1248 |
#ifdef SET_INEXACT |
1249 |
#ifdef SET_INEXACT |
Lines 1250-1254
Link Here
|
1250 |
oldinexact = get_inexact(); |
1251 |
oldinexact = get_inexact(); |
1251 |
#endif |
1252 |
#endif |
1252 |
dval(rv) = tens[k - 9] * dval(rv) + z; |
1253 |
dval(&rv) = tens[k - 9] * dval(&rv) + z; |
1253 |
} |
1254 |
} |
1254 |
bd0 = 0; |
1255 |
bd0 = 0; |
Lines 1258-1262
Link Here
|
1258 |
if (e > 0) { |
1259 |
if (e > 0) { |
1259 |
if (e <= Ten_pmax) { |
1260 |
if (e <= Ten_pmax) { |
1260 |
/* rv = */ rounded_product(dval(rv), tens[e]); |
1261 |
/* rv = */ rounded_product(dval(&rv), tens[e]); |
1261 |
goto ret; |
1262 |
goto ret; |
1262 |
} |
1263 |
} |
Lines 1267-1272
Link Here
|
1267 |
*/ |
1268 |
*/ |
1268 |
e -= i; |
1269 |
e -= i; |
1269 |
dval(rv) *= tens[i]; |
1270 |
dval(&rv) *= tens[i]; |
1270 |
/* rv = */ rounded_product(dval(rv), tens[e]); |
1271 |
/* rv = */ rounded_product(dval(&rv), tens[e]); |
1271 |
goto ret; |
1272 |
goto ret; |
1272 |
} |
1273 |
} |
Lines 1274-1278
Link Here
|
1274 |
#ifndef Inaccurate_Divide |
1275 |
#ifndef Inaccurate_Divide |
1275 |
else if (e >= -Ten_pmax) { |
1276 |
else if (e >= -Ten_pmax) { |
1276 |
/* rv = */ rounded_quotient(dval(rv), tens[-e]); |
1277 |
/* rv = */ rounded_quotient(dval(&rv), tens[-e]); |
1277 |
goto ret; |
1278 |
goto ret; |
1278 |
} |
1279 |
} |
Lines 1294-1298
Link Here
|
1294 |
if (e1 > 0) { |
1295 |
if (e1 > 0) { |
1295 |
if ((i = e1 & 15)) |
1296 |
if ((i = e1 & 15)) |
1296 |
dval(rv) *= tens[i]; |
1297 |
dval(&rv) *= tens[i]; |
1297 |
if (e1 &= ~15) { |
1298 |
if (e1 &= ~15) { |
1298 |
if (e1 > DBL_MAX_10_EXP) { |
1299 |
if (e1 > DBL_MAX_10_EXP) { |
Lines 1302-1311
Link Here
|
1302 |
#endif |
1303 |
#endif |
1303 |
/* Can't trust HUGE_VAL */ |
1304 |
/* Can't trust HUGE_VAL */ |
1304 |
word0(rv) = Exp_mask; |
1305 |
word0(&rv) = Exp_mask; |
1305 |
word1(rv) = 0; |
1306 |
word1(&rv) = 0; |
1306 |
#ifdef SET_INEXACT |
1307 |
#ifdef SET_INEXACT |
1307 |
/* set overflow bit */ |
1308 |
/* set overflow bit */ |
1308 |
dval(rv0) = 1e300; |
1309 |
dval(&rv0) = 1e300; |
1309 |
dval(rv0) *= dval(rv0); |
1310 |
dval(&rv0) *= dval(&rv0); |
1310 |
#endif |
1311 |
#endif |
1311 |
if (bd0) |
1312 |
if (bd0) |
Lines 1316-1337
Link Here
|
1316 |
for (j = 0; e1 > 1; j++, e1 >>= 1) |
1317 |
for (j = 0; e1 > 1; j++, e1 >>= 1) |
1317 |
if (e1 & 1) |
1318 |
if (e1 & 1) |
1318 |
dval(rv) *= bigtens[j]; |
1319 |
dval(&rv) *= bigtens[j]; |
1319 |
/* The last multiplication could overflow. */ |
1320 |
/* The last multiplication could overflow. */ |
1320 |
word0(rv) -= P * Exp_msk1; |
1321 |
word0(&rv) -= P * Exp_msk1; |
1321 |
dval(rv) *= bigtens[j]; |
1322 |
dval(&rv) *= bigtens[j]; |
1322 |
if ((z = word0(rv) & Exp_mask) > Exp_msk1 * (DBL_MAX_EXP + Bias - P)) |
1323 |
if ((z = word0(&rv) & Exp_mask) > Exp_msk1 * (DBL_MAX_EXP + Bias - P)) |
1323 |
goto ovfl; |
1324 |
goto ovfl; |
1324 |
if (z > Exp_msk1 * (DBL_MAX_EXP + Bias - 1 - P)) { |
1325 |
if (z > Exp_msk1 * (DBL_MAX_EXP + Bias - 1 - P)) { |
1325 |
/* set to largest number */ |
1326 |
/* set to largest number */ |
1326 |
/* (Can't trust DBL_MAX) */ |
1327 |
/* (Can't trust DBL_MAX) */ |
1327 |
word0(rv) = Big0; |
1328 |
word0(&rv) = Big0; |
1328 |
word1(rv) = Big1; |
1329 |
word1(&rv) = Big1; |
1329 |
} else |
1330 |
} else |
1330 |
word0(rv) += P * Exp_msk1; |
1331 |
word0(&rv) += P * Exp_msk1; |
1331 |
} |
1332 |
} |
1332 |
} else if (e1 < 0) { |
1333 |
} else if (e1 < 0) { |
1333 |
e1 = -e1; |
1334 |
e1 = -e1; |
1334 |
if ((i = e1 & 15)) |
1335 |
if ((i = e1 & 15)) |
1335 |
dval(rv) /= tens[i]; |
1336 |
dval(&rv) /= tens[i]; |
1336 |
if (e1 >>= 4) { |
1337 |
if (e1 >>= 4) { |
1337 |
if (e1 >= 1 << n_bigtens) |
1338 |
if (e1 >= 1 << n_bigtens) |
Lines 1342-1371
Link Here
|
1342 |
for (j = 0; e1 > 0; j++, e1 >>= 1) |
1343 |
for (j = 0; e1 > 0; j++, e1 >>= 1) |
1343 |
if (e1 & 1) |
1344 |
if (e1 & 1) |
1344 |
dval(rv) *= tinytens[j]; |
1345 |
dval(&rv) *= tinytens[j]; |
1345 |
if (scale && (j = (2 * P) + 1 - ((word0(rv) & Exp_mask) >> Exp_shift)) > 0) { |
1346 |
if (scale && (j = (2 * P) + 1 - ((word0(&rv) & Exp_mask) >> Exp_shift)) > 0) { |
1346 |
/* scaled rv is denormal; zap j low bits */ |
1347 |
/* scaled rv is denormal; zap j low bits */ |
1347 |
if (j >= 32) { |
1348 |
if (j >= 32) { |
1348 |
word1(rv) = 0; |
1349 |
word1(&rv) = 0; |
1349 |
if (j >= 53) |
1350 |
if (j >= 53) |
1350 |
word0(rv) = (P + 2) * Exp_msk1; |
1351 |
word0(&rv) = (P + 2) * Exp_msk1; |
1351 |
else |
1352 |
else |
1352 |
word0(rv) &= 0xffffffff << (j - 32); |
1353 |
word0(&rv) &= 0xffffffff << (j - 32); |
1353 |
} else |
1354 |
} else |
1354 |
word1(rv) &= 0xffffffff << j; |
1355 |
word1(&rv) &= 0xffffffff << j; |
1355 |
} |
1356 |
} |
1356 |
#else |
1357 |
#else |
1357 |
for (j = 0; e1 > 1; j++, e1 >>= 1) |
1358 |
for (j = 0; e1 > 1; j++, e1 >>= 1) |
1358 |
if (e1 & 1) |
1359 |
if (e1 & 1) |
1359 |
dval(rv) *= tinytens[j]; |
1360 |
dval(&rv) *= tinytens[j]; |
1360 |
/* The last multiplication could underflow. */ |
1361 |
/* The last multiplication could underflow. */ |
1361 |
dval(rv0) = dval(rv); |
1362 |
dval(&rv0) = dval(&rv); |
1362 |
dval(rv) *= tinytens[j]; |
1363 |
dval(&rv) *= tinytens[j]; |
1363 |
if (!dval(rv)) { |
1364 |
if (!dval(&rv)) { |
1364 |
dval(rv) = 2. * dval(rv0); |
1365 |
dval(&rv) = 2. * dval(&rv0); |
1365 |
dval(rv) *= tinytens[j]; |
1366 |
dval(&rv) *= tinytens[j]; |
1366 |
#endif |
1367 |
#endif |
1367 |
if (!dval(rv)) { |
1368 |
if (!dval(&rv)) { |
1368 |
undfl: |
1369 |
undfl: |
1369 |
dval(rv) = 0.; |
1370 |
dval(&rv) = 0.; |
1370 |
#ifndef NO_ERRNO |
1371 |
#ifndef NO_ERRNO |
1371 |
errno = ERANGE; |
1372 |
errno = ERANGE; |
Lines 1376-1381
Link Here
|
1376 |
} |
1377 |
} |
1377 |
#ifndef Avoid_Underflow |
1378 |
#ifndef Avoid_Underflow |
1378 |
word0(rv) = Tiny0; |
1379 |
word0(&rv) = Tiny0; |
1379 |
word1(rv) = Tiny1; |
1380 |
word1(&rv) = Tiny1; |
1380 |
/* The refinement below will clean |
1381 |
/* The refinement below will clean |
1381 |
* this approximation up. |
1382 |
* this approximation up. |
Lines 1395-1399
Link Here
|
1395 |
bd = Balloc(bd0->k); |
1396 |
bd = Balloc(bd0->k); |
1396 |
Bcopy(bd, bd0); |
1397 |
Bcopy(bd, bd0); |
1397 |
bb = d2b(dval(rv), &bbe, &bbbits); /* rv = bb * 2^bbe */ |
1398 |
bb = d2b(&rv, &bbe, &bbbits); /* rv = bb * 2^bbe */ |
1398 |
bs = i2b(1); |
1399 |
bs = i2b(1); |
1399 |
|
1400 |
|
Lines 1465-1473
Link Here
|
1465 |
* special case of mantissa a power of two. |
1466 |
* special case of mantissa a power of two. |
1466 |
*/ |
1467 |
*/ |
1467 |
if (dsign || word1(rv) || word0(rv) & Bndry_mask |
1468 |
if (dsign || word1(&rv) || word0(&rv) & Bndry_mask |
1468 |
#ifdef Avoid_Underflow |
1469 |
#ifdef Avoid_Underflow |
1469 |
|| (word0(rv) & Exp_mask) <= (2 * P + 1) * Exp_msk1 |
1470 |
|| (word0(&rv) & Exp_mask) <= (2 * P + 1) * Exp_msk1 |
1470 |
#else |
1471 |
#else |
1471 |
|| (word0(rv) & Exp_mask) <= Exp_msk1 |
1472 |
|| (word0(&rv) & Exp_mask) <= Exp_msk1 |
1472 |
#endif |
1473 |
#endif |
1473 |
) { |
1474 |
) { |
Lines 1493-1506
Link Here
|
1493 |
/* exactly half-way between */ |
1494 |
/* exactly half-way between */ |
1494 |
if (dsign) { |
1495 |
if (dsign) { |
1495 |
if ((word0(rv) & Bndry_mask1) == Bndry_mask1 |
1496 |
if ((word0(&rv) & Bndry_mask1) == Bndry_mask1 |
1496 |
&& word1(rv) == ( |
1497 |
&& word1(&rv) == ( |
1497 |
#ifdef Avoid_Underflow |
1498 |
#ifdef Avoid_Underflow |
1498 |
(scale && (y = word0(rv) & Exp_mask) <= 2 * P * Exp_msk1) |
1499 |
(scale && (y = word0(&rv) & Exp_mask) <= 2 * P * Exp_msk1) |
1499 |
? (0xffffffff & (0xffffffff << (2 * P + 1 - (y >> Exp_shift)))) : |
1500 |
? (0xffffffff & (0xffffffff << (2 * P + 1 - (y >> Exp_shift)))) : |
1500 |
#endif |
1501 |
#endif |
1501 |
0xffffffff)) { |
1502 |
0xffffffff)) { |
1502 |
/*boundary case -- increment exponent*/ |
1503 |
/*boundary case -- increment exponent*/ |
1503 |
word0(rv) = (word0(rv) & Exp_mask) + Exp_msk1; |
1504 |
word0(&rv) = (word0(&rv) & Exp_mask) + Exp_msk1; |
1504 |
word1(rv) = 0; |
1505 |
word1(&rv) = 0; |
1505 |
#ifdef Avoid_Underflow |
1506 |
#ifdef Avoid_Underflow |
1506 |
dsign = 0; |
1507 |
dsign = 0; |
Lines 1508-1516
Link Here
|
1508 |
break; |
1509 |
break; |
1509 |
} |
1510 |
} |
1510 |
} else if (!(word0(rv) & Bndry_mask) && !word1(rv)) { |
1511 |
} else if (!(word0(&rv) & Bndry_mask) && !word1(&rv)) { |
1511 |
drop_down: |
1512 |
drop_down: |
1512 |
/* boundary case -- decrement exponent */ |
1513 |
/* boundary case -- decrement exponent */ |
1513 |
#ifdef Sudden_Underflow /*{{*/ |
1514 |
#ifdef Sudden_Underflow /*{{*/ |
1514 |
L = word0(rv) & Exp_mask; |
1515 |
L = word0(&rv) & Exp_mask; |
1515 |
#ifdef Avoid_Underflow |
1516 |
#ifdef Avoid_Underflow |
1516 |
if (L <= (scale ? (2 * P + 1) * Exp_msk1 : Exp_msk1)) |
1517 |
if (L <= (scale ? (2 * P + 1) * Exp_msk1 : Exp_msk1)) |
Lines 1523-1527
Link Here
|
1523 |
#ifdef Avoid_Underflow |
1524 |
#ifdef Avoid_Underflow |
1524 |
if (scale) { |
1525 |
if (scale) { |
1525 |
L = word0(rv) & Exp_mask; |
1526 |
L = word0(&rv) & Exp_mask; |
1526 |
if (L <= (2 * P + 1) * Exp_msk1) { |
1527 |
if (L <= (2 * P + 1) * Exp_msk1) { |
1527 |
if (L > (P + 2) * Exp_msk1) |
1528 |
if (L > (P + 2) * Exp_msk1) |
Lines 1534-1551
Link Here
|
1534 |
} |
1535 |
} |
1535 |
#endif /*Avoid_Underflow*/ |
1536 |
#endif /*Avoid_Underflow*/ |
1536 |
L = (word0(rv) & Exp_mask) - Exp_msk1; |
1537 |
L = (word0(&rv) & Exp_mask) - Exp_msk1; |
1537 |
#endif /*Sudden_Underflow}}*/ |
1538 |
#endif /*Sudden_Underflow}}*/ |
1538 |
word0(rv) = L | Bndry_mask1; |
1539 |
word0(&rv) = L | Bndry_mask1; |
1539 |
word1(rv) = 0xffffffff; |
1540 |
word1(&rv) = 0xffffffff; |
1540 |
break; |
1541 |
break; |
1541 |
} |
1542 |
} |
1542 |
if (!(word1(rv) & LSB)) |
1543 |
if (!(word1(&rv) & LSB)) |
1543 |
break; |
1544 |
break; |
1544 |
if (dsign) |
1545 |
if (dsign) |
1545 |
dval(rv) += ulp(dval(rv)); |
1546 |
dval(&rv) += ulp(&rv); |
1546 |
else { |
1547 |
else { |
1547 |
dval(rv) -= ulp(dval(rv)); |
1548 |
dval(&rv) -= ulp(&rv); |
1548 |
#ifndef Sudden_Underflow |
1549 |
#ifndef Sudden_Underflow |
1549 |
if (!dval(rv)) |
1550 |
if (!dval(&rv)) |
1550 |
goto undfl; |
1551 |
goto undfl; |
1551 |
#endif |
1552 |
#endif |
Lines 1559-1565
Link Here
|
1559 |
if (dsign) |
1560 |
if (dsign) |
1560 |
aadj = aadj1 = 1.; |
1561 |
aadj = aadj1 = 1.; |
1561 |
else if (word1(rv) || word0(rv) & Bndry_mask) { |
1562 |
else if (word1(&rv) || word0(&rv) & Bndry_mask) { |
1562 |
#ifndef Sudden_Underflow |
1563 |
#ifndef Sudden_Underflow |
1563 |
if (word1(rv) == Tiny1 && !word0(rv)) |
1564 |
if (word1(&rv) == Tiny1 && !word0(&rv)) |
1564 |
goto undfl; |
1565 |
goto undfl; |
1565 |
#endif |
1566 |
#endif |
Lines 1593-1613
Link Here
|
1593 |
#endif /*Check_FLT_ROUNDS*/ |
1594 |
#endif /*Check_FLT_ROUNDS*/ |
1594 |
} |
1595 |
} |
1595 |
y = word0(rv) & Exp_mask; |
1596 |
y = word0(&rv) & Exp_mask; |
1596 |
|
1597 |
|
1597 |
/* Check for overflow */ |
1598 |
/* Check for overflow */ |
1598 |
|
1599 |
|
1599 |
if (y == Exp_msk1 * (DBL_MAX_EXP + Bias - 1)) { |
1600 |
if (y == Exp_msk1 * (DBL_MAX_EXP + Bias - 1)) { |
1600 |
dval(rv0) = dval(rv); |
1601 |
dval(&rv0) = dval(&rv); |
1601 |
word0(rv) -= P * Exp_msk1; |
1602 |
word0(&rv) -= P * Exp_msk1; |
1602 |
adj = aadj1 * ulp(dval(rv)); |
1603 |
adj.d = aadj1 * ulp(&rv); |
1603 |
dval(rv) += adj; |
1604 |
dval(&rv) += adj.d; |
1604 |
if ((word0(rv) & Exp_mask) >= Exp_msk1 * (DBL_MAX_EXP + Bias - P)) { |
1605 |
if ((word0(&rv) & Exp_mask) >= Exp_msk1 * (DBL_MAX_EXP + Bias - P)) { |
1605 |
if (word0(rv0) == Big0 && word1(rv0) == Big1) |
1606 |
if (word0(&rv0) == Big0 && word1(&rv0) == Big1) |
1606 |
goto ovfl; |
1607 |
goto ovfl; |
1607 |
word0(rv) = Big0; |
1608 |
word0(&rv) = Big0; |
1608 |
word1(rv) = Big1; |
1609 |
word1(&rv) = Big1; |
1609 |
goto cont; |
1610 |
goto cont; |
1610 |
} else |
1611 |
} else |
1611 |
word0(rv) += P * Exp_msk1; |
1612 |
word0(&rv) += P * Exp_msk1; |
1612 |
} else { |
1613 |
} else { |
1613 |
#ifdef Avoid_Underflow |
1614 |
#ifdef Avoid_Underflow |
Lines 1619-1646
Link Here
|
1619 |
aadj1 = dsign ? aadj : -aadj; |
1620 |
aadj1 = dsign ? aadj : -aadj; |
1620 |
} |
1621 |
} |
1621 |
word0(aadj1) += (2 * P + 1) * Exp_msk1 - y; |
1622 |
dval(&aadj2) = aadj1; |
1622 |
} |
1623 |
word0(&aadj2) += (2 * P + 1) * Exp_msk1 - y; |
1623 |
adj = aadj1 * ulp(dval(rv)); |
1624 |
aadj1 = dval(&aadj2); |
1624 |
dval(rv) += adj; |
1625 |
} |
|
|
1626 |
adj.d = aadj1 * ulp(&rv); |
1627 |
dval(&rv) += adj.d; |
1625 |
#else |
1628 |
#else |
1626 |
#ifdef Sudden_Underflow |
1629 |
#ifdef Sudden_Underflow |
1627 |
if ((word0(rv) & Exp_mask) <= P * Exp_msk1) { |
1630 |
if ((word0(&rv) & Exp_mask) <= P * Exp_msk1) { |
1628 |
dval(rv0) = dval(rv); |
1631 |
dval(&rv0) = dval(&rv); |
1629 |
word0(rv) += P * Exp_msk1; |
1632 |
word0(&rv) += P * Exp_msk1; |
1630 |
adj = aadj1 * ulp(dval(rv)); |
1633 |
adj.d = aadj1 * ulp(&rv); |
1631 |
dval(rv) += adj; |
1634 |
dval(&rv) += adj.d; |
1632 |
if ((word0(rv) & Exp_mask) <= P * Exp_msk1) |
1635 |
if ((word0(&rv) & Exp_mask) <= P * Exp_msk1) |
1633 |
{ |
1636 |
{ |
1634 |
if (word0(rv0) == Tiny0 && word1(rv0) == Tiny1) |
1637 |
if (word0(&rv0) == Tiny0 && word1(&rv0) == Tiny1) |
1635 |
goto undfl; |
1638 |
goto undfl; |
1636 |
word0(rv) = Tiny0; |
1639 |
word0(&rv) = Tiny0; |
1637 |
word1(rv) = Tiny1; |
1640 |
word1(&rv) = Tiny1; |
1638 |
goto cont; |
1641 |
goto cont; |
1639 |
} |
1642 |
} |
1640 |
else |
1643 |
else |
1641 |
word0(rv) -= P * Exp_msk1; |
1644 |
word0(&rv) -= P * Exp_msk1; |
1642 |
} else { |
1645 |
} else { |
1643 |
adj = aadj1 * ulp(dval(rv)); |
1646 |
adj.d = aadj1 * ulp(&rv); |
1644 |
dval(rv) += adj; |
1647 |
dval(&rv) += adj.d; |
1645 |
} |
1648 |
} |
1646 |
#else /*Sudden_Underflow*/ |
1649 |
#else /*Sudden_Underflow*/ |
Lines 1657-1666
Link Here
|
1657 |
aadj1 = -aadj1; |
1660 |
aadj1 = -aadj1; |
1658 |
} |
1661 |
} |
1659 |
adj = aadj1 * ulp(dval(rv)); |
1662 |
adj.d = aadj1 * ulp(&rv); |
1660 |
dval(rv) += adj; |
1663 |
dval(&rv) += adj.d; |
1661 |
#endif /*Sudden_Underflow*/ |
1664 |
#endif /*Sudden_Underflow*/ |
1662 |
#endif /*Avoid_Underflow*/ |
1665 |
#endif /*Avoid_Underflow*/ |
1663 |
} |
1666 |
} |
1664 |
z = word0(rv) & Exp_mask; |
1667 |
z = word0(&rv) & Exp_mask; |
1665 |
#ifndef SET_INEXACT |
1668 |
#ifndef SET_INEXACT |
1666 |
#ifdef Avoid_Underflow |
1669 |
#ifdef Avoid_Underflow |
Lines 1672-1676
Link Here
|
1672 |
aadj -= L; |
1675 |
aadj -= L; |
1673 |
/* The tolerances below are conservative. */ |
1676 |
/* The tolerances below are conservative. */ |
1674 |
if (dsign || word1(rv) || word0(rv) & Bndry_mask) { |
1677 |
if (dsign || word1(&rv) || word0(&rv) & Bndry_mask) { |
1675 |
if (aadj < .4999999 || aadj > .5000001) |
1678 |
if (aadj < .4999999 || aadj > .5000001) |
1676 |
break; |
1679 |
break; |
Lines 1688-1694
Link Here
|
1688 |
if (inexact) { |
1691 |
if (inexact) { |
1689 |
if (!oldinexact) { |
1692 |
if (!oldinexact) { |
1690 |
word0(rv0) = Exp_1 + (70 << Exp_shift); |
1693 |
word0(&rv0) = Exp_1 + (70 << Exp_shift); |
1691 |
word1(rv0) = 0; |
1694 |
word1(&rv0) = 0; |
1692 |
dval(rv0) += 1.; |
1695 |
dval(&rv0) += 1.; |
1693 |
} |
1696 |
} |
1694 |
} else if (!oldinexact) |
1697 |
} else if (!oldinexact) |
Lines 1697-1706
Link Here
|
1697 |
#ifdef Avoid_Underflow |
1700 |
#ifdef Avoid_Underflow |
1698 |
if (scale) { |
1701 |
if (scale) { |
1699 |
word0(rv0) = Exp_1 - 2 * P * Exp_msk1; |
1702 |
word0(&rv0) = Exp_1 - 2 * P * Exp_msk1; |
1700 |
word1(rv0) = 0; |
1703 |
word1(&rv0) = 0; |
1701 |
dval(rv) *= dval(rv0); |
1704 |
dval(&rv) *= dval(&rv0); |
1702 |
#ifndef NO_ERRNO |
1705 |
#ifndef NO_ERRNO |
1703 |
/* try to avoid the bug of testing an 8087 register value */ |
1706 |
/* try to avoid the bug of testing an 8087 register value */ |
1704 |
if (word0(rv) == 0 && word1(rv) == 0) |
1707 |
if (word0(&rv) == 0 && word1(&rv) == 0) |
1705 |
errno = ERANGE; |
1708 |
errno = ERANGE; |
1706 |
#endif |
1709 |
#endif |
Lines 1708-1715
Link Here
|
1708 |
#endif /* Avoid_Underflow */ |
1711 |
#endif /* Avoid_Underflow */ |
1709 |
#ifdef SET_INEXACT |
1712 |
#ifdef SET_INEXACT |
1710 |
if (inexact && !(word0(rv) & Exp_mask)) { |
1713 |
if (inexact && !(word0(&rv) & Exp_mask)) { |
1711 |
/* set underflow bit */ |
1714 |
/* set underflow bit */ |
1712 |
dval(rv0) = 1e-300; |
1715 |
dval(&rv0) = 1e-300; |
1713 |
dval(rv0) *= dval(rv0); |
1716 |
dval(&rv0) *= dval(&rv0); |
1714 |
} |
1717 |
} |
1715 |
#endif |
1718 |
#endif |
Lines 1723-1727
Link Here
|
1723 |
if (se) |
1726 |
if (se) |
1724 |
*se = const_cast<char*>(s); |
1727 |
*se = const_cast<char*>(s); |
1725 |
return sign ? -dval(rv) : dval(rv); |
1728 |
return sign ? -dval(&rv) : dval(&rv); |
1726 |
} |
1729 |
} |
1727 |
|
1730 |
|
Lines 1915-1919
Link Here
|
1915 |
*/ |
1918 |
*/ |
1916 |
|
1919 |
|
1917 |
char* dtoa(double d, int ndigits, int* decpt, int* sign, char** rve) |
1920 |
char* dtoa(double dd, int ndigits, int* decpt, int* sign, char** rve) |
1918 |
{ |
1921 |
{ |
1919 |
/* |
1922 |
/* |
Lines 1935-1939
Link Here
|
1935 |
#endif |
1938 |
#endif |
1936 |
Bigint *b, *b1, *delta, *mlo = NULL, *mhi, *S; |
1939 |
Bigint *b, *b1, *delta, *mlo = NULL, *mhi, *S; |
1937 |
double d2, ds, eps; |
1940 |
U d2, eps, u; |
|
|
1941 |
double ds; |
1938 |
char *s, *s0; |
1942 |
char *s, *s0; |
1939 |
#ifdef SET_INEXACT |
1943 |
#ifdef SET_INEXACT |
Lines 1948-1967
Link Here
|
1948 |
#endif |
1952 |
#endif |
1949 |
|
1953 |
|
1950 |
if (word0(d) & Sign_bit) { |
1954 |
u.d = dd; |
|
|
1955 |
if (word0(&u) & Sign_bit) { |
1951 |
/* set sign for everything, including 0's and NaNs */ |
1956 |
/* set sign for everything, including 0's and NaNs */ |
1952 |
*sign = 1; |
1957 |
*sign = 1; |
1953 |
word0(d) &= ~Sign_bit; /* clear sign bit */ |
1958 |
word0(&u) &= ~Sign_bit; /* clear sign bit */ |
1954 |
} else |
1959 |
} else |
1955 |
*sign = 0; |
1960 |
*sign = 0; |
1956 |
|
1961 |
|
1957 |
if ((word0(d) & Exp_mask) == Exp_mask) |
1962 |
if ((word0(&u) & Exp_mask) == Exp_mask) |
1958 |
{ |
1963 |
{ |
1959 |
/* Infinity or NaN */ |
1964 |
/* Infinity or NaN */ |
1960 |
*decpt = 9999; |
1965 |
*decpt = 9999; |
1961 |
if (!word1(d) && !(word0(d) & 0xfffff)) |
1966 |
if (!word1(&u) && !(word0(&u) & 0xfffff)) |
1962 |
return nrv_alloc("Infinity", rve, 8); |
1967 |
return nrv_alloc("Infinity", rve, 8); |
1963 |
return nrv_alloc("NaN", rve, 3); |
1968 |
return nrv_alloc("NaN", rve, 3); |
1964 |
} |
1969 |
} |
1965 |
if (!dval(d)) { |
1970 |
if (!dval(&u)) { |
1966 |
*decpt = 1; |
1971 |
*decpt = 1; |
1967 |
return nrv_alloc("0", rve, 1); |
1972 |
return nrv_alloc("0", rve, 1); |
Lines 1973-1985
Link Here
|
1973 |
#endif |
1978 |
#endif |
1974 |
|
1979 |
|
1975 |
b = d2b(dval(d), &be, &bbits); |
1980 |
b = d2b(&u, &be, &bbits); |
1976 |
#ifdef Sudden_Underflow |
1981 |
#ifdef Sudden_Underflow |
1977 |
i = (int)(word0(d) >> Exp_shift1 & (Exp_mask >> Exp_shift1)); |
1982 |
i = (int)(word0(&u) >> Exp_shift1 & (Exp_mask >> Exp_shift1)); |
1978 |
#else |
1983 |
#else |
1979 |
if ((i = (int)(word0(d) >> Exp_shift1 & (Exp_mask >> Exp_shift1)))) { |
1984 |
if ((i = (int)(word0(&u) >> Exp_shift1 & (Exp_mask >> Exp_shift1)))) { |
1980 |
#endif |
1985 |
#endif |
1981 |
dval(d2) = dval(d); |
1986 |
dval(&d2) = dval(&u); |
1982 |
word0(d2) &= Frac_mask1; |
1987 |
word0(&d2) &= Frac_mask1; |
1983 |
word0(d2) |= Exp_11; |
1988 |
word0(&d2) |= Exp_11; |
1984 |
|
1989 |
|
1985 |
/* log(x) ~=~ log(1.5) + (x-1.5)/1.5 |
1990 |
/* log(x) ~=~ log(1.5) + (x-1.5)/1.5 |
Lines 2012-2024
Link Here
|
2012 |
|
2017 |
|
2013 |
i = bbits + be + (Bias + (P - 1) - 1); |
2018 |
i = bbits + be + (Bias + (P - 1) - 1); |
2014 |
x = (i > 32) ? (word0(d) << (64 - i)) | (word1(d) >> (i - 32)) |
2019 |
x = (i > 32) ? (word0(&u) << (64 - i)) | (word1(&u) >> (i - 32)) |
2015 |
: word1(d) << (32 - i); |
2020 |
: word1(&u) << (32 - i); |
2016 |
dval(d2) = x; |
2021 |
dval(&d2) = x; |
2017 |
word0(d2) -= 31 * Exp_msk1; /* adjust exponent */ |
2022 |
word0(&d2) -= 31 * Exp_msk1; /* adjust exponent */ |
2018 |
i -= (Bias + (P - 1) - 1) + 1; |
2023 |
i -= (Bias + (P - 1) - 1) + 1; |
2019 |
denorm = 1; |
2024 |
denorm = 1; |
2020 |
} |
2025 |
} |
2021 |
#endif |
2026 |
#endif |
2022 |
ds = (dval(d2) - 1.5) * 0.289529654602168 + 0.1760912590558 + (i * 0.301029995663981); |
2027 |
ds = (dval(&d2) - 1.5) * 0.289529654602168 + 0.1760912590558 + (i * 0.301029995663981); |
2023 |
k = (int)ds; |
2028 |
k = (int)ds; |
2024 |
if (ds < 0. && ds != k) |
2029 |
if (ds < 0. && ds != k) |
Lines 2026-2030
Link Here
|
2026 |
k_check = 1; |
2031 |
k_check = 1; |
2027 |
if (k >= 0 && k <= Ten_pmax) { |
2032 |
if (k >= 0 && k <= Ten_pmax) { |
2028 |
if (dval(d) < tens[k]) |
2033 |
if (dval(&u) < tens[k]) |
2029 |
k--; |
2034 |
k--; |
2030 |
k_check = 0; |
2035 |
k_check = 0; |
Lines 2067-2071
Link Here
|
2067 |
|
2072 |
|
2068 |
i = 0; |
2073 |
i = 0; |
2069 |
dval(d2) = dval(d); |
2074 |
dval(&d2) = dval(&u); |
2070 |
k0 = k; |
2075 |
k0 = k; |
2071 |
ilim0 = ilim; |
2076 |
ilim0 = ilim; |
Lines 2077-2081
Link Here
|
2077 |
/* prevent overflows */ |
2082 |
/* prevent overflows */ |
2078 |
j &= Bletch - 1; |
2083 |
j &= Bletch - 1; |
2079 |
dval(d) /= bigtens[n_bigtens - 1]; |
2084 |
dval(&u) /= bigtens[n_bigtens - 1]; |
2080 |
ieps++; |
2085 |
ieps++; |
2081 |
} |
2086 |
} |
Lines 2086-2115
Link Here
|
2086 |
} |
2091 |
} |
2087 |
} |
2092 |
} |
2088 |
dval(d) /= ds; |
2093 |
dval(&u) /= ds; |
2089 |
} else if ((j1 = -k)) { |
2094 |
} else if ((j1 = -k)) { |
2090 |
dval(d) *= tens[j1 & 0xf]; |
2095 |
dval(&u) *= tens[j1 & 0xf]; |
2091 |
for (j = j1 >> 4; j; j >>= 1, i++) { |
2096 |
for (j = j1 >> 4; j; j >>= 1, i++) { |
2092 |
if (j & 1) { |
2097 |
if (j & 1) { |
2093 |
ieps++; |
2098 |
ieps++; |
2094 |
dval(d) *= bigtens[i]; |
2099 |
dval(&u) *= bigtens[i]; |
2095 |
} |
2100 |
} |
2096 |
} |
2101 |
} |
2097 |
} |
2102 |
} |
2098 |
if (k_check && dval(d) < 1. && ilim > 0) { |
2103 |
if (k_check && dval(&u) < 1. && ilim > 0) { |
2099 |
if (ilim1 <= 0) |
2104 |
if (ilim1 <= 0) |
2100 |
goto fast_failed; |
2105 |
goto fast_failed; |
2101 |
ilim = ilim1; |
2106 |
ilim = ilim1; |
2102 |
k--; |
2107 |
k--; |
2103 |
dval(d) *= 10.; |
2108 |
dval(&u) *= 10.; |
2104 |
ieps++; |
2109 |
ieps++; |
2105 |
} |
2110 |
} |
2106 |
dval(eps) = (ieps * dval(d)) + 7.; |
2111 |
dval(&eps) = (ieps * dval(&u)) + 7.; |
2107 |
word0(eps) -= (P - 1) * Exp_msk1; |
2112 |
word0(&eps) -= (P - 1) * Exp_msk1; |
2108 |
if (ilim == 0) { |
2113 |
if (ilim == 0) { |
2109 |
S = mhi = 0; |
2114 |
S = mhi = 0; |
2110 |
dval(d) -= 5.; |
2115 |
dval(&u) -= 5.; |
2111 |
if (dval(d) > dval(eps)) |
2116 |
if (dval(&u) > dval(&eps)) |
2112 |
goto one_digit; |
2117 |
goto one_digit; |
2113 |
if (dval(d) < -dval(eps)) |
2118 |
if (dval(&u) < -dval(&eps)) |
2114 |
goto no_digits; |
2119 |
goto no_digits; |
2115 |
goto fast_failed; |
2120 |
goto fast_failed; |
Lines 2120-2150
Link Here
|
2120 |
* generating digits needed. |
2125 |
* generating digits needed. |
2121 |
*/ |
2126 |
*/ |
2122 |
dval(eps) = (0.5 / tens[ilim - 1]) - dval(eps); |
2127 |
dval(&eps) = (0.5 / tens[ilim - 1]) - dval(&eps); |
2123 |
for (i = 0;;) { |
2128 |
for (i = 0;;) { |
2124 |
L = (long int)dval(d); |
2129 |
L = (long int)dval(&u); |
2125 |
dval(d) -= L; |
2130 |
dval(&u) -= L; |
2126 |
*s++ = '0' + (int)L; |
2131 |
*s++ = '0' + (int)L; |
2127 |
if (dval(d) < dval(eps)) |
2132 |
if (dval(&u) < dval(&eps)) |
2128 |
goto ret1; |
2133 |
goto ret1; |
2129 |
if (1. - dval(d) < dval(eps)) |
2134 |
if (1. - dval(&u) < dval(&eps)) |
2130 |
goto bump_up; |
2135 |
goto bump_up; |
2131 |
if (++i >= ilim) |
2136 |
if (++i >= ilim) |
2132 |
break; |
2137 |
break; |
2133 |
dval(eps) *= 10.; |
2138 |
dval(&eps) *= 10.; |
2134 |
dval(d) *= 10.; |
2139 |
dval(&u) *= 10.; |
2135 |
} |
2140 |
} |
2136 |
} else { |
2141 |
} else { |
2137 |
#endif |
2142 |
#endif |
2138 |
/* Generate ilim digits, then fix them up. */ |
2143 |
/* Generate ilim digits, then fix them up. */ |
2139 |
dval(eps) *= tens[ilim - 1]; |
2144 |
dval(&eps) *= tens[ilim - 1]; |
2140 |
for (i = 1;; i++, dval(d) *= 10.) { |
2145 |
for (i = 1;; i++, dval(&u) *= 10.) { |
2141 |
L = (int32_t)(dval(d)); |
2146 |
L = (int32_t)(dval(&u)); |
2142 |
if (!(dval(d) -= L)) |
2147 |
if (!(dval(&u) -= L)) |
2143 |
ilim = i; |
2148 |
ilim = i; |
2144 |
*s++ = '0' + (int)L; |
2149 |
*s++ = '0' + (int)L; |
2145 |
if (i == ilim) { |
2150 |
if (i == ilim) { |
2146 |
if (dval(d) > 0.5 + dval(eps)) |
2151 |
if (dval(&u) > 0.5 + dval(&eps)) |
2147 |
goto bump_up; |
2152 |
goto bump_up; |
2148 |
else if (dval(d) < 0.5 - dval(eps)) { |
2153 |
else if (dval(&u) < 0.5 - dval(&eps)) { |
2149 |
while (*--s == '0') { } |
2154 |
while (*--s == '0') { } |
2150 |
s++; |
2155 |
s++; |
Lines 2159-2163
Link Here
|
2159 |
fast_failed: |
2164 |
fast_failed: |
2160 |
s = s0; |
2165 |
s = s0; |
2161 |
dval(d) = dval(d2); |
2166 |
dval(&u) = dval(&d2); |
2162 |
k = k0; |
2167 |
k = k0; |
2163 |
ilim = ilim0; |
2168 |
ilim = ilim0; |
Lines 2171-2190
Link Here
|
2171 |
if (ndigits < 0 && ilim <= 0) { |
2176 |
if (ndigits < 0 && ilim <= 0) { |
2172 |
S = mhi = 0; |
2177 |
S = mhi = 0; |
2173 |
if (ilim < 0 || dval(d) <= 5 * ds) |
2178 |
if (ilim < 0 || dval(&u) <= 5 * ds) |
2174 |
goto no_digits; |
2179 |
goto no_digits; |
2175 |
goto one_digit; |
2180 |
goto one_digit; |
2176 |
} |
2181 |
} |
2177 |
for (i = 1;; i++, dval(d) *= 10.) { |
2182 |
for (i = 1;; i++, dval(&u) *= 10.) { |
2178 |
L = (int32_t)(dval(d) / ds); |
2183 |
L = (int32_t)(dval(&u) / ds); |
2179 |
dval(d) -= L * ds; |
2184 |
dval(&u) -= L * ds; |
2180 |
#ifdef Check_FLT_ROUNDS |
2185 |
#ifdef Check_FLT_ROUNDS |
2181 |
/* If FLT_ROUNDS == 2, L will usually be high by 1 */ |
2186 |
/* If FLT_ROUNDS == 2, L will usually be high by 1 */ |
2182 |
if (dval(d) < 0) { |
2187 |
if (dval(&u) < 0) { |
2183 |
L--; |
2188 |
L--; |
2184 |
dval(d) += ds; |
2189 |
dval(&u) += ds; |
2185 |
} |
2190 |
} |
2186 |
#endif |
2191 |
#endif |
2187 |
*s++ = '0' + (int)L; |
2192 |
*s++ = '0' + (int)L; |
2188 |
if (!dval(d)) { |
2193 |
if (!dval(&u)) { |
2189 |
#ifdef SET_INEXACT |
2194 |
#ifdef SET_INEXACT |
2190 |
inexact = 0; |
2195 |
inexact = 0; |
Lines 2193-2198
Link Here
|
2193 |
} |
2198 |
} |
2194 |
if (i == ilim) { |
2199 |
if (i == ilim) { |
2195 |
dval(d) += dval(d); |
2200 |
dval(&u) += dval(&u); |
2196 |
if (dval(d) > ds || (dval(d) == ds && (L & 1))) { |
2201 |
if (dval(&u) > ds || (dval(&u) == ds && (L & 1))) { |
2197 |
bump_up: |
2202 |
bump_up: |
2198 |
while (*--s == '9') |
2203 |
while (*--s == '9') |
Lines 2249-2255
Link Here
|
2249 |
|
2254 |
|
2250 |
spec_case = 0; |
2255 |
spec_case = 0; |
2251 |
if (!word1(d) && !(word0(d) & Bndry_mask) |
2256 |
if (!word1(&u) && !(word0(&u) & Bndry_mask) |
2252 |
#ifndef Sudden_Underflow |
2257 |
#ifndef Sudden_Underflow |
2253 |
&& word0(d) & (Exp_mask & ~Exp_msk1) |
2258 |
&& word0(&u) & (Exp_mask & ~Exp_msk1) |
2254 |
#endif |
2259 |
#endif |
2255 |
) { |
2260 |
) { |
Lines 2323-2327
Link Here
|
2323 |
j1 = delta->sign ? 1 : cmp(b, delta); |
2328 |
j1 = delta->sign ? 1 : cmp(b, delta); |
2324 |
Bfree(delta); |
2329 |
Bfree(delta); |
2325 |
if (j1 == 0 && !(word1(d) & 1)) { |
2330 |
if (j1 == 0 && !(word1(&u) & 1)) { |
2326 |
if (dig == '9') |
2331 |
if (dig == '9') |
2327 |
goto round_9_up; |
2332 |
goto round_9_up; |
Lines 2335-2339
Link Here
|
2335 |
goto ret; |
2340 |
goto ret; |
2336 |
} |
2341 |
} |
2337 |
if (j < 0 || (j == 0 && !(word1(d) & 1))) { |
2342 |
if (j < 0 || (j == 0 && !(word1(&u) & 1))) { |
2338 |
if (!b->x[0] && b->wds <= 1) { |
2343 |
if (!b->x[0] && b->wds <= 1) { |
2339 |
#ifdef SET_INEXACT |
2344 |
#ifdef SET_INEXACT |
Lines 2422-2428
Link Here
|
2422 |
if (inexact) { |
2427 |
if (inexact) { |
2423 |
if (!oldinexact) { |
2428 |
if (!oldinexact) { |
2424 |
word0(d) = Exp_1 + (70 << Exp_shift); |
2429 |
word0(&u) = Exp_1 + (70 << Exp_shift); |
2425 |
word1(d) = 0; |
2430 |
word1(&u) = 0; |
2426 |
dval(d) += 1.; |
2431 |
dval(&u) += 1.; |
2427 |
} |
2432 |
} |
2428 |
} else if (!oldinexact) |
2433 |
} else if (!oldinexact) |