166 #ifdef WORDS_BIGENDIAN
167 #define IEEE_BIG_ENDIAN
169 #define IEEE_LITTLE_ENDIAN
174 #undef IEEE_BIG_ENDIAN
175 #undef IEEE_LITTLE_ENDIAN
178 #if defined(__arm__) && !defined(__VFP_FP__)
179 #define IEEE_BIG_ENDIAN
180 #undef IEEE_LITTLE_ENDIAN
188 #define ULong unsigned int
189 #elif SIZEOF_LONG == 4
190 #define Long long int
191 #define ULong unsigned long int
195 #define Llong LONG_LONG
202 #define Bug(x) {fprintf(stderr, "%s\n", (x)); exit(EXIT_FAILURE);}
213 extern void *
MALLOC(
size_t);
215 #define MALLOC xmalloc
218 extern void FREE(
void*);
223 #ifndef Omit_Private_Memory
225 #define PRIVATE_MEM 2304
227 #define PRIVATE_mem ((PRIVATE_MEM+sizeof(double)-1)/sizeof(double))
228 static double private_mem[
PRIVATE_mem], *pmem_next = private_mem;
232 #undef Avoid_Underflow
233 #ifdef IEEE_BIG_ENDIAN
236 #ifdef IEEE_LITTLE_ENDIAN
244 #define DBL_MAX_10_EXP 308
245 #define DBL_MAX_EXP 1024
251 #define DBL_MAX_10_EXP 75
252 #define DBL_MAX_EXP 63
254 #define DBL_MAX 7.2370055773322621e+75
259 #define DBL_MAX_10_EXP 38
260 #define DBL_MAX_EXP 127
262 #define DBL_MAX 1.7014118346046923e+38
266 #define LONG_MAX 2147483647
283 static const char hexdigits[] =
"0123456789abcdef0123456789ABCDEF";
286 #if defined(IEEE_LITTLE_ENDIAN) + defined(IEEE_BIG_ENDIAN) + defined(VAX) + defined(IBM) != 1
290 typedef union {
double d; ULong
L[2]; }
U;
295 # ifdef IEEE_LITTLE_ENDIAN
296 # define word0(x) (((ULong *)&(x))[1])
297 # define word1(x) (((ULong *)&(x))[0])
299 # define word0(x) (((ULong *)&(x))[0])
300 # define word1(x) (((ULong *)&(x))[1])
304 # ifdef IEEE_LITTLE_ENDIAN
305 # define word0(x) ((x).L[1])
306 # define word1(x) ((x).L[0])
308 # define word0(x) ((x).L[0])
309 # define word1(x) ((x).L[1])
311 # define dval(x) ((x).d)
318 #if defined(IEEE_LITTLE_ENDIAN) + defined(VAX) + defined(__arm__)
319 #define Storeinc(a,b,c) (((unsigned short *)(a))[1] = (unsigned short)(b), \
320 ((unsigned short *)(a))[0] = (unsigned short)(c), (a)++)
322 #define Storeinc(a,b,c) (((unsigned short *)(a))[0] = (unsigned short)(b), \
323 ((unsigned short *)(a))[1] = (unsigned short)(c), (a)++)
334 #define Exp_shift1 20
335 #define Exp_msk1 0x100000
336 #define Exp_msk11 0x100000
337 #define Exp_mask 0x7ff00000
341 #define Exp_1 0x3ff00000
342 #define Exp_11 0x3ff00000
344 #define Frac_mask 0xfffff
345 #define Frac_mask1 0xfffff
348 #define Bndry_mask 0xfffff
349 #define Bndry_mask1 0xfffff
351 #define Sign_bit 0x80000000
357 #ifndef NO_IEEE_Scale
358 #define Avoid_Underflow
360 #undef Sudden_Underflow
366 #define Flt_Rounds FLT_ROUNDS
372 #ifdef Honor_FLT_ROUNDS
373 #define Rounding rounding
374 #undef Check_FLT_ROUNDS
375 #define Check_FLT_ROUNDS
377 #define Rounding Flt_Rounds
381 #undef Check_FLT_ROUNDS
382 #undef Honor_FLT_ROUNDS
384 #undef Sudden_Underflow
385 #define Sudden_Underflow
390 #define Exp_shift1 24
391 #define Exp_msk1 0x1000000
392 #define Exp_msk11 0x1000000
393 #define Exp_mask 0x7f000000
396 #define Exp_1 0x41000000
397 #define Exp_11 0x41000000
399 #define Frac_mask 0xffffff
400 #define Frac_mask1 0xffffff
403 #define Bndry_mask 0xefffff
404 #define Bndry_mask1 0xffffff
406 #define Sign_bit 0x80000000
408 #define Tiny0 0x100000
417 #define Exp_msk1 0x80
418 #define Exp_msk11 0x800000
419 #define Exp_mask 0x7f80
422 #define Exp_1 0x40800000
423 #define Exp_11 0x4080
425 #define Frac_mask 0x7fffff
426 #define Frac_mask1 0xffff007f
429 #define Bndry_mask 0xffff007f
430 #define Bndry_mask1 0xffff007f
432 #define Sign_bit 0x8000
446 #define rounded_product(a,b) ((a) = rnd_prod((a), (b)))
447 #define rounded_quotient(a,b) ((a) = rnd_quot((a), (b)))
448 extern double rnd_prod(
double,
double), rnd_quot(
double,
double);
450 #define rounded_product(a,b) ((a) *= (b))
451 #define rounded_quotient(a,b) ((a) /= (b))
454 #define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))
455 #define Big1 0xffffffff
461 #define FFFFFFFF 0xffffffffUL
475 #define Llong long long
478 #define ULLong unsigned Llong
482 #define MULTIPLE_THREADS 1
484 #ifndef MULTIPLE_THREADS
485 #define ACQUIRE_DTOA_LOCK(n)
486 #define FREE_DTOA_LOCK(n)
488 #define ACQUIRE_DTOA_LOCK(n)
489 #define FREE_DTOA_LOCK(n)
509 #ifndef Omit_Private_Memory
514 if (
k <=
Kmax && (rv = freelist[
k]) != 0) {
515 freelist[
k] = rv->
next;
519 #ifdef Omit_Private_Memory
522 len = (
sizeof(
Bigint) + (
x-1)*
sizeof(ULong) +
sizeof(
double) - 1)
548 v->next = freelist[
v->k];
554 #define Bcopy(x,y) memcpy((char *)&(x)->sign, (char *)&(y)->sign, \
555 (y)->wds*sizeof(Long) + 2*sizeof(int))
558 multadd(
Bigint *b,
int m,
int a)
578 y = *
x * (ULLong)m + carry;
584 y = (xi & 0xffff) * m + carry;
585 z = (xi >> 16) * m + (y >> 16);
587 *
x++ = (z << 16) + (y & 0xffff);
602 b->
x[
wds++] = (ULong)carry;
609 s2b(
const char *s,
int nd0,
int nd, ULong y9)
616 for (
k = 0, y = 1;
x > y; y <<= 1,
k++) ;
623 b->
x[0] = y9 & 0xffff;
624 b->
wds = (b->
x[1] = y9 >> 16) ? 2 : 1;
631 b = multadd(b, 10, *s++ -
'0');
638 b = multadd(b, 10, *s++ -
'0');
643 hi0bits(
register ULong
x)
647 if (!(
x & 0xffff0000)) {
651 if (!(
x & 0xff000000)) {
655 if (!(
x & 0xf0000000)) {
659 if (!(
x & 0xc0000000)) {
663 if (!(
x & 0x80000000)) {
665 if (!(
x & 0x40000000))
675 register ULong
x = *y;
730 ULong *
x, *xa, *xae, *xb, *xbe, *xc, *xc0;
753 for (
x = c->
x, xa =
x + wc;
x < xa;
x++)
761 for (; xb < xbe; xc0++) {
762 if ((y = *xb++) != 0) {
767 z = *
x++ * (ULLong)y + *xc + carry;
776 for (; xb < xbe; xb++, xc0++) {
777 if ((y = *xb & 0xffff) != 0) {
782 z = (*
x & 0xffff) * y + (*xc & 0xffff) + carry;
784 z2 = (*
x++ >> 16) * y + (*xc >> 16) + carry;
790 if ((y = *xb >> 16) != 0) {
796 z = (*
x & 0xffff) * y + (*xc >> 16) + carry;
799 z2 = (*
x++ >> 16) * y + (*xc & 0xffff) + carry;
806 for (; xb < xbe; xc0++) {
812 z = *
x++ * y + *xc + carry;
821 for (xc0 = c->
x, xc = xc0 + wc; wc > 0 && !*--xc; --wc) ;
833 static int p05[3] = { 5, 25, 125 };
835 if ((
i =
k & 3) != 0)
836 b = multadd(b, p05[
i-1], 0);
842 #ifdef MULTIPLE_THREADS
862 if (!(p51 = p5->
next)) {
863 #ifdef MULTIPLE_THREADS
865 if (!(p51 = p5->
next)) {
866 p51 = p5->
next = mult(p5,p5);
871 p51 = p5->
next = mult(p5,p5);
885 ULong *
x, *x1, *xe, z;
898 for (
i = 0;
i <
n;
i++)
918 *x1++ = *
x <<
k & 0xffff | z;
937 ULong *xa, *xa0, *xb, *xb0;
943 if (
i > 1 && !a->
x[
i-1])
944 Bug(
"cmp called with a->x[a->wds-1] == 0");
945 if (j > 1 && !b->
x[j-1])
946 Bug(
"cmp called with b->x[b->wds-1] == 0");
956 return *xa < *xb ? -1 : 1;
969 ULong *xa, *xae, *xb, *xbe, *xc;
1006 y = (ULLong)*xa++ - *xb++ - borrow;
1007 borrow = y >> 32 & (ULong)1;
1012 borrow = y >> 32 & (ULong)1;
1018 y = (*xa & 0xffff) - (*xb & 0xffff) - borrow;
1019 borrow = (y & 0x10000) >> 16;
1020 z = (*xa++ >> 16) - (*xb++ >> 16) - borrow;
1021 borrow = (z & 0x10000) >> 16;
1025 y = (*xa & 0xffff) - borrow;
1026 borrow = (y & 0x10000) >> 16;
1027 z = (*xa++ >> 16) - borrow;
1028 borrow = (z & 0x10000) >> 16;
1033 y = *xa++ - *xb++ - borrow;
1034 borrow = (y & 0x10000) >> 16;
1039 borrow = (y & 0x10000) >> 16;
1058 #ifndef Avoid_Underflow
1059 #ifndef Sudden_Underflow
1068 #ifndef Avoid_Underflow
1069 #ifndef Sudden_Underflow
1080 word1(a) =
L >= 31 ? 1 : 1 << 31 -
L;
1091 ULong *xa, *xa0, w, y, z;
1105 if (!y) Bug(
"zero y in b2d");
1112 w = xa > xa0 ? *--xa : 0;
1116 z = xa > xa0 ? *--xa : 0;
1118 d0 =
Exp_1 | y << k | z >> (32 -
k);
1119 y = xa > xa0 ? *--xa : 0;
1120 d1 = z << k | y >> (32 -
k);
1128 z = xa > xa0 ? *--xa : 0;
1130 w = xa > xa0 ? *--xa : 0;
1131 y = xa > xa0 ? *--xa : 0;
1135 z = xa > xa0 ? *--xa : 0;
1136 w = xa > xa0 ? *--xa : 0;
1138 d0 =
Exp_1 | y << k + 16 | z << k | w >> 16 -
k;
1139 y = xa > xa0 ? *--xa : 0;
1140 d1 = w <<
k + 16 | y <<
k;
1154 d2b(
double d_,
int *e,
int *bits)
1160 #ifndef Sudden_Underflow
1184 #ifdef Sudden_Underflow
1194 if ((y =
d1) != 0) {
1195 if ((
k = lo0bits(&y)) != 0) {
1196 x[0] = y | z << (32 -
k);
1201 #ifndef Sudden_Underflow
1204 b->
wds = (
x[1] = z) ? 2 : 1;
1209 Bug(
"Zero passed to d2b");
1213 #ifndef Sudden_Underflow
1221 if (
k = lo0bits(&y))
1223 x[0] = y | z << 32 -
k & 0xffff;
1224 x[1] = z >>
k - 16 & 0xffff;
1230 x[1] = y >> 16 | z << 16 -
k & 0xffff;
1231 x[2] = z >>
k & 0xffff;
1246 Bug(
"Zero passed to d2b");
1264 #ifndef Sudden_Underflow
1268 *e = (de -
Bias - (
P-1) << 2) +
k;
1271 *e = de -
Bias - (
P-1) +
k;
1274 #ifndef Sudden_Underflow
1277 *e = de -
Bias - (
P-1) + 1 +
k;
1279 *bits = 32*
i - hi0bits(
x[
i-1]);
1281 *bits = (
i+2)*16 - hi0bits(
x[
i]);
1296 dval(da) = b2d(a, &ka);
1297 dval(db) = b2d(b, &kb);
1299 k = ka - kb + 32*(a->
wds - b->
wds);
1301 k = ka - kb + 16*(a->
wds - b->
wds);
1328 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9,
1329 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19,
1338 bigtens[] = { 1e16, 1e32, 1e64, 1e128, 1e256 };
1339 static const double tinytens[] = { 1e-16, 1e-32, 1e-64, 1e-128,
1340 #ifdef Avoid_Underflow
1341 9007199254740992.*9007199254740992.e-256
1349 #define Scale_Bit 0x10
1353 bigtens[] = { 1e16, 1e32, 1e64 };
1354 static const double tinytens[] = { 1e-16, 1e-32, 1e-64 };
1357 bigtens[] = { 1e16, 1e32 };
1358 static const double tinytens[] = { 1e-16, 1e-32 };
1370 #define NAN_WORD0 0x7ff80000
1378 match(
const char **sp,
char *t)
1381 const char *s = *sp;
1384 if ((c = *++s) >=
'A' && c <=
'Z')
1395 hexnan(
double *rvp,
const char **sp)
1399 int havedig, udx0, xshift;
1402 havedig = xshift = 0;
1405 while (c = *(
const unsigned char*)++s) {
1406 if (c >=
'0' && c <=
'9')
1408 else if (c >=
'a' && c <=
'f')
1410 else if (c >=
'A' && c <=
'F')
1412 else if (c <=
' ') {
1413 if (udx0 && havedig) {
1419 else if ( c ==
')' && havedig) {
1432 x[0] = (
x[0] << 4) | (
x[1] >> 28);
1433 x[1] = (
x[1] << 4) | c;
1435 if ((
x[0] &= 0xfffff) ||
x[1]) {
1447 #ifdef Avoid_Underflow
1450 int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, dsign,
1451 e, e1, esign,
i, j,
k, nd, nd0, nf, nz, nz0,
sign;
1452 const char *s, *s0, *s1;
1457 Bigint *bb, *bb1, *bd, *bd0, *bs, *delta;
1459 int inexact, oldinexact;
1461 #ifdef Honor_FLT_ROUNDS
1469 sign = nz0 = nz = 0;
1494 if (s[1] ==
'x' || s[1] ==
'X') {
1502 while (*++s ==
'0');
1507 adj += aadj * ((s1 -
hexdigit) & 15);
1523 adj += aadj * ((s1 -
hexdigit) & 15);
1524 if ((aadj /= 16) == 0.0) {
1534 if (*s ==
'P' || *s ==
'p') {
1535 dsign = 0x2C - *++s;
1536 if (
abs(dsign) == 1) s++;
1541 if (c <
'0' ||
'9' < c)
goto ret0;
1548 if (nd + dsign * nd0 > 2095) {
1549 while (
'0' <= c && c <=
'9') c = *++s;
1552 }
while (
'0' <= c && c <=
'9');
1556 if (dsign)
goto ret0;
1562 while (*++s ==
'0') ;
1568 for (nd = nf = 0; (c = *s) >=
'0' && c <=
'9'; nd++, s++)
1575 s1 = localeconv()->decimal_point;
1598 for (; c ==
'0'; c = *++s)
1600 if (c >
'0' && c <=
'9') {
1608 for (; c >=
'0' && c <=
'9'; c = *++s) {
1616 for (
i = 1;
i < nz;
i++)
1631 if (c ==
'e' || c ==
'E') {
1632 if (!nd && !nz && !nz0) {
1643 if (c >=
'0' && c <=
'9') {
1646 if (c >
'0' && c <=
'9') {
1649 while ((c = *++s) >=
'0' && c <=
'9')
1651 if (s - s1 > 8 ||
L > 19999)
1674 if (match(&s,
"nf")) {
1676 if (!match(&s,
"inity"))
1678 word0(rv) = 0x7ff00000;
1685 if (match(&s,
"an")) {
1686 word0(rv) = NAN_WORD0;
1687 word1(rv) = NAN_WORD1;
1716 oldinexact = get_inexact();
1720 bd0 = bb = bd = bs = delta = 0;
1722 #ifndef RND_PRODQUOT
1723 #ifndef Honor_FLT_ROUNDS
1733 goto vax_ovfl_check;
1735 #ifdef Honor_FLT_ROUNDS
1751 #ifdef Honor_FLT_ROUNDS
1759 dval(rv) *= tens[
i];
1777 #ifndef Inaccurate_Divide
1779 #ifdef Honor_FLT_ROUNDS
1797 oldinexact = get_inexact();
1799 #ifdef Avoid_Underflow
1802 #ifdef Honor_FLT_ROUNDS
1805 rounding = rounding == 2 ? 0 : 2;
1816 if ((
i = e1 & 15) != 0)
1817 dval(rv) *= tens[
i];
1826 #ifdef Honor_FLT_ROUNDS
1855 for (j = 0; e1 > 1; j++, e1 >>= 1)
1857 dval(rv) *= bigtens[j];
1860 dval(rv) *= bigtens[j];
1876 if ((
i = e1 & 15) != 0)
1877 dval(rv) /= tens[
i];
1881 #ifdef Avoid_Underflow
1884 for (j = 0; e1 > 0; j++, e1 >>= 1)
1886 dval(rv) *= tinytens[j];
1895 word0(rv) &= 0xffffffff << (j-32);
1898 word1(rv) &= 0xffffffff << j;
1901 for (j = 0; e1 > 1; j++, e1 >>= 1)
1903 dval(rv) *= tinytens[j];
1906 dval(rv) *= tinytens[j];
1909 dval(rv) *= tinytens[j];
1921 #ifndef Avoid_Underflow
1936 bd0 = s2b(s0, nd0, nd, y);
1939 bd = Balloc(bd0->
k);
1941 bb = d2b(
dval(rv), &bbe, &bbbits);
1957 #ifdef Honor_FLT_ROUNDS
1961 #ifdef Avoid_Underflow
1969 #ifdef Sudden_Underflow
1971 j = 1 + 4*
P - 3 - bbbits + ((bbe + bbbits - 1) & 3);
1986 #ifdef Avoid_Underflow
1989 i = bb2 < bd2 ? bb2 : bd2;
1998 bs = pow5mult(bs, bb5);
2004 bb = lshift(bb, bb2);
2006 bd = pow5mult(bd, bd5);
2008 bd = lshift(bd, bd2);
2010 bs = lshift(bs, bs2);
2011 delta = diff(bb, bd);
2012 dsign = delta->
sign;
2015 #ifdef Honor_FLT_ROUNDS
2016 if (rounding != 1) {
2019 if (!delta->
x[0] && delta->
wds <= 1) {
2037 #ifdef Avoid_Underflow
2043 delta = lshift(delta,
Log2P);
2044 if (cmp(delta, bs) <= 0)
2049 #ifdef Avoid_Underflow
2054 #ifdef Sudden_Underflow
2068 adj = ratio(delta, bs);
2071 if (adj <= 0x7ffffffe) {
2075 if (!((rounding>>1) ^ dsign))
2080 #ifdef Avoid_Underflow
2084 #ifdef Sudden_Underflow
2087 adj *= ulp(
dval(rv));
2097 adj *= ulp(
dval(rv));
2120 if (!delta->
x[0] && delta->
wds <= 1)
2125 if (!delta->
x[0] && delta->
wds <= 1) {
2132 delta = lshift(delta,
Log2P);
2133 if (cmp(delta, bs) > 0)
2144 ? (0xffffffff & (0xffffffff << (2*
P+1-(y>>
Exp_shift)))) :
2155 #ifdef Avoid_Underflow
2164 #ifdef Sudden_Underflow
2169 #ifdef Avoid_Underflow
2178 #ifdef Avoid_Underflow
2194 word1(rv) = 0xffffffff;
2201 #ifndef ROUND_BIASED
2207 #ifndef ROUND_BIASED
2210 #ifndef Sudden_Underflow
2215 #ifdef Avoid_Underflow
2221 if ((aadj = ratio(delta, bs)) <= 2.) {
2223 aadj =
dval(aadj1) = 1.;
2225 #ifndef Sudden_Underflow
2240 dval(aadj1) = -aadj;
2245 dval(aadj1) = dsign ? aadj : -aadj;
2246 #ifdef Check_FLT_ROUNDS
2281 #ifdef Avoid_Underflow
2283 if (aadj <= 0x7fffffff) {
2284 if ((z = (
int)aadj) <= 0)
2287 dval(aadj1) = dsign ? aadj : -aadj;
2294 #ifdef Sudden_Underflow
2339 #ifdef Avoid_Underflow
2348 if (aadj < .4999999 || aadj > .5000001)
2369 else if (!oldinexact)
2372 #ifdef Avoid_Underflow
2408 ULong *bx, *bxe, q, *sx, *sxe;
2410 ULLong borrow, carry, y, ys;
2412 ULong borrow, carry, y, ys;
2421 Bug(
"oversize b in quorem");
2429 q = *bxe / (*sxe + 1);
2432 Bug(
"oversized quotient in quorem");
2439 ys = *sx++ * (ULLong)q + carry;
2441 y = *bx - (ys &
FFFFFFFF) - borrow;
2442 borrow = y >> 32 & (ULong)1;
2447 ys = (si & 0xffff) * q + carry;
2448 zs = (si >> 16) * q + (ys >> 16);
2450 y = (*bx & 0xffff) - (ys & 0xffff) - borrow;
2451 borrow = (y & 0x10000) >> 16;
2452 z = (*bx >> 16) - (zs & 0xffff) - borrow;
2453 borrow = (z & 0x10000) >> 16;
2456 ys = *sx++ * q + carry;
2458 y = *bx - (ys & 0xffff) - borrow;
2459 borrow = (y & 0x10000) >> 16;
2463 }
while (sx <= sxe);
2466 while (--bxe > bx && !*bxe)
2471 if (cmp(b,
S) >= 0) {
2481 y = *bx - (ys &
FFFFFFFF) - borrow;
2482 borrow = y >> 32 & (ULong)1;
2487 ys = (si & 0xffff) + carry;
2488 zs = (si >> 16) + (ys >> 16);
2490 y = (*bx & 0xffff) - (ys & 0xffff) - borrow;
2491 borrow = (y & 0x10000) >> 16;
2492 z = (*bx >> 16) - (zs & 0xffff) - borrow;
2493 borrow = (z & 0x10000) >> 16;
2498 y = *bx - (ys & 0xffff) - borrow;
2499 borrow = (y & 0x10000) >> 16;
2503 }
while (sx <= sxe);
2507 while (--bxe > bx && !*bxe)
2515 #ifndef MULTIPLE_THREADS
2516 static char *dtoa_result;
2519 #ifndef MULTIPLE_THREADS
2526 #define rv_alloc(i) xmalloc(i)
2530 nrv_alloc(
const char *s,
char **rve,
size_t n)
2535 while ((*t = *s++) != 0) t++;
2541 #define rv_strdup(s, rve) nrv_alloc((s), (rve), strlen(s)+1)
2543 #ifndef MULTIPLE_THREADS
2557 static const char INFSTR[] =
"Infinity";
2558 static const char NANSTR[] =
"NaN";
2559 static const char ZEROSTR[] =
"0";
2596 dtoa(
double d_,
int mode,
int ndigits,
int *decpt,
int *
sign,
char **rve)
2632 int bbits, b2, b5, be, dig,
i, ieps, ilim, ilim0, ilim1,
2633 j,
j1,
k, k0, k_check, leftright, m2, m5,
s2, s5,
2634 spec_case, try_quick, half = 0;
2636 #ifndef Sudden_Underflow
2640 Bigint *b, *b1, *delta, *mlo = 0, *mhi = 0, *
S;
2644 #ifdef Honor_FLT_ROUNDS
2648 int inexact, oldinexact;
2653 #ifndef MULTIPLE_THREADS
2655 freedtoa(dtoa_result);
2668 #if defined(IEEE_Arith) + defined(VAX)
2672 if (
word0(d) == 0x8000)
2693 try_quick = oldinexact = get_inexact();
2696 #ifdef Honor_FLT_ROUNDS
2699 rounding = rounding == 2 ? 0 : 2;
2706 b = d2b(
dval(d), &be, &bbits);
2707 #ifdef Sudden_Underflow
2747 #ifndef Sudden_Underflow
2753 i = bbits + be + (
Bias + (
P-1) - 1);
2758 i -= (
Bias + (
P-1) - 1) + 1;
2762 ds = (
dval(d2)-1.5)*0.289529654602168 + 0.1760912590558 +
i*0.301029995663981;
2764 if (ds < 0. && ds !=
k)
2768 if (
dval(d) < tens[
k])
2791 if (mode < 0 || mode > 9)
2795 #ifdef Check_FLT_ROUNDS
2820 ilim = ilim1 =
i = ndigits;
2826 i = ndigits +
k + 1;
2834 #ifdef Honor_FLT_ROUNDS
2835 if (mode > 1 && rounding != 1)
2839 if (ilim >= 0 && ilim <=
Quick_max && try_quick) {
2857 for (; j; j >>= 1,
i++)
2864 else if ((
j1 = -
k) != 0) {
2865 dval(d) *= tens[
j1 & 0xf];
2866 for (j =
j1 >> 4; j; j >>= 1,
i++)
2869 dval(d) *= bigtens[
i];
2872 if (k_check &&
dval(d) < 1. && ilim > 0) {
2891 #ifndef No_leftright
2896 dval(eps) = 0.5/tens[ilim-1] -
dval(eps);
2900 *s++ =
'0' + (
int)
L;
2914 dval(eps) *= tens[ilim-1];
2915 for (
i = 1;;
i++,
dval(d) *= 10.) {
2916 L = (Long)(
dval(d));
2917 if (!(
dval(d) -=
L))
2919 *s++ =
'0' + (
int)
L;
2923 else if (
dval(d) < 0.5 -
dval(eps)) {
2924 while (*--s ==
'0') ;
2929 if ((*(s-1) -
'0') & 1) {
2935 #ifndef No_leftright
2950 if (ndigits < 0 && ilim <= 0) {
2952 if (ilim < 0 ||
dval(d) <= 5*ds)
2956 for (
i = 1;;
i++,
dval(d) *= 10.) {
2957 L = (Long)(
dval(d) / ds);
2959 #ifdef Check_FLT_ROUNDS
2966 *s++ =
'0' + (
int)
L;
2974 #ifdef Honor_FLT_ROUNDS
2978 case 2:
goto bump_up;
2982 if (
dval(d) > ds || (
dval(d) == ds && (
L & 1))) {
3002 #ifndef Sudden_Underflow
3003 denorm ? be + (
Bias + (
P-1) - 1 + 1) :
3006 1 + 4*
P - 3 - bbits + ((bbits + be - 1) & 3);
3014 if (m2 > 0 &&
s2 > 0) {
3015 i = m2 <
s2 ? m2 :
s2;
3023 mhi = pow5mult(mhi, m5);
3028 if ((j = b5 - m5) != 0)
3032 b = pow5mult(b, b5);
3036 S = pow5mult(
S, s5);
3041 if ((mode < 2 || leftright)
3042 #ifdef Honor_FLT_ROUNDS
3047 #ifndef Sudden_Underflow
3066 if ((
i = ((s5 ? 32 - hi0bits(
S->x[
S->wds-1]) : 1) +
s2) & 0x1f) != 0)
3069 if ((
i = ((s5 ? 32 - hi0bits(
S->x[
S->wds-1]) : 1) +
s2) & 0xf) != 0)
3091 b = multadd(b, 10, 0);
3093 mhi = multadd(mhi, 10, 0);
3097 if (ilim <= 0 && (mode == 3 || mode == 5)) {
3098 if (ilim < 0 || cmp(b,
S = multadd(
S,5,0)) <= 0) {
3111 mhi = lshift(mhi, m2);
3119 mhi = Balloc(mhi->k);
3121 mhi = lshift(mhi,
Log2P);
3125 dig = quorem(b,
S) +
'0';
3130 delta = diff(
S, mhi);
3131 j1 = delta->
sign ? 1 : cmp(b, delta);
3133 #ifndef ROUND_BIASED
3134 if (
j1 == 0 && mode != 1 && !(
word1(d) & 1)
3135 #ifdef Honor_FLT_ROUNDS
3144 else if (!b->
x[0] && b->
wds <= 1)
3151 if (j < 0 || (j == 0 && mode != 1
3152 #ifndef ROUND_BIASED
3156 if (!b->
x[0] && b->
wds <= 1) {
3162 #ifdef Honor_FLT_ROUNDS
3165 case 0:
goto accept_dig;
3166 case 2:
goto keep_dig;
3172 if ((
j1 > 0 || (
j1 == 0 && (dig & 1))) && dig++ ==
'9')
3180 #ifdef Honor_FLT_ROUNDS
3192 #ifdef Honor_FLT_ROUNDS
3198 b = multadd(b, 10, 0);
3200 mlo = mhi = multadd(mhi, 10, 0);
3202 mlo = multadd(mlo, 10, 0);
3203 mhi = multadd(mhi, 10, 0);
3209 *s++ = dig = quorem(b,
S) +
'0';
3210 if (!b->
x[0] && b->
wds <= 1) {
3218 b = multadd(b, 10, 0);
3223 #ifdef Honor_FLT_ROUNDS
3225 case 0:
goto trimzeros;
3226 case 2:
goto roundoff;
3231 if (j > 0 || (j == 0 && (dig & 1))) {
3239 if (!half || (*s -
'0') & 1)
3243 while (*--s ==
'0') ;
3249 if (mlo && mlo != mhi)
3262 else if (!oldinexact)
3299 #define DBL_MANH_SIZE 20
3300 #define DBL_MANL_SIZE 32
3301 #define DBL_ADJ (DBL_MAX_EXP - 2)
3302 #define SIGFIGS ((DBL_MANT_DIG + 3) / 4 + 1)
3303 #define dexp_get(u) ((int)(word0(u) >> Exp_shift) & ~Exp_msk1)
3304 #define dexp_set(u,v) (word0(u) = (((int)(word0(u)) & ~Exp_mask) | ((v) << Exp_shift)))
3305 #define dmanh_get(u) ((uint32_t)(word0(u) & Frac_mask))
3306 #define dmanl_get(u) ((uint32_t)word1(u))
3334 hdtoa(
double d,
const char *xdigs,
int ndigits,
int *decpt,
int *
sign,
char **rve)
3354 else if (
isnan(d)) {
3358 else if (d == 0.0) {
3366 u.
d *= 5.363123171977039e+154 ;
3377 bufsize = (ndigits > 0) ? ndigits :
SIGFIGS;
3381 if (
SIGFIGS > ndigits && ndigits > 0) {
3393 for (s = s0 + 1; s < s0 + bufsize; s++) {
3401 for (ndigits =
SIGFIGS; s0[ndigits - 1] ==
'0'; ndigits--)