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