summaryrefslogtreecommitdiff
path: root/src/lib/libc/stdlib/strtod.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libc/stdlib/strtod.c')
-rw-r--r--src/lib/libc/stdlib/strtod.c251
1 files changed, 140 insertions, 111 deletions
diff --git a/src/lib/libc/stdlib/strtod.c b/src/lib/libc/stdlib/strtod.c
index b13fa128f5..ce7ce9fe56 100644
--- a/src/lib/libc/stdlib/strtod.c
+++ b/src/lib/libc/stdlib/strtod.c
@@ -90,12 +90,13 @@
90 */ 90 */
91 91
92#if defined(LIBC_SCCS) && !defined(lint) 92#if defined(LIBC_SCCS) && !defined(lint)
93static char *rcsid = "$Id: strtod.c,v 1.1.1.1 1995/10/18 08:42:19 deraadt Exp $"; 93static char *rcsid = "$OpenBSD: strtod.c,v 1.15 2002/02/19 19:39:37 millert 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__) || \
97 defined(__mips__) || defined(__ns32k__) || defined(__alpha__) 97 defined(__mips__) || defined(__ns32k__) || defined(__alpha__) || \
98#include <machine/endian.h> 98 defined(__powerpc__) || defined(__m88k__) || defined(__hppa__)
99#include <sys/types.h>
99#if BYTE_ORDER == BIG_ENDIAN 100#if BYTE_ORDER == BIG_ENDIAN
100#define IEEE_BIG_ENDIAN 101#define IEEE_BIG_ENDIAN
101#else 102#else
@@ -103,7 +104,16 @@ static char *rcsid = "$Id: strtod.c,v 1.1.1.1 1995/10/18 08:42:19 deraadt Exp $"
103#endif 104#endif
104#endif 105#endif
105 106
106#ifdef vax 107#ifdef __arm32__
108/*
109 * Although the CPU is little endian the FP has different
110 * byte and word endianness. The byte order is still little endian
111 * but the word order is big endian.
112 */
113#define IEEE_BIG_ENDIAN
114#endif
115
116#ifdef __vax__
107#define VAX 117#define VAX
108#endif 118#endif
109 119
@@ -143,7 +153,6 @@ extern void *MALLOC(size_t);
143#include "errno.h" 153#include "errno.h"
144 154
145#ifdef Bad_float_h 155#ifdef Bad_float_h
146#undef __STDC__
147#ifdef IEEE_BIG_ENDIAN 156#ifdef IEEE_BIG_ENDIAN
148#define IEEE_ARITHMETIC 157#define IEEE_ARITHMETIC
149#endif 158#endif
@@ -212,19 +221,24 @@ Exactly one of IEEE_LITTLE_ENDIAN IEEE_BIG_ENDIAN, VAX, or
212IBM should be defined. 221IBM should be defined.
213#endif 222#endif
214 223
224typedef union {
225 double d;
226 ULong ul[2];
227} _double;
228#define value(x) ((x).d)
215#ifdef IEEE_LITTLE_ENDIAN 229#ifdef IEEE_LITTLE_ENDIAN
216#define word0(x) ((ULong *)&x)[1] 230#define word0(x) ((x).ul[1])
217#define word1(x) ((ULong *)&x)[0] 231#define word1(x) ((x).ul[0])
218#else 232#else
219#define word0(x) ((ULong *)&x)[0] 233#define word0(x) ((x).ul[0])
220#define word1(x) ((ULong *)&x)[1] 234#define word1(x) ((x).ul[1])
221#endif 235#endif
222 236
223/* The following definition of Storeinc is appropriate for MIPS processors. 237/* The following definition of Storeinc is appropriate for MIPS processors.
224 * An alternative that might be better on some machines is 238 * An alternative that might be better on some machines is
225 * #define Storeinc(a,b,c) (*a++ = b << 16 | c & 0xffff) 239 * #define Storeinc(a,b,c) (*a++ = b << 16 | c & 0xffff)
226 */ 240 */
227#if defined(IEEE_LITTLE_ENDIAN) + defined(VAX) 241#if defined(IEEE_LITTLE_ENDIAN) + defined(VAX) + defined(__arm32__)
228#define Storeinc(a,b,c) (((unsigned short *)a)[1] = (unsigned short)b, \ 242#define Storeinc(a,b,c) (((unsigned short *)a)[1] = (unsigned short)b, \
229((unsigned short *)a)[0] = (unsigned short)c, a++) 243((unsigned short *)a)[0] = (unsigned short)c, a++)
230#else 244#else
@@ -380,7 +394,7 @@ Balloc
380 int x; 394 int x;
381 Bigint *rv; 395 Bigint *rv;
382 396
383 if (rv = freelist[k]) { 397 if ((rv = freelist[k])) {
384 freelist[k] = rv->next; 398 freelist[k] = rv->next;
385 } 399 }
386 else { 400 else {
@@ -628,7 +642,7 @@ mult
628 xc0 = c->x; 642 xc0 = c->x;
629#ifdef Pack_32 643#ifdef Pack_32
630 for(; xb < xbe; xb++, xc0++) { 644 for(; xb < xbe; xb++, xc0++) {
631 if (y = *xb & 0xffff) { 645 if ((y = *xb & 0xffff)) {
632 x = xa; 646 x = xa;
633 xc = xc0; 647 xc = xc0;
634 carry = 0; 648 carry = 0;
@@ -642,7 +656,7 @@ mult
642 while(x < xae); 656 while(x < xae);
643 *xc = carry; 657 *xc = carry;
644 } 658 }
645 if (y = *xb >> 16) { 659 if ((y = *xb >> 16)) {
646 x = xa; 660 x = xa;
647 xc = xc0; 661 xc = xc0;
648 carry = 0; 662 carry = 0;
@@ -693,7 +707,7 @@ pow5mult
693 int i; 707 int i;
694 static int p05[3] = { 5, 25, 125 }; 708 static int p05[3] = { 5, 25, 125 };
695 709
696 if (i = k & 3) 710 if ((i = k & 3))
697 b = multadd(b, p05[i-1], 0); 711 b = multadd(b, p05[i-1], 0);
698 712
699 if (!(k >>= 2)) 713 if (!(k >>= 2))
@@ -756,7 +770,7 @@ lshift
756 z = *x++ >> k1; 770 z = *x++ >> k1;
757 } 771 }
758 while(x < xe); 772 while(x < xe);
759 if (*x1 = z) 773 if ((*x1 = z))
760 ++n1; 774 ++n1;
761 } 775 }
762#else 776#else
@@ -899,14 +913,16 @@ diff
899 static double 913 static double
900ulp 914ulp
901#ifdef KR_headers 915#ifdef KR_headers
902 (x) double x; 916 (_x) double _x;
903#else 917#else
904 (double x) 918 (double _x)
905#endif 919#endif
906{ 920{
921 _double x;
907 register Long L; 922 register Long L;
908 double a; 923 _double a;
909 924
925 value(x) = _x;
910 L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1; 926 L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1;
911#ifndef Sudden_Underflow 927#ifndef Sudden_Underflow
912 if (L > 0) { 928 if (L > 0) {
@@ -931,7 +947,7 @@ ulp
931 } 947 }
932 } 948 }
933#endif 949#endif
934 return a; 950 return value(a);
935 } 951 }
936 952
937 static double 953 static double
@@ -944,7 +960,7 @@ b2d
944{ 960{
945 ULong *xa, *xa0, w, y, z; 961 ULong *xa, *xa0, w, y, z;
946 int k; 962 int k;
947 double d; 963 _double d;
948#ifdef VAX 964#ifdef VAX
949 ULong d0, d1; 965 ULong d0, d1;
950#else 966#else
@@ -1001,22 +1017,27 @@ b2d
1001#undef d0 1017#undef d0
1002#undef d1 1018#undef d1
1003#endif 1019#endif
1004 return d; 1020 return value(d);
1005 } 1021 }
1006 1022
1007 static Bigint * 1023 static Bigint *
1008d2b 1024d2b
1009#ifdef KR_headers 1025#ifdef KR_headers
1010 (d, e, bits) double d; int *e, *bits; 1026 (_d, e, bits) double d; int *e, *bits;
1011#else 1027#else
1012 (double d, int *e, int *bits) 1028 (double _d, int *e, int *bits)
1013#endif 1029#endif
1014{ 1030{
1015 Bigint *b; 1031 Bigint *b;
1016 int de, i, k; 1032 int de, i, k;
1017 ULong *x, y, z; 1033 ULong *x, y, z;
1034 _double d;
1018#ifdef VAX 1035#ifdef VAX
1019 ULong d0, d1; 1036 ULong d0, d1;
1037#endif
1038
1039 value(d) = _d;
1040#ifdef VAX
1020 d0 = word0(d) >> 16 | word0(d) << 16; 1041 d0 = word0(d) >> 16 | word0(d) << 16;
1021 d1 = word1(d) >> 16 | word1(d) << 16; 1042 d1 = word1(d) >> 16 | word1(d) << 16;
1022#else 1043#else
@@ -1141,11 +1162,11 @@ ratio
1141 (Bigint *a, Bigint *b) 1162 (Bigint *a, Bigint *b)
1142#endif 1163#endif
1143{ 1164{
1144 double da, db; 1165 _double da, db;
1145 int k, ka, kb; 1166 int k, ka, kb;
1146 1167
1147 da = b2d(a, &ka); 1168 value(da) = b2d(a, &ka);
1148 db = b2d(b, &kb); 1169 value(db) = b2d(b, &kb);
1149#ifdef Pack_32 1170#ifdef Pack_32
1150 k = ka - kb + 32*(a->wds - b->wds); 1171 k = ka - kb + 32*(a->wds - b->wds);
1151#else 1172#else
@@ -1171,7 +1192,7 @@ ratio
1171 word0(db) += k*Exp_msk1; 1192 word0(db) += k*Exp_msk1;
1172 } 1193 }
1173#endif 1194#endif
1174 return da / db; 1195 return value(da) / value(db);
1175 } 1196 }
1176 1197
1177static CONST double 1198static CONST double
@@ -1211,7 +1232,8 @@ strtod
1211 int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, dsign, 1232 int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, dsign,
1212 e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign; 1233 e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign;
1213 CONST char *s, *s0, *s1; 1234 CONST char *s, *s0, *s1;
1214 double aadj, aadj1, adj, rv, rv0; 1235 double aadj, aadj1, adj;
1236 _double rv, rv0;
1215 Long L; 1237 Long L;
1216 ULong y, z; 1238 ULong y, z;
1217 Bigint *bb, *bb1, *bd, *bd0, *bs, *delta; 1239 Bigint *bb, *bb1, *bd, *bd0, *bs, *delta;
@@ -1223,10 +1245,10 @@ strtod
1223#endif 1245#endif
1224 1246
1225 sign = nz0 = nz = 0; 1247 sign = nz0 = nz = 0;
1226 rv = 0.; 1248 value(rv) = 0.;
1227 1249
1228 1250
1229 for(s = s00; isspace(*s); s++) 1251 for(s = s00; isspace((unsigned char) *s); s++)
1230 ; 1252 ;
1231 1253
1232 if (*s == '-') { 1254 if (*s == '-') {
@@ -1340,9 +1362,9 @@ strtod
1340 if (!nd0) 1362 if (!nd0)
1341 nd0 = nd; 1363 nd0 = nd;
1342 k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1; 1364 k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1;
1343 rv = y; 1365 value(rv) = y;
1344 if (k > 9) 1366 if (k > 9)
1345 rv = tens[k - 9] * rv + z; 1367 value(rv) = tens[k - 9] * value(rv) + z;
1346 bd0 = 0; 1368 bd0 = 0;
1347 if (nd <= DBL_DIG 1369 if (nd <= DBL_DIG
1348#ifndef RND_PRODQUOT 1370#ifndef RND_PRODQUOT
@@ -1356,7 +1378,8 @@ strtod
1356#ifdef VAX 1378#ifdef VAX
1357 goto vax_ovfl_check; 1379 goto vax_ovfl_check;
1358#else 1380#else
1359 /* rv = */ rounded_product(rv, tens[e]); 1381 /* value(rv) = */ rounded_product(value(rv),
1382 tens[e]);
1360 goto ret; 1383 goto ret;
1361#endif 1384#endif
1362 } 1385 }
@@ -1366,27 +1389,30 @@ strtod
1366 * this for larger i values. 1389 * this for larger i values.
1367 */ 1390 */
1368 e -= i; 1391 e -= i;
1369 rv *= tens[i]; 1392 value(rv) *= tens[i];
1370#ifdef VAX 1393#ifdef VAX
1371 /* VAX exponent range is so narrow we must 1394 /* VAX exponent range is so narrow we must
1372 * worry about overflow here... 1395 * worry about overflow here...
1373 */ 1396 */
1374 vax_ovfl_check: 1397 vax_ovfl_check:
1375 word0(rv) -= P*Exp_msk1; 1398 word0(rv) -= P*Exp_msk1;
1376 /* rv = */ rounded_product(rv, tens[e]); 1399 /* value(rv) = */ rounded_product(value(rv),
1400 tens[e]);
1377 if ((word0(rv) & Exp_mask) 1401 if ((word0(rv) & Exp_mask)
1378 > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) 1402 > Exp_msk1*(DBL_MAX_EXP+Bias-1-P))
1379 goto ovfl; 1403 goto ovfl;
1380 word0(rv) += P*Exp_msk1; 1404 word0(rv) += P*Exp_msk1;
1381#else 1405#else
1382 /* rv = */ rounded_product(rv, tens[e]); 1406 /* value(rv) = */ rounded_product(value(rv),
1407 tens[e]);
1383#endif 1408#endif
1384 goto ret; 1409 goto ret;
1385 } 1410 }
1386 } 1411 }
1387#ifndef Inaccurate_Divide 1412#ifndef Inaccurate_Divide
1388 else if (e >= -Ten_pmax) { 1413 else if (e >= -Ten_pmax) {
1389 /* rv = */ rounded_quotient(rv, tens[-e]); 1414 /* value(rv) = */ rounded_quotient(value(rv),
1415 tens[-e]);
1390 goto ret; 1416 goto ret;
1391 } 1417 }
1392#endif 1418#endif
@@ -1397,13 +1423,13 @@ strtod
1397 1423
1398 if (e1 > 0) { 1424 if (e1 > 0) {
1399 if (i = e1 & 15) 1425 if (i = e1 & 15)
1400 rv *= tens[i]; 1426 value(rv) *= tens[i];
1401 if (e1 &= ~15) { 1427 if (e1 &= ~15) {
1402 if (e1 > DBL_MAX_10_EXP) { 1428 if (e1 > DBL_MAX_10_EXP) {
1403 ovfl: 1429 ovfl:
1404 errno = ERANGE; 1430 errno = ERANGE;
1405#ifdef __STDC__ 1431#ifndef Bad_float_h
1406 rv = HUGE_VAL; 1432 value(rv) = HUGE_VAL;
1407#else 1433#else
1408 /* Can't trust HUGE_VAL */ 1434 /* Can't trust HUGE_VAL */
1409#ifdef IEEE_Arith 1435#ifdef IEEE_Arith
@@ -1421,10 +1447,10 @@ strtod
1421 if (e1 >>= 4) { 1447 if (e1 >>= 4) {
1422 for(j = 0; e1 > 1; j++, e1 >>= 1) 1448 for(j = 0; e1 > 1; j++, e1 >>= 1)
1423 if (e1 & 1) 1449 if (e1 & 1)
1424 rv *= bigtens[j]; 1450 value(rv) *= bigtens[j];
1425 /* The last multiplication could overflow. */ 1451 /* The last multiplication could overflow. */
1426 word0(rv) -= P*Exp_msk1; 1452 word0(rv) -= P*Exp_msk1;
1427 rv *= bigtens[j]; 1453 value(rv) *= bigtens[j];
1428 if ((z = word0(rv) & Exp_mask) 1454 if ((z = word0(rv) & Exp_mask)
1429 > Exp_msk1*(DBL_MAX_EXP+Bias-P)) 1455 > Exp_msk1*(DBL_MAX_EXP+Bias-P))
1430 goto ovfl; 1456 goto ovfl;
@@ -1443,23 +1469,23 @@ strtod
1443 else if (e1 < 0) { 1469 else if (e1 < 0) {
1444 e1 = -e1; 1470 e1 = -e1;
1445 if (i = e1 & 15) 1471 if (i = e1 & 15)
1446 rv /= tens[i]; 1472 value(rv) /= tens[i];
1447 if (e1 &= ~15) { 1473 if (e1 &= ~15) {
1448 e1 >>= 4; 1474 e1 >>= 4;
1449 if (e1 >= 1 << n_bigtens) 1475 if (e1 >= 1 << n_bigtens)
1450 goto undfl; 1476 goto undfl;
1451 for(j = 0; e1 > 1; j++, e1 >>= 1) 1477 for(j = 0; e1 > 1; j++, e1 >>= 1)
1452 if (e1 & 1) 1478 if (e1 & 1)
1453 rv *= tinytens[j]; 1479 value(rv) *= tinytens[j];
1454 /* The last multiplication could underflow. */ 1480 /* The last multiplication could underflow. */
1455 rv0 = rv; 1481 value(rv0) = value(rv);
1456 rv *= tinytens[j]; 1482 value(rv) *= tinytens[j];
1457 if (!rv) { 1483 if (!value(rv)) {
1458 rv = 2.*rv0; 1484 value(rv) = 2.*value(rv0);
1459 rv *= tinytens[j]; 1485 value(rv) *= tinytens[j];
1460 if (!rv) { 1486 if (!value(rv)) {
1461 undfl: 1487 undfl:
1462 rv = 0.; 1488 value(rv) = 0.;
1463 errno = ERANGE; 1489 errno = ERANGE;
1464 if (bd0) 1490 if (bd0)
1465 goto retfree; 1491 goto retfree;
@@ -1483,7 +1509,7 @@ strtod
1483 for(;;) { 1509 for(;;) {
1484 bd = Balloc(bd0->k); 1510 bd = Balloc(bd0->k);
1485 Bcopy(bd, bd0); 1511 Bcopy(bd, bd0);
1486 bb = d2b(rv, &bbe, &bbbits); /* rv = bb * 2^bbe */ 1512 bb = d2b(value(rv), &bbe, &bbbits); /* rv = bb * 2^bbe */
1487 bs = i2b(1); 1513 bs = i2b(1);
1488 1514
1489 if (e >= 0) { 1515 if (e >= 0) {
@@ -1595,12 +1621,12 @@ strtod
1595 break; 1621 break;
1596#endif 1622#endif
1597 if (dsign) 1623 if (dsign)
1598 rv += ulp(rv); 1624 value(rv) += ulp(value(rv));
1599#ifndef ROUND_BIASED 1625#ifndef ROUND_BIASED
1600 else { 1626 else {
1601 rv -= ulp(rv); 1627 value(rv) -= ulp(value(rv));
1602#ifndef Sudden_Underflow 1628#ifndef Sudden_Underflow
1603 if (!rv) 1629 if (!value(rv))
1604 goto undfl; 1630 goto undfl;
1605#endif 1631#endif
1606 } 1632 }
@@ -1651,10 +1677,10 @@ strtod
1651 /* Check for overflow */ 1677 /* Check for overflow */
1652 1678
1653 if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) { 1679 if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) {
1654 rv0 = rv; 1680 value(rv0) = value(rv);
1655 word0(rv) -= P*Exp_msk1; 1681 word0(rv) -= P*Exp_msk1;
1656 adj = aadj1 * ulp(rv); 1682 adj = aadj1 * ulp(value(rv));
1657 rv += adj; 1683 value(rv) += adj;
1658 if ((word0(rv) & Exp_mask) >= 1684 if ((word0(rv) & Exp_mask) >=
1659 Exp_msk1*(DBL_MAX_EXP+Bias-P)) { 1685 Exp_msk1*(DBL_MAX_EXP+Bias-P)) {
1660 if (word0(rv0) == Big0 && word1(rv0) == Big1) 1686 if (word0(rv0) == Big0 && word1(rv0) == Big1)
@@ -1669,10 +1695,10 @@ strtod
1669 else { 1695 else {
1670#ifdef Sudden_Underflow 1696#ifdef Sudden_Underflow
1671 if ((word0(rv) & Exp_mask) <= P*Exp_msk1) { 1697 if ((word0(rv) & Exp_mask) <= P*Exp_msk1) {
1672 rv0 = rv; 1698 value(rv0) = value(rv);
1673 word0(rv) += P*Exp_msk1; 1699 word0(rv) += P*Exp_msk1;
1674 adj = aadj1 * ulp(rv); 1700 adj = aadj1 * ulp(value(rv));
1675 rv += adj; 1701 value(rv) += adj;
1676#ifdef IBM 1702#ifdef IBM
1677 if ((word0(rv) & Exp_mask) < P*Exp_msk1) 1703 if ((word0(rv) & Exp_mask) < P*Exp_msk1)
1678#else 1704#else
@@ -1690,8 +1716,8 @@ strtod
1690 word0(rv) -= P*Exp_msk1; 1716 word0(rv) -= P*Exp_msk1;
1691 } 1717 }
1692 else { 1718 else {
1693 adj = aadj1 * ulp(rv); 1719 adj = aadj1 * ulp(value(rv));
1694 rv += adj; 1720 value(rv) += adj;
1695 } 1721 }
1696#else 1722#else
1697 /* Compute adj so that the IEEE rounding rules will 1723 /* Compute adj so that the IEEE rounding rules will
@@ -1706,8 +1732,8 @@ strtod
1706 if (!dsign) 1732 if (!dsign)
1707 aadj1 = -aadj1; 1733 aadj1 = -aadj1;
1708 } 1734 }
1709 adj = aadj1 * ulp(rv); 1735 adj = aadj1 * ulp(value(rv));
1710 rv += adj; 1736 value(rv) += adj;
1711#endif 1737#endif
1712 } 1738 }
1713 z = word0(rv) & Exp_mask; 1739 z = word0(rv) & Exp_mask;
@@ -1738,7 +1764,7 @@ strtod
1738 ret: 1764 ret:
1739 if (se) 1765 if (se)
1740 *se = (char *)s; 1766 *se = (char *)s;
1741 return sign ? -rv : rv; 1767 return sign ? -value(rv) : value(rv);
1742 } 1768 }
1743 1769
1744 static int 1770 static int
@@ -1884,10 +1910,10 @@ quorem
1884 char * 1910 char *
1885__dtoa 1911__dtoa
1886#ifdef KR_headers 1912#ifdef KR_headers
1887 (d, mode, ndigits, decpt, sign, rve) 1913 (_d, mode, ndigits, decpt, sign, rve)
1888 double d; int mode, ndigits, *decpt, *sign; char **rve; 1914 double _d; int mode, ndigits, *decpt, *sign; char **rve;
1889#else 1915#else
1890 (double d, int mode, int ndigits, int *decpt, int *sign, char **rve) 1916 (double _d, int mode, int ndigits, int *decpt, int *sign, char **rve)
1891#endif 1917#endif
1892{ 1918{
1893 /* Arguments ndigits, decpt, sign are similar to those 1919 /* Arguments ndigits, decpt, sign are similar to those
@@ -1933,11 +1959,13 @@ __dtoa
1933 ULong x; 1959 ULong x;
1934#endif 1960#endif
1935 Bigint *b, *b1, *delta, *mlo, *mhi, *S; 1961 Bigint *b, *b1, *delta, *mlo, *mhi, *S;
1936 double d2, ds, eps; 1962 double ds;
1937 char *s, *s0; 1963 char *s, *s0;
1938 static Bigint *result; 1964 static Bigint *result;
1939 static int result_k; 1965 static int result_k;
1966 _double d, d2, eps;
1940 1967
1968 value(d) = _d;
1941 if (result) { 1969 if (result) {
1942 result->k = result_k; 1970 result->k = result_k;
1943 result->maxwds = 1 << result_k; 1971 result->maxwds = 1 << result_k;
@@ -1977,9 +2005,9 @@ __dtoa
1977 } 2005 }
1978#endif 2006#endif
1979#ifdef IBM 2007#ifdef IBM
1980 d += 0; /* normalize */ 2008 value(d) += 0; /* normalize */
1981#endif 2009#endif
1982 if (!d) { 2010 if (!value(d)) {
1983 *decpt = 1; 2011 *decpt = 1;
1984 s = "0"; 2012 s = "0";
1985 if (rve) 2013 if (rve)
@@ -1987,18 +2015,18 @@ __dtoa
1987 return s; 2015 return s;
1988 } 2016 }
1989 2017
1990 b = d2b(d, &be, &bbits); 2018 b = d2b(value(d), &be, &bbits);
1991#ifdef Sudden_Underflow 2019#ifdef Sudden_Underflow
1992 i = (int)(word0(d) >> Exp_shift1 & (Exp_mask>>Exp_shift1)); 2020 i = (int)(word0(d) >> Exp_shift1 & (Exp_mask>>Exp_shift1));
1993#else 2021#else
1994 if (i = (int)(word0(d) >> Exp_shift1 & (Exp_mask>>Exp_shift1))) { 2022 if (i = (int)(word0(d) >> Exp_shift1 & (Exp_mask>>Exp_shift1))) {
1995#endif 2023#endif
1996 d2 = d; 2024 value(d2) = value(d);
1997 word0(d2) &= Frac_mask1; 2025 word0(d2) &= Frac_mask1;
1998 word0(d2) |= Exp_11; 2026 word0(d2) |= Exp_11;
1999#ifdef IBM 2027#ifdef IBM
2000 if (j = 11 - hi0bits(word0(d2) & Frac_mask)) 2028 if (j = 11 - hi0bits(word0(d2) & Frac_mask))
2001 d2 /= 1 << j; 2029 value(d2) /= 1 << j;
2002#endif 2030#endif
2003 2031
2004 /* log(x) ~=~ log(1.5) + (x-1.5)/1.5 2032 /* log(x) ~=~ log(1.5) + (x-1.5)/1.5
@@ -2037,19 +2065,20 @@ __dtoa
2037 i = bbits + be + (Bias + (P-1) - 1); 2065 i = bbits + be + (Bias + (P-1) - 1);
2038 x = i > 32 ? word0(d) << 64 - i | word1(d) >> i - 32 2066 x = i > 32 ? word0(d) << 64 - i | word1(d) >> i - 32
2039 : word1(d) << 32 - i; 2067 : word1(d) << 32 - i;
2040 d2 = x; 2068 value(d2) = x;
2041 word0(d2) -= 31*Exp_msk1; /* adjust exponent */ 2069 word0(d2) -= 31*Exp_msk1; /* adjust exponent */
2042 i -= (Bias + (P-1) - 1) + 1; 2070 i -= (Bias + (P-1) - 1) + 1;
2043 denorm = 1; 2071 denorm = 1;
2044 } 2072 }
2045#endif 2073#endif
2046 ds = (d2-1.5)*0.289529654602168 + 0.1760912590558 + i*0.301029995663981; 2074 ds = (value(d2)-1.5)*0.289529654602168 + 0.1760912590558 +
2075 i*0.301029995663981;
2047 k = (int)ds; 2076 k = (int)ds;
2048 if (ds < 0. && ds != k) 2077 if (ds < 0. && ds != k)
2049 k--; /* want k = floor(ds) */ 2078 k--; /* want k = floor(ds) */
2050 k_check = 1; 2079 k_check = 1;
2051 if (k >= 0 && k <= Ten_pmax) { 2080 if (k >= 0 && k <= Ten_pmax) {
2052 if (d < tens[k]) 2081 if (value(d) < tens[k])
2053 k--; 2082 k--;
2054 k_check = 0; 2083 k_check = 0;
2055 } 2084 }
@@ -2116,7 +2145,7 @@ __dtoa
2116 /* Try to get by with floating-point arithmetic. */ 2145 /* Try to get by with floating-point arithmetic. */
2117 2146
2118 i = 0; 2147 i = 0;
2119 d2 = d; 2148 value(d2) = value(d);
2120 k0 = k; 2149 k0 = k;
2121 ilim0 = ilim; 2150 ilim0 = ilim;
2122 ieps = 2; /* conservative */ 2151 ieps = 2; /* conservative */
@@ -2126,7 +2155,7 @@ __dtoa
2126 if (j & Bletch) { 2155 if (j & Bletch) {
2127 /* prevent overflows */ 2156 /* prevent overflows */
2128 j &= Bletch - 1; 2157 j &= Bletch - 1;
2129 d /= bigtens[n_bigtens-1]; 2158 value(d) /= bigtens[n_bigtens-1];
2130 ieps++; 2159 ieps++;
2131 } 2160 }
2132 for(; j; j >>= 1, i++) 2161 for(; j; j >>= 1, i++)
@@ -2134,32 +2163,32 @@ __dtoa
2134 ieps++; 2163 ieps++;
2135 ds *= bigtens[i]; 2164 ds *= bigtens[i];
2136 } 2165 }
2137 d /= ds; 2166 value(d) /= ds;
2138 } 2167 }
2139 else if (j1 = -k) { 2168 else if (j1 = -k) {
2140 d *= tens[j1 & 0xf]; 2169 value(d) *= tens[j1 & 0xf];
2141 for(j = j1 >> 4; j; j >>= 1, i++) 2170 for(j = j1 >> 4; j; j >>= 1, i++)
2142 if (j & 1) { 2171 if (j & 1) {
2143 ieps++; 2172 ieps++;
2144 d *= bigtens[i]; 2173 value(d) *= bigtens[i];
2145 } 2174 }
2146 } 2175 }
2147 if (k_check && d < 1. && ilim > 0) { 2176 if (k_check && value(d) < 1. && ilim > 0) {
2148 if (ilim1 <= 0) 2177 if (ilim1 <= 0)
2149 goto fast_failed; 2178 goto fast_failed;
2150 ilim = ilim1; 2179 ilim = ilim1;
2151 k--; 2180 k--;
2152 d *= 10.; 2181 value(d) *= 10.;
2153 ieps++; 2182 ieps++;
2154 } 2183 }
2155 eps = ieps*d + 7.; 2184 value(eps) = ieps*value(d) + 7.;
2156 word0(eps) -= (P-1)*Exp_msk1; 2185 word0(eps) -= (P-1)*Exp_msk1;
2157 if (ilim == 0) { 2186 if (ilim == 0) {
2158 S = mhi = 0; 2187 S = mhi = 0;
2159 d -= 5.; 2188 value(d) -= 5.;
2160 if (d > eps) 2189 if (value(d) > value(eps))
2161 goto one_digit; 2190 goto one_digit;
2162 if (d < -eps) 2191 if (value(d) < -value(eps))
2163 goto no_digits; 2192 goto no_digits;
2164 goto fast_failed; 2193 goto fast_failed;
2165 } 2194 }
@@ -2168,33 +2197,33 @@ __dtoa
2168 /* Use Steele & White method of only 2197 /* Use Steele & White method of only
2169 * generating digits needed. 2198 * generating digits needed.
2170 */ 2199 */
2171 eps = 0.5/tens[ilim-1] - eps; 2200 value(eps) = 0.5/tens[ilim-1] - value(eps);
2172 for(i = 0;;) { 2201 for(i = 0;;) {
2173 L = d; 2202 L = value(d);
2174 d -= L; 2203 value(d) -= L;
2175 *s++ = '0' + (int)L; 2204 *s++ = '0' + (int)L;
2176 if (d < eps) 2205 if (value(d) < value(eps))
2177 goto ret1; 2206 goto ret1;
2178 if (1. - d < eps) 2207 if (1. - value(d) < value(eps))
2179 goto bump_up; 2208 goto bump_up;
2180 if (++i >= ilim) 2209 if (++i >= ilim)
2181 break; 2210 break;
2182 eps *= 10.; 2211 value(eps) *= 10.;
2183 d *= 10.; 2212 value(d) *= 10.;
2184 } 2213 }
2185 } 2214 }
2186 else { 2215 else {
2187#endif 2216#endif
2188 /* Generate ilim digits, then fix them up. */ 2217 /* Generate ilim digits, then fix them up. */
2189 eps *= tens[ilim-1]; 2218 value(eps) *= tens[ilim-1];
2190 for(i = 1;; i++, d *= 10.) { 2219 for(i = 1;; i++, value(d) *= 10.) {
2191 L = d; 2220 L = value(d);
2192 d -= L; 2221 value(d) -= L;
2193 *s++ = '0' + (int)L; 2222 *s++ = '0' + (int)L;
2194 if (i == ilim) { 2223 if (i == ilim) {
2195 if (d > 0.5 + eps) 2224 if (value(d) > 0.5 + value(eps))
2196 goto bump_up; 2225 goto bump_up;
2197 else if (d < 0.5 - eps) { 2226 else if (value(d) < 0.5 - value(eps)) {
2198 while(*--s == '0'); 2227 while(*--s == '0');
2199 s++; 2228 s++;
2200 goto ret1; 2229 goto ret1;
@@ -2207,7 +2236,7 @@ __dtoa
2207#endif 2236#endif
2208 fast_failed: 2237 fast_failed:
2209 s = s0; 2238 s = s0;
2210 d = d2; 2239 value(d) = value(d2);
2211 k = k0; 2240 k = k0;
2212 ilim = ilim0; 2241 ilim = ilim0;
2213 } 2242 }
@@ -2219,24 +2248,24 @@ __dtoa
2219 ds = tens[k]; 2248 ds = tens[k];
2220 if (ndigits < 0 && ilim <= 0) { 2249 if (ndigits < 0 && ilim <= 0) {
2221 S = mhi = 0; 2250 S = mhi = 0;
2222 if (ilim < 0 || d <= 5*ds) 2251 if (ilim < 0 || value(d) <= 5*ds)
2223 goto no_digits; 2252 goto no_digits;
2224 goto one_digit; 2253 goto one_digit;
2225 } 2254 }
2226 for(i = 1;; i++) { 2255 for(i = 1;; i++) {
2227 L = d / ds; 2256 L = value(d) / ds;
2228 d -= L*ds; 2257 value(d) -= L*ds;
2229#ifdef Check_FLT_ROUNDS 2258#ifdef Check_FLT_ROUNDS
2230 /* If FLT_ROUNDS == 2, L will usually be high by 1 */ 2259 /* If FLT_ROUNDS == 2, L will usually be high by 1 */
2231 if (d < 0) { 2260 if (value(d) < 0) {
2232 L--; 2261 L--;
2233 d += ds; 2262 value(d) += ds;
2234 } 2263 }
2235#endif 2264#endif
2236 *s++ = '0' + (int)L; 2265 *s++ = '0' + (int)L;
2237 if (i == ilim) { 2266 if (i == ilim) {
2238 d += d; 2267 value(d) += value(d);
2239 if (d > ds || d == ds && L & 1) { 2268 if (value(d) > ds || value(d) == ds && L & 1) {
2240 bump_up: 2269 bump_up:
2241 while(*--s == '9') 2270 while(*--s == '9')
2242 if (s == s0) { 2271 if (s == s0) {
@@ -2248,7 +2277,7 @@ __dtoa
2248 } 2277 }
2249 break; 2278 break;
2250 } 2279 }
2251 if (!(d *= 10.)) 2280 if (!(value(d) *= 10.))
2252 break; 2281 break;
2253 } 2282 }
2254 goto ret1; 2283 goto ret1;