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
191#define ULong unsigned long int
195#define Llong LONG_LONG
202#define Bug(x) {fprintf(stderr, "%s\n", (x)); exit(EXIT_FAILURE);}
213extern void *
MALLOC(
size_t);
215#define MALLOC xmalloc
218extern void FREE(
void*);
223#ifndef Omit_Private_Memory
225#define PRIVATE_MEM 2304
227#define PRIVATE_mem ((PRIVATE_MEM+sizeof(double)-1)/sizeof(double))
228static 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
283static const char hexdigits[] =
"0123456789abcdef0123456789ABCDEF";
286#if defined(IEEE_LITTLE_ENDIAN) + defined(IEEE_BIG_ENDIAN) + defined(VAX) + defined(IBM) != 1
290typedef 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)++)
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
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
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
418#define Exp_msk11 0x800000
419#define Exp_mask 0x7f80
422#define Exp_1 0x40800000
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)))
448extern 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))
558multadd(
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;
609s2b(
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');
643hi0bits(
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;
1154d2b(
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,
1338bigtens[] = { 1e16, 1e32, 1e64, 1e128, 1e256 };
1339static 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
1353bigtens[] = { 1e16, 1e32, 1e64 };
1354static const double tinytens[] = { 1e-16, 1e-32, 1e-64 };
1357bigtens[] = { 1e16, 1e32 };
1358static const double tinytens[] = { 1e-16, 1e-32 };
1370#define NAN_WORD0 0x7ff80000
1378match(
const char **sp,
char *t)
1381 const char *s = *sp;
1384 if ((c = *++s) >=
'A' && c <=
'Z')
1395hexnan(
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');
1508 adj += aadj * ((s1 -
hexdigit) & 15);
1524 adj += aadj * ((s1 -
hexdigit) & 15);
1525 if ((aadj /= 16) == 0.0) {
1535 if (*s ==
'P' || *s ==
'p') {
1536 dsign = 0x2C - *++s;
1537 if (
abs(dsign) == 1) s++;
1542 if (c <
'0' ||
'9' < c)
goto ret0;
1549 if (nd + dsign * nd0 > 2095) {
1550 while (
'0' <= c && c <=
'9') c = *++s;
1553 }
while (
'0' <= c && c <=
'9');
1557 if (dsign)
goto ret0;
1563 while (*++s ==
'0') ;
1569 for (nd = nf = 0; (c = *s) >=
'0' && c <=
'9'; nd++, s++)
1576 s1 = localeconv()->decimal_point;
1599 for (; c ==
'0'; c = *++s)
1601 if (c >
'0' && c <=
'9') {
1609 for (; c >=
'0' && c <=
'9'; c = *++s) {
1617 for (
i = 1;
i < nz;
i++)
1632 if (c ==
'e' || c ==
'E') {
1633 if (!nd && !nz && !nz0) {
1644 if (c >=
'0' && c <=
'9') {
1647 if (c >
'0' && c <=
'9') {
1650 while ((c = *++s) >=
'0' && c <=
'9')
1652 if (s - s1 > 8 ||
L > 19999)
1675 if (match(&s,
"nf")) {
1677 if (!match(&s,
"inity"))
1679 word0(rv) = 0x7ff00000;
1686 if (match(&s,
"an")) {
1687 word0(rv) = NAN_WORD0;
1688 word1(rv) = NAN_WORD1;
1717 oldinexact = get_inexact();
1721 bd0 = bb = bd = bs = delta = 0;
1724#ifndef Honor_FLT_ROUNDS
1734 goto vax_ovfl_check;
1736#ifdef Honor_FLT_ROUNDS
1752#ifdef Honor_FLT_ROUNDS
1760 dval(rv) *= tens[
i];
1778#ifndef Inaccurate_Divide
1780#ifdef Honor_FLT_ROUNDS
1798 oldinexact = get_inexact();
1800#ifdef Avoid_Underflow
1803#ifdef Honor_FLT_ROUNDS
1806 rounding = rounding == 2 ? 0 : 2;
1817 if ((
i = e1 & 15) != 0)
1818 dval(rv) *= tens[
i];
1827#ifdef Honor_FLT_ROUNDS
1856 for (j = 0; e1 > 1; j++, e1 >>= 1)
1858 dval(rv) *= bigtens[j];
1861 dval(rv) *= bigtens[j];
1877 if ((
i = e1 & 15) != 0)
1878 dval(rv) /= tens[
i];
1882#ifdef Avoid_Underflow
1885 for (j = 0; e1 > 0; j++, e1 >>= 1)
1887 dval(rv) *= tinytens[j];
1896 word0(rv) &= 0xffffffff << (j-32);
1899 word1(rv) &= 0xffffffff << j;
1902 for (j = 0; e1 > 1; j++, e1 >>= 1)
1904 dval(rv) *= tinytens[j];
1907 dval(rv) *= tinytens[j];
1910 dval(rv) *= tinytens[j];
1922#ifndef Avoid_Underflow
1937 bd0 = s2b(s0, nd0, nd, y);
1940 bd = Balloc(bd0->
k);
1942 bb = d2b(
dval(rv), &bbe, &bbbits);
1958#ifdef Honor_FLT_ROUNDS
1962#ifdef Avoid_Underflow
1970#ifdef Sudden_Underflow
1972 j = 1 + 4*
P - 3 - bbbits + ((bbe + bbbits - 1) & 3);
1987#ifdef Avoid_Underflow
1990 i = bb2 < bd2 ? bb2 : bd2;
1999 bs = pow5mult(bs, bb5);
2005 bb = lshift(bb, bb2);
2007 bd = pow5mult(bd, bd5);
2009 bd = lshift(bd, bd2);
2011 bs = lshift(bs, bs2);
2012 delta = diff(bb, bd);
2013 dsign = delta->
sign;
2016#ifdef Honor_FLT_ROUNDS
2017 if (rounding != 1) {
2020 if (!delta->
x[0] && delta->
wds <= 1) {
2038#ifdef Avoid_Underflow
2044 delta = lshift(delta,
Log2P);
2045 if (cmp(delta, bs) <= 0)
2050#ifdef Avoid_Underflow
2055#ifdef Sudden_Underflow
2069 adj = ratio(delta, bs);
2072 if (adj <= 0x7ffffffe) {
2076 if (!((rounding>>1) ^ dsign))
2081#ifdef Avoid_Underflow
2085#ifdef Sudden_Underflow
2088 adj *= ulp(
dval(rv));
2098 adj *= ulp(
dval(rv));
2121 if (!delta->
x[0] && delta->
wds <= 1)
2126 if (!delta->
x[0] && delta->
wds <= 1) {
2133 delta = lshift(delta,
Log2P);
2134 if (cmp(delta, bs) > 0)
2145 ? (0xffffffff & (0xffffffff << (2*
P+1-(y>>
Exp_shift)))) :
2156#ifdef Avoid_Underflow
2165#ifdef Sudden_Underflow
2170#ifdef Avoid_Underflow
2179#ifdef Avoid_Underflow
2195 word1(rv) = 0xffffffff;
2211#ifndef Sudden_Underflow
2216#ifdef Avoid_Underflow
2222 if ((aadj = ratio(delta, bs)) <= 2.) {
2224 aadj =
dval(aadj1) = 1.;
2226#ifndef Sudden_Underflow
2241 dval(aadj1) = -aadj;
2246 dval(aadj1) = dsign ? aadj : -aadj;
2247#ifdef Check_FLT_ROUNDS
2282#ifdef Avoid_Underflow
2284 if (aadj <= 0x7fffffff) {
2285 if ((z = (
int)aadj) <= 0)
2288 dval(aadj1) = dsign ? aadj : -aadj;
2295#ifdef Sudden_Underflow
2340#ifdef Avoid_Underflow
2349 if (aadj < .4999999 || aadj > .5000001)
2370 else if (!oldinexact)
2373#ifdef Avoid_Underflow
2409 ULong *bx, *bxe, q, *sx, *sxe;
2411 ULLong borrow, carry, y, ys;
2413 ULong borrow, carry, y, ys;
2422 Bug(
"oversize b in quorem");
2430 q = *bxe / (*sxe + 1);
2433 Bug(
"oversized quotient in quorem");
2440 ys = *sx++ * (ULLong)q + carry;
2442 y = *bx - (ys &
FFFFFFFF) - borrow;
2443 borrow = y >> 32 & (ULong)1;
2448 ys = (si & 0xffff) * q + carry;
2449 zs = (si >> 16) * q + (ys >> 16);
2451 y = (*bx & 0xffff) - (ys & 0xffff) - borrow;
2452 borrow = (y & 0x10000) >> 16;
2453 z = (*bx >> 16) - (zs & 0xffff) - borrow;
2454 borrow = (z & 0x10000) >> 16;
2457 ys = *sx++ * q + carry;
2459 y = *bx - (ys & 0xffff) - borrow;
2460 borrow = (y & 0x10000) >> 16;
2464 }
while (sx <= sxe);
2467 while (--bxe > bx && !*bxe)
2472 if (cmp(b,
S) >= 0) {
2482 y = *bx - (ys &
FFFFFFFF) - borrow;
2483 borrow = y >> 32 & (ULong)1;
2488 ys = (si & 0xffff) + carry;
2489 zs = (si >> 16) + (ys >> 16);
2491 y = (*bx & 0xffff) - (ys & 0xffff) - borrow;
2492 borrow = (y & 0x10000) >> 16;
2493 z = (*bx >> 16) - (zs & 0xffff) - borrow;
2494 borrow = (z & 0x10000) >> 16;
2499 y = *bx - (ys & 0xffff) - borrow;
2500 borrow = (y & 0x10000) >> 16;
2504 }
while (sx <= sxe);
2508 while (--bxe > bx && !*bxe)
2516#ifndef MULTIPLE_THREADS
2517static char *dtoa_result;
2520#ifndef MULTIPLE_THREADS
2527#define rv_alloc(i) xmalloc(i)
2531nrv_alloc(
const char *s,
char **rve,
size_t n)
2536 while ((*t = *s++) != 0) t++;
2542#define rv_strdup(s, rve) nrv_alloc((s), (rve), strlen(s)+1)
2544#ifndef MULTIPLE_THREADS
2558static const char INFSTR[] =
"Infinity";
2559static const char NANSTR[] =
"NaN";
2560static const char ZEROSTR[] =
"0";
2597dtoa(
double d_,
int mode,
int ndigits,
int *decpt,
int *
sign,
char **rve)
2633 int bbits, b2, b5, be, dig,
i, ieps, ilim, ilim0, ilim1,
2634 j,
j1,
k, k0, k_check, leftright, m2, m5,
s2, s5,
2635 spec_case, try_quick, half = 0;
2637#ifndef Sudden_Underflow
2641 Bigint *b, *b1, *delta, *mlo = 0, *mhi = 0, *
S;
2645#ifdef Honor_FLT_ROUNDS
2649 int inexact, oldinexact;
2654#ifndef MULTIPLE_THREADS
2656 freedtoa(dtoa_result);
2664 word0(d) &= ~Sign_bit;
2669#if defined(IEEE_Arith) + defined(VAX)
2673 if (
word0(d) == 0x8000)
2694 try_quick = oldinexact = get_inexact();
2697#ifdef Honor_FLT_ROUNDS
2700 rounding = rounding == 2 ? 0 : 2;
2707 b = d2b(
dval(d), &be, &bbits);
2708#ifdef Sudden_Underflow
2748#ifndef Sudden_Underflow
2754 i = bbits + be + (
Bias + (
P-1) - 1);
2759 i -= (
Bias + (
P-1) - 1) + 1;
2763 ds = (
dval(d2)-1.5)*0.289529654602168 + 0.1760912590558 +
i*0.301029995663981;
2765 if (ds < 0. && ds !=
k)
2769 if (
dval(d) < tens[
k])
2792 if (mode < 0 || mode > 9)
2796#ifdef Check_FLT_ROUNDS
2821 ilim = ilim1 =
i = ndigits;
2827 i = ndigits +
k + 1;
2835#ifdef Honor_FLT_ROUNDS
2836 if (mode > 1 && rounding != 1)
2840 if (ilim >= 0 && ilim <=
Quick_max && try_quick) {
2858 for (; j; j >>= 1,
i++)
2865 else if ((
j1 = -
k) != 0) {
2866 dval(d) *= tens[
j1 & 0xf];
2867 for (j =
j1 >> 4; j; j >>= 1,
i++)
2870 dval(d) *= bigtens[
i];
2873 if (k_check &&
dval(d) < 1. && ilim > 0) {
2897 dval(eps) = 0.5/tens[ilim-1] -
dval(eps);
2901 *s++ =
'0' + (
int)
L;
2915 dval(eps) *= tens[ilim-1];
2916 for (
i = 1;;
i++,
dval(d) *= 10.) {
2917 L = (Long)(
dval(d));
2918 if (!(
dval(d) -=
L))
2920 *s++ =
'0' + (
int)
L;
2924 else if (
dval(d) < 0.5 -
dval(eps)) {
2925 while (*--s ==
'0') ;
2930 if ((*(s-1) -
'0') & 1) {
2951 if (ndigits < 0 && ilim <= 0) {
2953 if (ilim < 0 ||
dval(d) <= 5*ds)
2957 for (
i = 1;;
i++,
dval(d) *= 10.) {
2958 L = (Long)(
dval(d) / ds);
2960#ifdef Check_FLT_ROUNDS
2967 *s++ =
'0' + (
int)
L;
2975#ifdef Honor_FLT_ROUNDS
2979 case 2:
goto bump_up;
2983 if (
dval(d) > ds || (
dval(d) == ds && (
L & 1))) {
3003#ifndef Sudden_Underflow
3004 denorm ? be + (
Bias + (
P-1) - 1 + 1) :
3007 1 + 4*
P - 3 - bbits + ((bbits + be - 1) & 3);
3015 if (m2 > 0 &&
s2 > 0) {
3016 i = m2 <
s2 ? m2 :
s2;
3024 mhi = pow5mult(mhi, m5);
3029 if ((j = b5 - m5) != 0)
3033 b = pow5mult(b, b5);
3037 S = pow5mult(
S, s5);
3042 if ((mode < 2 || leftright)
3043#ifdef Honor_FLT_ROUNDS
3048#ifndef Sudden_Underflow
3067 if ((
i = ((s5 ? 32 - hi0bits(
S->x[
S->wds-1]) : 1) +
s2) & 0x1f) != 0)
3070 if ((
i = ((s5 ? 32 - hi0bits(
S->x[
S->wds-1]) : 1) +
s2) & 0xf) != 0)
3092 b = multadd(b, 10, 0);
3094 mhi = multadd(mhi, 10, 0);
3098 if (ilim <= 0 && (mode == 3 || mode == 5)) {
3099 if (ilim < 0 || cmp(b,
S = multadd(
S,5,0)) <= 0) {
3112 mhi = lshift(mhi, m2);
3120 mhi = Balloc(mhi->k);
3122 mhi = lshift(mhi,
Log2P);
3126 dig = quorem(b,
S) +
'0';
3131 delta = diff(
S, mhi);
3132 j1 = delta->
sign ? 1 : cmp(b, delta);
3135 if (
j1 == 0 && mode != 1 && !(
word1(d) & 1)
3136#ifdef Honor_FLT_ROUNDS
3145 else if (!b->
x[0] && b->
wds <= 1)
3152 if (j < 0 || (j == 0 && mode != 1
3157 if (!b->
x[0] && b->
wds <= 1) {
3163#ifdef Honor_FLT_ROUNDS
3166 case 0:
goto accept_dig;
3167 case 2:
goto keep_dig;
3173 if ((
j1 > 0 || (
j1 == 0 && (dig & 1))) && dig++ ==
'9')
3181#ifdef Honor_FLT_ROUNDS
3193#ifdef Honor_FLT_ROUNDS
3199 b = multadd(b, 10, 0);
3201 mlo = mhi = multadd(mhi, 10, 0);
3203 mlo = multadd(mlo, 10, 0);
3204 mhi = multadd(mhi, 10, 0);
3210 *s++ = dig = quorem(b,
S) +
'0';
3211 if (!b->
x[0] && b->
wds <= 1) {
3219 b = multadd(b, 10, 0);
3224#ifdef Honor_FLT_ROUNDS
3226 case 0:
goto trimzeros;
3227 case 2:
goto roundoff;
3232 if (j > 0 || (j == 0 && (dig & 1))) {
3240 if (!half || (*s -
'0') & 1)
3244 while (*--s ==
'0') ;
3250 if (mlo && mlo != mhi)
3263 else if (!oldinexact)
3300#define DBL_MANH_SIZE 20
3301#define DBL_MANL_SIZE 32
3302#define DBL_ADJ (DBL_MAX_EXP - 2)
3303#define SIGFIGS ((DBL_MANT_DIG + 3) / 4 + 1)
3304#define dexp_get(u) ((int)(word0(u) >> Exp_shift) & ~Exp_msk1)
3305#define dexp_set(u,v) (word0(u) = (((int)(word0(u)) & ~Exp_mask) | ((v) << Exp_shift)))
3306#define dmanh_get(u) ((uint32_t)(word0(u) & Frac_mask))
3307#define dmanl_get(u) ((uint32_t)word1(u))
3335hdtoa(
double d,
const char *xdigs,
int ndigits,
int *decpt,
int *
sign,
char **rve)
3346 word0(u) &= ~Sign_bit;
3355 else if (
isnan(d)) {
3359 else if (d == 0.0) {
3367 u.
d *= 5.363123171977039e+154 ;
3378 bufsize = (ndigits > 0) ? ndigits :
SIGFIGS;
3382 if (
SIGFIGS > ndigits && ndigits > 0) {
3394 for (s = s0 + 1; s < s0 + bufsize; s++) {
3402 for (ndigits =
SIGFIGS; s0[ndigits - 1] ==
'0'; ndigits--)
#define rounded_product(a, b)
#define FREE_DTOA_LOCK(n)
#define rounded_quotient(a, b)
#define IEEE_LITTLE_ENDIAN
char * hdtoa(double d, const char *xdigs, int ndigits, int *decpt, int *sign, char **rve)
char * dtoa(double d_, int mode, int ndigits, int *decpt, int *sign, char **rve)
#define Storeinc(a, b, c)
#define rv_strdup(s, rve)
#define ACQUIRE_DTOA_LOCK(n)
NO_SANITIZE("unsigned-integer-overflow", static Bigint *diff(Bigint *a, Bigint *b))
double strtod(const char *s00, char **se)