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