summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorniklas <>1998-08-12 22:16:38 +0000
committerniklas <>1998-08-12 22:16:38 +0000
commit2f3712534799d2184deb6221d3f4d1f8d9098442 (patch)
tree0c81ec36b8b5e36874b4be9045bd48ca9a8d5339
parent50eee0f1b3f8eb0bb5326831025eae1cacfc3059 (diff)
downloadopenbsd-2f3712534799d2184deb6221d3f4d1f8d9098442.tar.gz
openbsd-2f3712534799d2184deb6221d3f4d1f8d9098442.tar.bz2
openbsd-2f3712534799d2184deb6221d3f4d1f8d9098442.zip
Make code ANSI/ISO C conformant. Formerly undefined constructs were used
making load/store architectures (like mips&alpha) fail whn compiled with gcc -O2.
-rw-r--r--src/lib/libc/stdlib/strtod.c222
1 files changed, 119 insertions, 103 deletions
diff --git a/src/lib/libc/stdlib/strtod.c b/src/lib/libc/stdlib/strtod.c
index 4b38110dcb..36a0603fbf 100644
--- a/src/lib/libc/stdlib/strtod.c
+++ b/src/lib/libc/stdlib/strtod.c
@@ -90,7 +90,7 @@
90 */ 90 */
91 91
92#if defined(LIBC_SCCS) && !defined(lint) 92#if defined(LIBC_SCCS) && !defined(lint)
93static char *rcsid = "$OpenBSD: strtod.c,v 1.10 1998/08/11 22:04:29 niklas Exp $"; 93static char *rcsid = "$OpenBSD: strtod.c,v 1.11 1998/08/12 22:16:38 niklas Exp $";
94#endif /* LIBC_SCCS and not lint */ 94#endif /* LIBC_SCCS and not lint */
95 95
96#if defined(__m68k__) || defined(__sparc__) || defined(__i386__) || \ 96#if defined(__m68k__) || defined(__sparc__) || defined(__i386__) || \
@@ -222,12 +222,17 @@ Exactly one of IEEE_LITTLE_ENDIAN IEEE_BIG_ENDIAN, VAX, or
222IBM should be defined. 222IBM should be defined.
223#endif 223#endif
224 224
225typedef union {
226 double d;
227 ULong ul[2];
228} _double;
229#define value(x) ((x).d)
225#ifdef IEEE_LITTLE_ENDIAN 230#ifdef IEEE_LITTLE_ENDIAN
226#define word0(x) ((ULong *)&x)[1] 231#define word0(x) ((x).ul[1])
227#define word1(x) ((ULong *)&x)[0] 232#define word1(x) ((x).ul[0])
228#else 233#else
229#define word0(x) ((ULong *)&x)[0] 234#define word0(x) ((x).ul[0])
230#define word1(x) ((ULong *)&x)[1] 235#define word1(x) ((x).ul[1])
231#endif 236#endif
232 237
233/* The following definition of Storeinc is appropriate for MIPS processors. 238/* The following definition of Storeinc is appropriate for MIPS processors.
@@ -909,14 +914,16 @@ diff
909 static double 914 static double
910ulp 915ulp
911#ifdef KR_headers 916#ifdef KR_headers
912 (x) double x; 917 (_x) double _x;
913#else 918#else
914 (double x) 919 (double _x)
915#endif 920#endif
916{ 921{
922 _double x;
917 register Long L; 923 register Long L;
918 double a; 924 _double a;
919 925
926 value(x) = _x;
920 L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1; 927 L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1;
921#ifndef Sudden_Underflow 928#ifndef Sudden_Underflow
922 if (L > 0) { 929 if (L > 0) {
@@ -941,7 +948,7 @@ ulp
941 } 948 }
942 } 949 }
943#endif 950#endif
944 return a; 951 return value(a);
945 } 952 }
946 953
947 static double 954 static double
@@ -954,7 +961,7 @@ b2d
954{ 961{
955 ULong *xa, *xa0, w, y, z; 962 ULong *xa, *xa0, w, y, z;
956 int k; 963 int k;
957 double d; 964 _double d;
958#ifdef VAX 965#ifdef VAX
959 ULong d0, d1; 966 ULong d0, d1;
960#else 967#else
@@ -1011,22 +1018,27 @@ b2d
1011#undef d0 1018#undef d0
1012#undef d1 1019#undef d1
1013#endif 1020#endif
1014 return d; 1021 return value(d);
1015 } 1022 }
1016 1023
1017 static Bigint * 1024 static Bigint *
1018d2b 1025d2b
1019#ifdef KR_headers 1026#ifdef KR_headers
1020 (d, e, bits) double d; int *e, *bits; 1027 (_d, e, bits) double d; int *e, *bits;
1021#else 1028#else
1022 (double d, int *e, int *bits) 1029 (double _d, int *e, int *bits)
1023#endif 1030#endif
1024{ 1031{
1025 Bigint *b; 1032 Bigint *b;
1026 int de, i, k; 1033 int de, i, k;
1027 ULong *x, y, z; 1034 ULong *x, y, z;
1035 _double d;
1028#ifdef VAX 1036#ifdef VAX
1029 ULong d0, d1; 1037 ULong d0, d1;
1038#endif
1039
1040 value(d) = _d;
1041#ifdef VAX
1030 d0 = word0(d) >> 16 | word0(d) << 16; 1042 d0 = word0(d) >> 16 | word0(d) << 16;
1031 d1 = word1(d) >> 16 | word1(d) << 16; 1043 d1 = word1(d) >> 16 | word1(d) << 16;
1032#else 1044#else
@@ -1151,11 +1163,11 @@ ratio
1151 (Bigint *a, Bigint *b) 1163 (Bigint *a, Bigint *b)
1152#endif 1164#endif
1153{ 1165{
1154 double da, db; 1166 _double da, db;
1155 int k, ka, kb; 1167 int k, ka, kb;
1156 1168
1157 da = b2d(a, &ka); 1169 value(da) = b2d(a, &ka);
1158 db = b2d(b, &kb); 1170 value(db) = b2d(b, &kb);
1159#ifdef Pack_32 1171#ifdef Pack_32
1160 k = ka - kb + 32*(a->wds - b->wds); 1172 k = ka - kb + 32*(a->wds - b->wds);
1161#else 1173#else
@@ -1181,7 +1193,7 @@ ratio
1181 word0(db) += k*Exp_msk1; 1193 word0(db) += k*Exp_msk1;
1182 } 1194 }
1183#endif 1195#endif
1184 return da / db; 1196 return value(da) / value(db);
1185 } 1197 }
1186 1198
1187static CONST double 1199static CONST double
@@ -1221,7 +1233,8 @@ strtod
1221 int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, dsign, 1233 int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, dsign,
1222 e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign; 1234 e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign;
1223 CONST char *s, *s0, *s1; 1235 CONST char *s, *s0, *s1;
1224 double aadj, aadj1, adj, rv, rv0; 1236 double aadj, aadj1, adj;
1237 _double rv, rv0;
1225 Long L; 1238 Long L;
1226 ULong y, z; 1239 ULong y, z;
1227 Bigint *bb, *bb1, *bd, *bd0, *bs, *delta; 1240 Bigint *bb, *bb1, *bd, *bd0, *bs, *delta;
@@ -1233,7 +1246,7 @@ strtod
1233#endif 1246#endif
1234 1247
1235 sign = nz0 = nz = 0; 1248 sign = nz0 = nz = 0;
1236 rv = 0.; 1249 value(rv) = 0.;
1237 1250
1238 1251
1239 for(s = s00; isspace((unsigned char) *s); s++) 1252 for(s = s00; isspace((unsigned char) *s); s++)
@@ -1350,9 +1363,9 @@ strtod
1350 if (!nd0) 1363 if (!nd0)
1351 nd0 = nd; 1364 nd0 = nd;
1352 k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1; 1365 k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1;
1353 rv = y; 1366 value(rv) = y;
1354 if (k > 9) 1367 if (k > 9)
1355 rv = tens[k - 9] * rv + z; 1368 value(rv) = tens[k - 9] * value(rv) + z;
1356 bd0 = 0; 1369 bd0 = 0;
1357 if (nd <= DBL_DIG 1370 if (nd <= DBL_DIG
1358#ifndef RND_PRODQUOT 1371#ifndef RND_PRODQUOT
@@ -1366,7 +1379,8 @@ strtod
1366#ifdef VAX 1379#ifdef VAX
1367 goto vax_ovfl_check; 1380 goto vax_ovfl_check;
1368#else 1381#else
1369 /* rv = */ rounded_product(rv, tens[e]); 1382 /* value(rv) = */ rounded_product(value(rv),
1383 tens[e]);
1370 goto ret; 1384 goto ret;
1371#endif 1385#endif
1372 } 1386 }
@@ -1376,27 +1390,30 @@ strtod
1376 * this for larger i values. 1390 * this for larger i values.
1377 */ 1391 */
1378 e -= i; 1392 e -= i;
1379 rv *= tens[i]; 1393 value(rv) *= tens[i];
1380#ifdef VAX 1394#ifdef VAX
1381 /* VAX exponent range is so narrow we must 1395 /* VAX exponent range is so narrow we must
1382 * worry about overflow here... 1396 * worry about overflow here...
1383 */ 1397 */
1384 vax_ovfl_check: 1398 vax_ovfl_check:
1385 word0(rv) -= P*Exp_msk1; 1399 word0(rv) -= P*Exp_msk1;
1386 /* rv = */ rounded_product(rv, tens[e]); 1400 /* value(rv) = */ rounded_product(value(rv),
1401 tens[e]);
1387 if ((word0(rv) & Exp_mask) 1402 if ((word0(rv) & Exp_mask)
1388 > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) 1403 > Exp_msk1*(DBL_MAX_EXP+Bias-1-P))
1389 goto ovfl; 1404 goto ovfl;
1390 word0(rv) += P*Exp_msk1; 1405 word0(rv) += P*Exp_msk1;
1391#else 1406#else
1392 /* rv = */ rounded_product(rv, tens[e]); 1407 /* value(rv) = */ rounded_product(value(rv),
1408 tens[e]);
1393#endif 1409#endif
1394 goto ret; 1410 goto ret;
1395 } 1411 }
1396 } 1412 }
1397#ifndef Inaccurate_Divide 1413#ifndef Inaccurate_Divide
1398 else if (e >= -Ten_pmax) { 1414 else if (e >= -Ten_pmax) {
1399 /* rv = */ rounded_quotient(rv, tens[-e]); 1415 /* value(rv) = */ rounded_quotient(value(rv),
1416 tens[-e]);
1400 goto ret; 1417 goto ret;
1401 } 1418 }
1402#endif 1419#endif
@@ -1407,13 +1424,13 @@ strtod
1407 1424
1408 if (e1 > 0) { 1425 if (e1 > 0) {
1409 if (i = e1 & 15) 1426 if (i = e1 & 15)
1410 rv *= tens[i]; 1427 value(rv) *= tens[i];
1411 if (e1 &= ~15) { 1428 if (e1 &= ~15) {
1412 if (e1 > DBL_MAX_10_EXP) { 1429 if (e1 > DBL_MAX_10_EXP) {
1413 ovfl: 1430 ovfl:
1414 errno = ERANGE; 1431 errno = ERANGE;
1415#ifdef __STDC__ 1432#ifdef __STDC__
1416 rv = HUGE_VAL; 1433 value(rv) = HUGE_VAL;
1417#else 1434#else
1418 /* Can't trust HUGE_VAL */ 1435 /* Can't trust HUGE_VAL */
1419#ifdef IEEE_Arith 1436#ifdef IEEE_Arith
@@ -1431,10 +1448,10 @@ strtod
1431 if (e1 >>= 4) { 1448 if (e1 >>= 4) {
1432 for(j = 0; e1 > 1; j++, e1 >>= 1) 1449 for(j = 0; e1 > 1; j++, e1 >>= 1)
1433 if (e1 & 1) 1450 if (e1 & 1)
1434 rv *= bigtens[j]; 1451 value(rv) *= bigtens[j];
1435 /* The last multiplication could overflow. */ 1452 /* The last multiplication could overflow. */
1436 word0(rv) -= P*Exp_msk1; 1453 word0(rv) -= P*Exp_msk1;
1437 rv *= bigtens[j]; 1454 value(rv) *= bigtens[j];
1438 if ((z = word0(rv) & Exp_mask) 1455 if ((z = word0(rv) & Exp_mask)
1439 > Exp_msk1*(DBL_MAX_EXP+Bias-P)) 1456 > Exp_msk1*(DBL_MAX_EXP+Bias-P))
1440 goto ovfl; 1457 goto ovfl;
@@ -1453,23 +1470,23 @@ strtod
1453 else if (e1 < 0) { 1470 else if (e1 < 0) {
1454 e1 = -e1; 1471 e1 = -e1;
1455 if (i = e1 & 15) 1472 if (i = e1 & 15)
1456 rv /= tens[i]; 1473 value(rv) /= tens[i];
1457 if (e1 &= ~15) { 1474 if (e1 &= ~15) {
1458 e1 >>= 4; 1475 e1 >>= 4;
1459 if (e1 >= 1 << n_bigtens) 1476 if (e1 >= 1 << n_bigtens)
1460 goto undfl; 1477 goto undfl;
1461 for(j = 0; e1 > 1; j++, e1 >>= 1) 1478 for(j = 0; e1 > 1; j++, e1 >>= 1)
1462 if (e1 & 1) 1479 if (e1 & 1)
1463 rv *= tinytens[j]; 1480 value(rv) *= tinytens[j];
1464 /* The last multiplication could underflow. */ 1481 /* The last multiplication could underflow. */
1465 rv0 = rv; 1482 value(rv0) = value(rv);
1466 rv *= tinytens[j]; 1483 value(rv) *= tinytens[j];
1467 if (!rv) { 1484 if (!value(rv)) {
1468 rv = 2.*rv0; 1485 value(rv) = 2.*value(rv0);
1469 rv *= tinytens[j]; 1486 value(rv) *= tinytens[j];
1470 if (!rv) { 1487 if (!value(rv)) {
1471 undfl: 1488 undfl:
1472 rv = 0.; 1489 value(rv) = 0.;
1473 errno = ERANGE; 1490 errno = ERANGE;
1474 if (bd0) 1491 if (bd0)
1475 goto retfree; 1492 goto retfree;
@@ -1493,7 +1510,7 @@ strtod
1493 for(;;) { 1510 for(;;) {
1494 bd = Balloc(bd0->k); 1511 bd = Balloc(bd0->k);
1495 Bcopy(bd, bd0); 1512 Bcopy(bd, bd0);
1496 bb = d2b(rv, &bbe, &bbbits); /* rv = bb * 2^bbe */ 1513 bb = d2b(value(rv), &bbe, &bbbits); /* rv = bb * 2^bbe */
1497 bs = i2b(1); 1514 bs = i2b(1);
1498 1515
1499 if (e >= 0) { 1516 if (e >= 0) {
@@ -1605,12 +1622,12 @@ strtod
1605 break; 1622 break;
1606#endif 1623#endif
1607 if (dsign) 1624 if (dsign)
1608 rv += ulp(rv); 1625 value(rv) += ulp(value(rv));
1609#ifndef ROUND_BIASED 1626#ifndef ROUND_BIASED
1610 else { 1627 else {
1611 rv -= ulp(rv); 1628 value(rv) -= ulp(value(rv));
1612#ifndef Sudden_Underflow 1629#ifndef Sudden_Underflow
1613 if (!rv) 1630 if (!value(rv))
1614 goto undfl; 1631 goto undfl;
1615#endif 1632#endif
1616 } 1633 }
@@ -1661,10 +1678,10 @@ strtod
1661 /* Check for overflow */ 1678 /* Check for overflow */
1662 1679
1663 if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) { 1680 if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) {
1664 rv0 = rv; 1681 value(rv0) = value(rv);
1665 word0(rv) -= P*Exp_msk1; 1682 word0(rv) -= P*Exp_msk1;
1666 adj = aadj1 * ulp(rv); 1683 adj = aadj1 * ulp(value(rv));
1667 rv += adj; 1684 value(rv) += adj;
1668 if ((word0(rv) & Exp_mask) >= 1685 if ((word0(rv) & Exp_mask) >=
1669 Exp_msk1*(DBL_MAX_EXP+Bias-P)) { 1686 Exp_msk1*(DBL_MAX_EXP+Bias-P)) {
1670 if (word0(rv0) == Big0 && word1(rv0) == Big1) 1687 if (word0(rv0) == Big0 && word1(rv0) == Big1)
@@ -1679,10 +1696,10 @@ strtod
1679 else { 1696 else {
1680#ifdef Sudden_Underflow 1697#ifdef Sudden_Underflow
1681 if ((word0(rv) & Exp_mask) <= P*Exp_msk1) { 1698 if ((word0(rv) & Exp_mask) <= P*Exp_msk1) {
1682 rv0 = rv; 1699 value(rv0) = value(rv);
1683 word0(rv) += P*Exp_msk1; 1700 word0(rv) += P*Exp_msk1;
1684 adj = aadj1 * ulp(rv); 1701 adj = aadj1 * ulp(value(rv));
1685 rv += adj; 1702 value(rv) += adj;
1686#ifdef IBM 1703#ifdef IBM
1687 if ((word0(rv) & Exp_mask) < P*Exp_msk1) 1704 if ((word0(rv) & Exp_mask) < P*Exp_msk1)
1688#else 1705#else
@@ -1700,8 +1717,8 @@ strtod
1700 word0(rv) -= P*Exp_msk1; 1717 word0(rv) -= P*Exp_msk1;
1701 } 1718 }
1702 else { 1719 else {
1703 adj = aadj1 * ulp(rv); 1720 adj = aadj1 * ulp(value(rv));
1704 rv += adj; 1721 value(rv) += adj;
1705 } 1722 }
1706#else 1723#else
1707 /* Compute adj so that the IEEE rounding rules will 1724 /* Compute adj so that the IEEE rounding rules will
@@ -1716,8 +1733,8 @@ strtod
1716 if (!dsign) 1733 if (!dsign)
1717 aadj1 = -aadj1; 1734 aadj1 = -aadj1;
1718 } 1735 }
1719 adj = aadj1 * ulp(rv); 1736 adj = aadj1 * ulp(value(rv));
1720 rv += adj; 1737 value(rv) += adj;
1721#endif 1738#endif
1722 } 1739 }
1723 z = word0(rv) & Exp_mask; 1740 z = word0(rv) & Exp_mask;
@@ -1748,7 +1765,7 @@ strtod
1748 ret: 1765 ret:
1749 if (se) 1766 if (se)
1750 *se = (char *)s; 1767 *se = (char *)s;
1751 return sign ? -rv : rv; 1768 return sign ? -value(rv) : value(rv);
1752 } 1769 }
1753 1770
1754 static int 1771 static int
@@ -1894,10 +1911,10 @@ quorem
1894 char * 1911 char *
1895__dtoa 1912__dtoa
1896#ifdef KR_headers 1913#ifdef KR_headers
1897 (d, mode, ndigits, decpt, sign, rve) 1914 (_d, mode, ndigits, decpt, sign, rve)
1898 double d; int mode, ndigits, *decpt, *sign; char **rve; 1915 double _d; int mode, ndigits, *decpt, *sign; char **rve;
1899#else 1916#else
1900 (double d, int mode, int ndigits, int *decpt, int *sign, char **rve) 1917 (double _d, int mode, int ndigits, int *decpt, int *sign, char **rve)
1901#endif 1918#endif
1902{ 1919{
1903 /* Arguments ndigits, decpt, sign are similar to those 1920 /* Arguments ndigits, decpt, sign are similar to those
@@ -1943,11 +1960,13 @@ __dtoa
1943 ULong x; 1960 ULong x;
1944#endif 1961#endif
1945 Bigint *b, *b1, *delta, *mlo, *mhi, *S; 1962 Bigint *b, *b1, *delta, *mlo, *mhi, *S;
1946 double d2, ds, eps; 1963 double ds;
1947 char *s, *s0; 1964 char *s, *s0;
1948 static Bigint *result; 1965 static Bigint *result;
1949 static int result_k; 1966 static int result_k;
1967 _double d, d2, eps;
1950 1968
1969 value(d) = _d;
1951 if (result) { 1970 if (result) {
1952 result->k = result_k; 1971 result->k = result_k;
1953 result->maxwds = 1 << result_k; 1972 result->maxwds = 1 << result_k;
@@ -1987,9 +2006,9 @@ __dtoa
1987 } 2006 }
1988#endif 2007#endif
1989#ifdef IBM 2008#ifdef IBM
1990 d += 0; /* normalize */ 2009 value(d) += 0; /* normalize */
1991#endif 2010#endif
1992 if (!d) { 2011 if (!value(d)) {
1993 *decpt = 1; 2012 *decpt = 1;
1994 s = "0"; 2013 s = "0";
1995 if (rve) 2014 if (rve)
@@ -1997,22 +2016,18 @@ __dtoa
1997 return s; 2016 return s;
1998 } 2017 }
1999 2018
2000 b = d2b(d, &be, &bbits); 2019 b = d2b(value(d), &be, &bbits);
2001#ifdef Sudden_Underflow 2020#ifdef Sudden_Underflow
2002 i = (int)(word0(d) >> Exp_shift1 & (Exp_mask>>Exp_shift1)); 2021 i = (int)(word0(d) >> Exp_shift1 & (Exp_mask>>Exp_shift1));
2003#else 2022#else
2004 if (i = (int)(word0(d) >> Exp_shift1 & (Exp_mask>>Exp_shift1))) { 2023 if (i = (int)(word0(d) >> Exp_shift1 & (Exp_mask>>Exp_shift1))) {
2005#endif 2024#endif
2006 d2 = d; 2025 value(d2) = value(d);
2007#ifdef __GNUC__
2008 /* Do not move instructions depending on d2 over this line. */
2009 __asm__ __volatile__ ("" : : "X" (d2) : "memory");
2010#endif
2011 word0(d2) &= Frac_mask1; 2026 word0(d2) &= Frac_mask1;
2012 word0(d2) |= Exp_11; 2027 word0(d2) |= Exp_11;
2013#ifdef IBM 2028#ifdef IBM
2014 if (j = 11 - hi0bits(word0(d2) & Frac_mask)) 2029 if (j = 11 - hi0bits(word0(d2) & Frac_mask))
2015 d2 /= 1 << j; 2030 value(d2) /= 1 << j;
2016#endif 2031#endif
2017 2032
2018 /* log(x) ~=~ log(1.5) + (x-1.5)/1.5 2033 /* log(x) ~=~ log(1.5) + (x-1.5)/1.5
@@ -2051,19 +2066,20 @@ __dtoa
2051 i = bbits + be + (Bias + (P-1) - 1); 2066 i = bbits + be + (Bias + (P-1) - 1);
2052 x = i > 32 ? word0(d) << 64 - i | word1(d) >> i - 32 2067 x = i > 32 ? word0(d) << 64 - i | word1(d) >> i - 32
2053 : word1(d) << 32 - i; 2068 : word1(d) << 32 - i;
2054 d2 = x; 2069 value(d2) = x;
2055 word0(d2) -= 31*Exp_msk1; /* adjust exponent */ 2070 word0(d2) -= 31*Exp_msk1; /* adjust exponent */
2056 i -= (Bias + (P-1) - 1) + 1; 2071 i -= (Bias + (P-1) - 1) + 1;
2057 denorm = 1; 2072 denorm = 1;
2058 } 2073 }
2059#endif 2074#endif
2060 ds = (d2-1.5)*0.289529654602168 + 0.1760912590558 + i*0.301029995663981; 2075 ds = (value(d2)-1.5)*0.289529654602168 + 0.1760912590558 +
2076 i*0.301029995663981;
2061 k = (int)ds; 2077 k = (int)ds;
2062 if (ds < 0. && ds != k) 2078 if (ds < 0. && ds != k)
2063 k--; /* want k = floor(ds) */ 2079 k--; /* want k = floor(ds) */
2064 k_check = 1; 2080 k_check = 1;
2065 if (k >= 0 && k <= Ten_pmax) { 2081 if (k >= 0 && k <= Ten_pmax) {
2066 if (d < tens[k]) 2082 if (value(d) < tens[k])
2067 k--; 2083 k--;
2068 k_check = 0; 2084 k_check = 0;
2069 } 2085 }
@@ -2130,7 +2146,7 @@ __dtoa
2130 /* Try to get by with floating-point arithmetic. */ 2146 /* Try to get by with floating-point arithmetic. */
2131 2147
2132 i = 0; 2148 i = 0;
2133 d2 = d; 2149 value(d2) = value(d);
2134 k0 = k; 2150 k0 = k;
2135 ilim0 = ilim; 2151 ilim0 = ilim;
2136 ieps = 2; /* conservative */ 2152 ieps = 2; /* conservative */
@@ -2140,7 +2156,7 @@ __dtoa
2140 if (j & Bletch) { 2156 if (j & Bletch) {
2141 /* prevent overflows */ 2157 /* prevent overflows */
2142 j &= Bletch - 1; 2158 j &= Bletch - 1;
2143 d /= bigtens[n_bigtens-1]; 2159 value(d) /= bigtens[n_bigtens-1];
2144 ieps++; 2160 ieps++;
2145 } 2161 }
2146 for(; j; j >>= 1, i++) 2162 for(; j; j >>= 1, i++)
@@ -2148,32 +2164,32 @@ __dtoa
2148 ieps++; 2164 ieps++;
2149 ds *= bigtens[i]; 2165 ds *= bigtens[i];
2150 } 2166 }
2151 d /= ds; 2167 value(d) /= ds;
2152 } 2168 }
2153 else if (j1 = -k) { 2169 else if (j1 = -k) {
2154 d *= tens[j1 & 0xf]; 2170 value(d) *= tens[j1 & 0xf];
2155 for(j = j1 >> 4; j; j >>= 1, i++) 2171 for(j = j1 >> 4; j; j >>= 1, i++)
2156 if (j & 1) { 2172 if (j & 1) {
2157 ieps++; 2173 ieps++;
2158 d *= bigtens[i]; 2174 value(d) *= bigtens[i];
2159 } 2175 }
2160 } 2176 }
2161 if (k_check && d < 1. && ilim > 0) { 2177 if (k_check && value(d) < 1. && ilim > 0) {
2162 if (ilim1 <= 0) 2178 if (ilim1 <= 0)
2163 goto fast_failed; 2179 goto fast_failed;
2164 ilim = ilim1; 2180 ilim = ilim1;
2165 k--; 2181 k--;
2166 d *= 10.; 2182 value(d) *= 10.;
2167 ieps++; 2183 ieps++;
2168 } 2184 }
2169 eps = ieps*d + 7.; 2185 value(eps) = ieps*value(d) + 7.;
2170 word0(eps) -= (P-1)*Exp_msk1; 2186 word0(eps) -= (P-1)*Exp_msk1;
2171 if (ilim == 0) { 2187 if (ilim == 0) {
2172 S = mhi = 0; 2188 S = mhi = 0;
2173 d -= 5.; 2189 value(d) -= 5.;
2174 if (d > eps) 2190 if (value(d) > value(eps))
2175 goto one_digit; 2191 goto one_digit;
2176 if (d < -eps) 2192 if (value(d) < -value(eps))
2177 goto no_digits; 2193 goto no_digits;
2178 goto fast_failed; 2194 goto fast_failed;
2179 } 2195 }
@@ -2182,33 +2198,33 @@ __dtoa
2182 /* Use Steele & White method of only 2198 /* Use Steele & White method of only
2183 * generating digits needed. 2199 * generating digits needed.
2184 */ 2200 */
2185 eps = 0.5/tens[ilim-1] - eps; 2201 value(eps) = 0.5/tens[ilim-1] - value(eps);
2186 for(i = 0;;) { 2202 for(i = 0;;) {
2187 L = d; 2203 L = value(d);
2188 d -= L; 2204 value(d) -= L;
2189 *s++ = '0' + (int)L; 2205 *s++ = '0' + (int)L;
2190 if (d < eps) 2206 if (value(d) < value(eps))
2191 goto ret1; 2207 goto ret1;
2192 if (1. - d < eps) 2208 if (1. - value(d) < value(eps))
2193 goto bump_up; 2209 goto bump_up;
2194 if (++i >= ilim) 2210 if (++i >= ilim)
2195 break; 2211 break;
2196 eps *= 10.; 2212 value(eps) *= 10.;
2197 d *= 10.; 2213 value(d) *= 10.;
2198 } 2214 }
2199 } 2215 }
2200 else { 2216 else {
2201#endif 2217#endif
2202 /* Generate ilim digits, then fix them up. */ 2218 /* Generate ilim digits, then fix them up. */
2203 eps *= tens[ilim-1]; 2219 value(eps) *= tens[ilim-1];
2204 for(i = 1;; i++, d *= 10.) { 2220 for(i = 1;; i++, value(d) *= 10.) {
2205 L = d; 2221 L = value(d);
2206 d -= L; 2222 value(d) -= L;
2207 *s++ = '0' + (int)L; 2223 *s++ = '0' + (int)L;
2208 if (i == ilim) { 2224 if (i == ilim) {
2209 if (d > 0.5 + eps) 2225 if (value(d) > 0.5 + value(eps))
2210 goto bump_up; 2226 goto bump_up;
2211 else if (d < 0.5 - eps) { 2227 else if (value(d) < 0.5 - value(eps)) {
2212 while(*--s == '0'); 2228 while(*--s == '0');
2213 s++; 2229 s++;
2214 goto ret1; 2230 goto ret1;
@@ -2221,7 +2237,7 @@ __dtoa
2221#endif 2237#endif
2222 fast_failed: 2238 fast_failed:
2223 s = s0; 2239 s = s0;
2224 d = d2; 2240 value(d) = value(d2);
2225 k = k0; 2241 k = k0;
2226 ilim = ilim0; 2242 ilim = ilim0;
2227 } 2243 }
@@ -2233,24 +2249,24 @@ __dtoa
2233 ds = tens[k]; 2249 ds = tens[k];
2234 if (ndigits < 0 && ilim <= 0) { 2250 if (ndigits < 0 && ilim <= 0) {
2235 S = mhi = 0; 2251 S = mhi = 0;
2236 if (ilim < 0 || d <= 5*ds) 2252 if (ilim < 0 || value(d) <= 5*ds)
2237 goto no_digits; 2253 goto no_digits;
2238 goto one_digit; 2254 goto one_digit;
2239 } 2255 }
2240 for(i = 1;; i++) { 2256 for(i = 1;; i++) {
2241 L = d / ds; 2257 L = value(d) / ds;
2242 d -= L*ds; 2258 value(d) -= L*ds;
2243#ifdef Check_FLT_ROUNDS 2259#ifdef Check_FLT_ROUNDS
2244 /* If FLT_ROUNDS == 2, L will usually be high by 1 */ 2260 /* If FLT_ROUNDS == 2, L will usually be high by 1 */
2245 if (d < 0) { 2261 if (value(d) < 0) {
2246 L--; 2262 L--;
2247 d += ds; 2263 value(d) += ds;
2248 } 2264 }
2249#endif 2265#endif
2250 *s++ = '0' + (int)L; 2266 *s++ = '0' + (int)L;
2251 if (i == ilim) { 2267 if (i == ilim) {
2252 d += d; 2268 value(d) += value(d);
2253 if (d > ds || d == ds && L & 1) { 2269 if (value(d) > ds || value(d) == ds && L & 1) {
2254 bump_up: 2270 bump_up:
2255 while(*--s == '9') 2271 while(*--s == '9')
2256 if (s == s0) { 2272 if (s == s0) {
@@ -2262,7 +2278,7 @@ __dtoa
2262 } 2278 }
2263 break; 2279 break;
2264 } 2280 }
2265 if (!(d *= 10.)) 2281 if (!(value(d) *= 10.))
2266 break; 2282 break;
2267 } 2283 }
2268 goto ret1; 2284 goto ret1;