198#define ULong uint32_t
206#define Bigint _zend_strtod_bigint
207#define freelist (EG(strtod_state).freelist)
208#define p5s (EG(strtod_state).p5s)
209#define dtoa_result (EG(strtod_state).result)
212static void Bug(
const char *message) {
213 fprintf(stderr,
"%s\n", message);
224#ifdef Honor_FLT_ROUNDS
225#ifndef Trust_FLT_ROUNDS
234extern void *
MALLOC(
size_t);
241#ifndef Omit_Private_Memory
243#define PRIVATE_MEM 2304
245#define PRIVATE_mem ((PRIVATE_MEM+sizeof(double)-1)/sizeof(double))
246static double private_mem[PRIVATE_mem], *pmem_next = private_mem;
250#undef Avoid_Underflow
259#ifndef NO_INFNAN_CHECK
265#define NO_STRTOD_BIGCOMP
274#define DBL_MAX_10_EXP 308
275#define DBL_MAX_EXP 1024
281#define DBL_MAX_10_EXP 75
282#define DBL_MAX_EXP 63
284#define DBL_MAX 7.2370055773322621e+75
289#define DBL_MAX_10_EXP 38
290#define DBL_MAX_EXP 127
292#define DBL_MAX 1.7014118346046923e+38
296#define LONG_MAX 2147483647
315#if defined(IEEE_8087) + defined(IEEE_MC68k) + defined(VAX) + defined(IBM) != 1
322#define word0(x) (x)->L[1]
323#define word1(x) (x)->L[0]
325#define word0(x) (x)->L[0]
326#define word1(x) (x)->L[1]
328#define dval(x) (x)->d
331#define STRTOD_DIGLIM 40
337#define strtod_diglim STRTOD_DIGLIM
344#if defined(IEEE_8087) + defined(VAX) + defined(__arm__)
345#define Storeinc(a,b,c) (((unsigned short *)a)[1] = (unsigned short)b, \
346((unsigned short *)a)[0] = (unsigned short)c, a++)
348#define Storeinc(a,b,c) (((unsigned short *)a)[0] = (unsigned short)b, \
349((unsigned short *)a)[1] = (unsigned short)c, a++)
361#define Exp_msk1 0x100000
362#define Exp_msk11 0x100000
363#define Exp_mask 0x7ff00000
369#define Exp_1 0x3ff00000
370#define Exp_11 0x3ff00000
372#define Frac_mask 0xfffff
373#define Frac_mask1 0xfffff
376#define Bndry_mask 0xfffff
377#define Bndry_mask1 0xfffff
379#define Sign_bit 0x80000000
386#define Avoid_Underflow
388#undef Sudden_Underflow
394#define Flt_Rounds FLT_ROUNDS
400#ifdef Honor_FLT_ROUNDS
401#undef Check_FLT_ROUNDS
402#define Check_FLT_ROUNDS
404#define Rounding Flt_Rounds
408#undef Check_FLT_ROUNDS
409#undef Honor_FLT_ROUNDS
411#undef Sudden_Underflow
412#define Sudden_Underflow
418#define Exp_msk1 0x1000000
419#define Exp_msk11 0x1000000
420#define Exp_mask 0x7f000000
426#define Exp_1 0x41000000
427#define Exp_11 0x41000000
429#define Frac_mask 0xffffff
430#define Frac_mask1 0xffffff
433#define Bndry_mask 0xefffff
434#define Bndry_mask1 0xffffff
436#define Sign_bit 0x80000000
438#define Tiny0 0x100000
448#define Exp_msk11 0x800000
449#define Exp_mask 0x7f80
455#define Exp_1 0x40800000
458#define Frac_mask 0x7fffff
459#define Frac_mask1 0xffff007f
462#define Bndry_mask 0xffff007f
463#define Bndry_mask1 0xffff007f
465#define Sign_bit 0x8000
477#ifdef ROUND_BIASED_without_Round_Up
484#define rounded_product(a,b) a = rnd_prod(a, b)
485#define rounded_quotient(a,b) a = rnd_quot(a, b)
487extern double rnd_prod(), rnd_quot();
489extern double rnd_prod(
double,
double), rnd_quot(
double,
double);
492#define rounded_product(a,b) a *= b
493#define rounded_quotient(a,b) a /= b
496#define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))
497#define Big1 0xffffffff
505BCinfo {
int dp0,
dp1,
dplen,
dsign,
e0,
inexact,
nd,
nd0,
rounding,
scale,
uflchk; };
508#define FFFFFFFF ((((unsigned long)0xffff)<<16)|(unsigned long)0xffff)
510#define FFFFFFFF 0xffffffffUL
525#define Llong long long
528#define ULLong unsigned Llong
532#ifndef MULTIPLE_THREADS
533#define ACQUIRE_DTOA_LOCK(n)
534#define FREE_DTOA_LOCK(n)
537#define Kmax ZEND_STRTOD_K_MAX
552static void destroy_freelist(
void);
553static void free_p5s(
void);
555#ifdef MULTIPLE_THREADS
556static MUTEX_T dtoa_mutex;
557static MUTEX_T pow5mult_mutex;
579#ifndef Omit_Private_Memory
590#ifdef Omit_Private_Memory
599 if (k <=
Kmax && pmem_next - private_mem +
len <= PRIVATE_mem) {
614 rv->sign =
rv->wds = 0;
638#define Bcopy(x,y) memcpy((char *)&x->sign, (char *)&y->sign, \
639y->wds*sizeof(Long) + 2*sizeof(int))
667 y = *x * (
ULLong)m + carry;
673 y = (xi & 0xffff) * m + carry;
674 z = (xi >> 16) * m + (y >> 16);
676 *x++ = (z << 16) + (y & 0xffff);
686 if (wds >= b->maxwds) {
701 (
s, nd0, nd, y9, dplen)
CONST char *
s;
int nd0, nd, dplen;
ULong y9;
703 (
const char *
s,
int nd0,
int nd,
ULong y9,
int dplen)
711 for(k = 0, y = 1; x > y; y <<= 1, k++) ;
718 b->
x[0] = y9 & 0xffff;
719 b->
wds = (b->
x[1] = y9 >> 16) ? 2 : 1;
725 do b = multadd(b, 10, *
s++ -
'0');
732 b = multadd(b, 10, *
s++ -
'0');
746 if (!(x & 0xffff0000)) {
750 if (!(x & 0xff000000)) {
754 if (!(x & 0xf0000000)) {
758 if (!(x & 0xc0000000)) {
762 if (!(x & 0x80000000)) {
764 if (!(x & 0x40000000))
844 ULong *x, *xa, *xae, *xb, *xbe, *xc, *xc0;
855 if (
a->wds < b->
wds) {
867 for(x = c->
x, xa = x + wc; x < xa; x++)
875 for(; xb < xbe; xc0++) {
881 z = *x++ * (
ULLong)y + *xc + carry;
891 for(; xb < xbe; xb++, xc0++) {
892 if (y = *xb & 0xffff) {
897 z = (*x & 0xffff) * y + (*xc & 0xffff) + carry;
899 z2 = (*x++ >> 16) * y + (*xc >> 16) + carry;
912 z = (*x & 0xffff) * y + (*xc >> 16) + carry;
915 z2 = (*x++ >> 16) * y + (*xc & 0xffff) + carry;
923 for(; xb < xbe; xc0++) {
929 z = *x++ * y + *xc + carry;
939 for(xc0 = c->
x, xc = xc0 + wc; wc > 0 && !*--xc; --wc) ;
958 static const int p05[3] = { 5, 25, 125 };
961 b = multadd(b, p05[i-1], 0);
967#ifdef MULTIPLE_THREADS
987 if (!(p51 = p5->
next)) {
988#ifdef MULTIPLE_THREADS
990 if (!(p51 = p5->
next)) {
991 p51 = p5->
next = mult(p5,p5);
996 p51 = p5->
next = mult(p5,p5);
1015 ULong *x, *x1, *xe, z;
1023 n1 =
n + b->wds + 1;
1024 for(i = b->maxwds; n1 > i; i <<= 1)
1028 for(i = 0; i <
n; i++)
1037 *x1++ = *x << k | z;
1049 *x1++ = *x << k & 0xffff | z;
1073 ULong *xa, *xa0, *xb, *xb0;
1079 if (i > 1 && !
a->x[i-1])
1080 Bug(
"cmp called with a->x[a->wds-1] == 0");
1081 if (
j > 1 && !b->x[
j-1])
1082 Bug(
"cmp called with b->x[b->wds-1] == 0");
1092 return *xa < *xb ? -1 : 1;
1109 ULong *xa, *xae, *xb, *xbe, *xc;
1146 y = (
ULLong)*xa++ - *xb++ - borrow;
1147 borrow = y >> 32 & (
ULong)1;
1153 borrow = y >> 32 & (
ULong)1;
1159 y = (*xa & 0xffff) - (*xb & 0xffff) - borrow;
1160 borrow = (y & 0x10000) >> 16;
1161 z = (*xa++ >> 16) - (*xb++ >> 16) - borrow;
1162 borrow = (z & 0x10000) >> 16;
1167 y = (*xa & 0xffff) - borrow;
1168 borrow = (y & 0x10000) >> 16;
1169 z = (*xa++ >> 16) - borrow;
1170 borrow = (z & 0x10000) >> 16;
1175 y = *xa++ - *xb++ - borrow;
1176 borrow = (y & 0x10000) >> 16;
1182 borrow = (y & 0x10000) >> 16;
1205#ifndef Avoid_Underflow
1206#ifndef Sudden_Underflow
1215#ifndef Avoid_Underflow
1216#ifndef Sudden_Underflow
1221 word0(&
u) = 0x80000 >> L;
1227 word1(&
u) = L >= 31 ? 1 : 1 << 31 - L;
1243 ULong *xa, *xa0, w, y, z;
1257 if (!y) Bug(
"zero y in b2d");
1264 w = xa > xa0 ? *--xa : 0;
1268 z = xa > xa0 ? *--xa : 0;
1270 d0 =
Exp_1 | y << k | z >> (32 - k);
1271 y = xa > xa0 ? *--xa : 0;
1272 d1 = z << k | y >> (32 - k);
1279 if (k <
Ebits + 16) {
1280 z = xa > xa0 ? *--xa : 0;
1282 w = xa > xa0 ? *--xa : 0;
1283 y = xa > xa0 ? *--xa : 0;
1287 z = xa > xa0 ? *--xa : 0;
1288 w = xa > xa0 ? *--xa : 0;
1290 d0 =
Exp_1 | y << k + 16 | z << k | w >> 16 - k;
1291 y = xa > xa0 ? *--xa : 0;
1292 d1 = w << k + 16 | y << k;
1308 (d, e, bits)
U *d;
int *e, *bits;
1310 (
U *d,
int *e,
int *bits)
1316#ifndef Sudden_Underflow
1337#ifdef Sudden_Underflow
1348 if ((k = lo0bits(&y))) {
1349 x[0] = y | z << (32 - k);
1354#ifndef Sudden_Underflow
1357 b->
wds = (x[1] = z) ? 2 : 1;
1362#ifndef Sudden_Underflow
1370 if (k = lo0bits(&y))
1372 x[0] = y | z << 32 - k & 0xffff;
1373 x[1] = z >> k - 16 & 0xffff;
1379 x[1] = y >> 16 | z << 16 - k & 0xffff;
1380 x[2] = z >> k & 0xffff;
1395 Bug(
"Zero passed to d2b");
1413#ifndef Sudden_Underflow
1417 *e = (de -
Bias - (
P-1) << 2) + k;
1420 *e = de -
Bias - (
P-1) + k;
1423#ifndef Sudden_Underflow
1426 *e = de -
Bias - (
P-1) + 1 + k;
1428 *bits = 32*i - hi0bits(x[i-1]);
1430 *bits = (i+2)*16 - hi0bits(x[i]);
1450 dval(&da) = b2d(
a, &ka);
1451 dval(&db) = b2d(b, &kb);
1453 k = ka - kb + 32*(
a->wds - b->
wds);
1455 k = ka - kb + 16*(
a->wds - b->
wds);
1461 dval(&da) *= 1 << k;
1467 dval(&db) *= 1 << k;
1482 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9,
1483 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19,
1492bigtens[] = { 1e16, 1e32, 1e64, 1e128, 1e256 };
1493static CONST double tinytens[] = { 1e-16, 1e-32, 1e-64, 1e-128,
1494#ifdef Avoid_Underflow
1495 9007199254740992.*9007199254740992.e-256
1503#define Scale_Bit 0x10
1507bigtens[] = { 1e16, 1e32, 1e64 };
1508static CONST double tinytens[] = { 1e-16, 1e-32, 1e-64 };
1511bigtens[] = { 1e16, 1e32 };
1512static CONST double tinytens[] = { 1e-16, 1e-32 };
1532static unsigned char hexdig[256];
1535htinit(
unsigned char *h,
unsigned char *
s,
int inc)
1538 for(i = 0; (
j =
s[i]) !=0; i++)
1546#define USC (unsigned char *)
1547 htinit(hexdig, USC
"0123456789", 0x10);
1548 htinit(hexdig, USC
"abcdef", 0x10 + 10);
1549 htinit(hexdig, USC
"ABCDEF", 0x10 + 10);
1552static const unsigned char hexdig[256] = {
1553 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1554 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1555 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1556 16,17,18,19,20,21,22,23,24,25,0,0,0,0,0,0,
1557 0,26,27,28,29,30,31,0,0,0,0,0,0,0,0,0,
1558 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1559 0,26,27,28,29,30,31,0,0,0,0,0,0,0,0,0,
1560 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1561 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1562 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1563 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1564 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1565 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1566 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1567 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1568 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
1576#define NAN_WORD0 0x7ff80000
1586 (sp, t)
char **sp, *t;
1588 (
const char **sp,
const char *t)
1595 if ((c = *++
s) >=
'A' && c <=
'Z')
1608 (rvp, sp)
U *rvp;
CONST char **sp;
1610 (
U *rvp,
const char **sp)
1615 int c1, havedig, udx0, xshift;
1619 havedig = xshift = 0;
1623 while((c = *(
CONST unsigned char*)(
s+1)) && c <=
' ')
1625 if (
s[1] ==
'0' && (
s[2] ==
'x' ||
s[2] ==
'X'))
1627 while((c = *(
CONST unsigned char*)++
s)) {
1628 if ((c1 = hexdig[c]))
1630 else if (c <=
' ') {
1631 if (udx0 && havedig) {
1637#ifdef GDTOA_NON_PEDANTIC_NANCHECK
1638 else if ( c ==
')' && havedig) {
1651 }
while((c = *++
s));
1662 x[0] = (x[0] << 4) | (x[1] >> 28);
1663 x[1] = (x[1] << 4) | c;
1665 if ((x[0] &= 0xfffff) || x[1]) {
1683#if !defined(NO_HEX_FP) || defined(Honor_FLT_ROUNDS)
1697 if (*x < (
ULong)0xffffffffL) {
1705 b1 = Balloc(b->
k+1);
1721rshift(b, k)
Bigint *b;
int k;
1726 ULong *x, *x1, *xe, y;
1738 *x1++ = (y | (*x <<
n)) & 0xffffffff;
1748 if ((b->
wds = x1 - b->
x) == 0)
1754any_on(b, k)
Bigint *b;
int k;
1760 ULong *x, *x0, x1, x2;
1767 else if (
n < nwds && (k &=
kmask)) {
1791gethex(sp, rvp, rounding,
sign)
1794gethex(
CONST char **sp,
U *rvp,
int rounding,
int sign)
1798 CONST unsigned char *decpt, *s0, *
s, *s1;
1800 ULong L, lostbits, *x;
1801 int big, denorm, esign, havedig, k,
n, nbits, up, zret;
1807 emax = 0x7fe -
Bias -
P + 1,
1812 emax = 0x7ff -
Bias -
P + 1
1815 emax = 0x7f -
Bias -
P
1821#ifdef NO_LOCALE_CACHE
1822 const unsigned char *decimalpoint = (
unsigned char*)
1825 const unsigned char *decimalpoint;
1826 static unsigned char *decimalpoint_cache;
1827 if (!(s0 = decimalpoint_cache)) {
1828 s0 = (
unsigned char*)
localeconv()->decimal_point;
1829 if ((decimalpoint_cache = (
unsigned char*)
1831 strcpy((
char*)decimalpoint_cache, (
CONST char*)s0);
1832 s0 = decimalpoint_cache;
1841 s0 = *(
CONST unsigned char **)sp + 2;
1842 while(s0[havedig] ==
'0')
1854 for(i = 0; decimalpoint[i]; ++i) {
1855 if (
s[i] != decimalpoint[i])
1876 if (*
s == *decimalpoint && !decpt) {
1877 for(i = 1; decimalpoint[i]; ++i) {
1878 if (
s[i] != decimalpoint[i])
1883 if (*
s ==
'.' && !decpt) {
1890 e = -(((
Long)(
s-decpt)) << 2);
1904 if ((
n = hexdig[*
s]) == 0 ||
n > 0x19) {
1909 while((
n = hexdig[*++
s]) !=0 &&
n <= 0x19) {
1910 if (e1 & 0xf8000000)
1912 e1 = 10*e1 +
n - 0x10;
1920 *sp = (
char*)s0 - 1;
1968 for(k = 0;
n > (1 << (
kshift-2)) - 1;
n >>= 1)
1975 for(i = 0; decimalpoint[i+1]; ++i);
1979 if (*--s1 == decimalpoint[i]) {
1992 L |= (hexdig[*s1] & 0x0f) <<
n;
1996 b->
wds =
n = x - b->
x;
2008 if (k > 0 && any_on(b,k))
2015 else if (
n < nbits) {
2040 if (
n == nbits && (
n < 2 || any_on(b,
n-1)))
2065 lostbits = any_on(b,k);
2079 && (lostbits & 1) | (x[0] & 1))
2094 if (nbits ==
Nbits - 1
2100 || ((
n = nbits &
kmask) !=0
2101 && hi0bits(x[k-1]) < 32-
n)) {
2110 word0(rvp) = b->
wds > 1 ? b->
x[1] & ~0x100000 : 0;
2112 word0(rvp) = (b->
x[1] & ~0x100000) | ((e + 0x3ff + 52) << 20);
2117 k = b->
x[0] & ((1 <<
j) - 1);
2131 if (k &
j && ((k & (
j-1)) | lostbits))
2137 word0(rvp) = b->
x[1] | ((e + 65 + 13) << 24);
2144 word0(rvp) = ((b->
x[1] & ~0x800000) >> 16) | ((e + 129 + 55) << 7) | (b->
x[1] << 16);
2145 word1(rvp) = (b->
x[0] >> 16) | (b->
x[0] << 16);
2153dshift(b, p2)
Bigint *b;
int p2;
2158 int rv = hi0bits(b->
x[b->
wds-1]) - 4;
2173 ULong *bx, *bxe, q, *sx, *sxe;
2175 ULLong borrow, carry, y, ys;
2177 ULong borrow, carry, y, ys;
2186 Bug(
"oversize b in quorem");
2194 q = *bxe / (*sxe + 1);
2196#ifdef NO_STRTOD_BIGCOMP
2203 Bug(
"oversized quotient in quorem");
2210 ys = *sx++ * (
ULLong)q + carry;
2212 y = *bx - (ys &
FFFFFFFF) - borrow;
2213 borrow = y >> 32 & (
ULong)1;
2218 ys = (si & 0xffff) * q + carry;
2219 zs = (si >> 16) * q + (ys >> 16);
2221 y = (*bx & 0xffff) - (ys & 0xffff) - borrow;
2222 borrow = (y & 0x10000) >> 16;
2223 z = (*bx >> 16) - (zs & 0xffff) - borrow;
2224 borrow = (z & 0x10000) >> 16;
2227 ys = *sx++ * q + carry;
2229 y = *bx - (ys & 0xffff) - borrow;
2230 borrow = (y & 0x10000) >> 16;
2238 while(--bxe > bx && !*bxe)
2243 if (cmp(b,
S) >= 0) {
2253 y = *bx - (ys &
FFFFFFFF) - borrow;
2254 borrow = y >> 32 & (
ULong)1;
2259 ys = (si & 0xffff) + carry;
2260 zs = (si >> 16) + (ys >> 16);
2262 y = (*bx & 0xffff) - (ys & 0xffff) - borrow;
2263 borrow = (y & 0x10000) >> 16;
2264 z = (*bx >> 16) - (zs & 0xffff) - borrow;
2265 borrow = (z & 0x10000) >> 16;
2270 y = *bx - (ys & 0xffff) - borrow;
2271 borrow = (y & 0x10000) >> 16;
2280 while(--bxe > bx && !*bxe)
2288#if defined(Avoid_Underflow) || !defined(NO_STRTOD_BIGCOMP)
2310#ifndef NO_STRTOD_BIGCOMP
2321 int b2, bbits,
d2, dd, dig, dsign, i,
j, nd, nd0, p2, p5, speccase;
2326 p5 = nd + bc->
e0 - 1;
2328#ifndef Sudden_Underflow
2334#ifdef Avoid_Underflow
2340#ifdef Honor_FLT_ROUNDS
2352 b = d2b(
rv, &p2, &bbits);
2353#ifdef Avoid_Underflow
2359 if (i > (
j =
P -
Emin - 1 + p2)) {
2360#ifdef Sudden_Underflow
2365#ifdef Avoid_Underflow
2375#ifdef Honor_FLT_ROUNDS
2388#ifndef Sudden_Underflow
2397 d = pow5mult(d, p5);
2399 b = pow5mult(b, -p5);
2417 if (!(dig = quorem(b,d))) {
2418 b = multadd(b, 10, 0);
2424 for(i = 0; i < nd0; ) {
2425 if ((dd = s0[i++] -
'0' - dig))
2427 if (!b->
x[0] && b->
wds == 1) {
2432 b = multadd(b, 10, 0);
2435 for(
j = bc->
dp1; i++ < nd;) {
2436 if ((dd = s0[
j++] -
'0' - dig))
2438 if (!b->
x[0] && b->
wds == 1) {
2443 b = multadd(b, 10, 0);
2446 if (dig > 0 || b->
x[0] || b->
wds > 1)
2451#ifdef Honor_FLT_ROUNDS
2502 else if (
word0(
rv) & (0x1 << (i-32)))
2513#ifdef Honor_FLT_ROUNDS
2523 (s00, se)
CONST char *s00;
char **se;
2525 (
const char *s00,
const char **se)
2528 int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, e, e1;
2529 int esign, i,
j, k, nd, nd0, nf, nz, nz0, nz1,
sign;
2531 volatile double aadj, aadj1;
2533 U aadj2, adj,
rv, rv0;
2536 Bigint *bb, *bb1, *bd, *bd0, *bs, *delta;
2537#ifdef Avoid_Underflow
2543#ifndef NO_STRTOD_BIGCOMP
2544 int req_bigcomp = 0;
2546#ifdef Honor_FLT_ROUNDS
2547#ifdef Trust_FLT_ROUNDS
2551 switch(fegetround()) {
2552 case FE_TOWARDZERO: bc.
rounding = 0;
break;
2553 case FE_UPWARD: bc.
rounding = 2;
break;
2564 for(
s = s00;;
s++)
switch(*
s) {
2590#ifdef Honor_FLT_ROUNDS
2599 while(*++
s ==
'0') ;
2605 for(nd = nf = 0; (c = *
s) >=
'0' && c <=
'9'; nd++,
s++)
2608 else if (nd < DBL_DIG + 2)
2612 for(s1 =
s; s1 > s0 && *--s1 ==
'0'; )
2638 for(; c ==
'0'; c = *++
s)
2640 if (c >
'0' && c <=
'9') {
2650 for(; c >=
'0' && c <=
'9'; c = *++
s) {
2655 for(i = 1; i < nz; i++)
2658 else if (nd <= DBL_DIG + 2)
2662 else if (nd <= DBL_DIG + 2)
2678 if (c ==
'e' || c ==
'E') {
2679 if (!nd && !nz && !nz0) {
2691 if (c >=
'0' && c <=
'9') {
2694 if (c >
'0' && c <=
'9') {
2697 while((c = *++
s) >=
'0' && c <=
'9')
2699 if (
s - s1 > 8 || L > 19999)
2751 bc.
e0 = e1 = e -= nf;
2760 k = nd < DBL_DIG + 2 ? nd : DBL_DIG + 2;
2765 oldinexact = get_inexact();
2772#ifndef Honor_FLT_ROUNDS
2779#ifndef ROUND_BIASED_without_Round_Up
2783 goto vax_ovfl_check;
2785#ifdef Honor_FLT_ROUNDS
2801#ifdef Honor_FLT_ROUNDS
2827#ifndef Inaccurate_Divide
2829#ifdef Honor_FLT_ROUNDS
2848 oldinexact = get_inexact();
2850#ifdef Avoid_Underflow
2853#ifdef Honor_FLT_ROUNDS
2870 if (e1 > DBL_MAX_10_EXP) {
2874#ifdef Honor_FLT_ROUNDS
2912 for(
j = 0; e1 > 1;
j++, e1 >>= 1)
2938#ifdef Avoid_Underflow
2941 for(
j = 0; e1 > 0;
j++, e1 >>= 1)
2954 word0(&
rv) &= 0xffffffff << (
j-32);
2960 for(
j = 0; e1 > 1;
j++, e1 >>= 1)
2975#ifndef Avoid_Underflow
2991#ifndef NO_STRTOD_BIGCOMP
3015 for(i = 0; i < nd0; ++i)
3016 y = 10*y + s0[i] -
'0';
3017 for(
j = bc.
dp1; i < nd; ++i)
3018 y = 10*y + s0[
j++] -
'0';
3022 bd0 = s2b(s0, nd0, nd, y, bc.
dplen);
3025 bd = Balloc(bd0->
k);
3027 bb = d2b(&
rv, &bbe, &bbbits);
3043#ifdef Honor_FLT_ROUNDS
3047#ifdef Avoid_Underflow
3059 Lsb1 = Lsb << (i-32);
3064#ifdef Sudden_Underflow
3066 j = 1 + 4*
P - 3 - bbbits + ((bbe + bbbits - 1) & 3);
3081#ifdef Avoid_Underflow
3084 i = bb2 < bd2 ? bb2 : bd2;
3093 bs = pow5mult(bs, bb5);
3099 bb = lshift(bb, bb2);
3101 bd = pow5mult(bd, bd5);
3103 bd = lshift(bd, bd2);
3105 bs = lshift(bs, bs2);
3106 delta = diff(bb, bd);
3110#ifndef NO_STRTOD_BIGCOMP
3111 if (bc.
nd > nd && i <= 0) {
3117#ifdef Honor_FLT_ROUNDS
3129#ifdef Honor_FLT_ROUNDS
3133 if (!delta->
x[0] && delta->
wds <= 1) {
3146 else if (!bc.
dsign) {
3151#ifdef Avoid_Underflow
3157 delta = lshift(delta,
Log2P);
3158 if (cmp(delta, bs) <= 0)
3163#ifdef Avoid_Underflow
3168#ifdef Sudden_Underflow
3182 adj.
d = ratio(delta, bs);
3185 if (adj.
d <= 0x7ffffffe) {
3194#ifdef Avoid_Underflow
3198#ifdef Sudden_Underflow
3237 if (!delta->
x[0] && delta->
wds <= 1)
3242 if (!delta->
x[0] && delta->
wds <= 1) {
3249 delta = lshift(delta,
Log2P);
3250 if (cmp(delta, bs) > 0)
3261 ? (0xffffffff & (0xffffffff << (2*
P+1-(y>>
Exp_shift)))) :
3274#ifdef Avoid_Underflow
3283#ifdef Sudden_Underflow
3288#ifdef Avoid_Underflow
3303#ifdef Avoid_Underflow
3327#ifndef NO_STRTOD_BIGCOMP
3335#ifdef Avoid_Underflow
3348#ifdef Avoid_Underflow
3355#ifdef Avoid_Underflow
3360#ifndef Sudden_Underflow
3370#ifdef Avoid_Underflow
3376 if ((aadj = ratio(delta, bs)) <= 2.) {
3380#ifndef Sudden_Underflow
3396 if (aadj < 2./FLT_RADIX)
3397 aadj = 1./FLT_RADIX;
3405 aadj1 = bc.
dsign ? aadj : -aadj;
3406#ifdef Check_FLT_ROUNDS
3427 adj.
d = aadj1 * ulp(&
rv);
3441#ifdef Avoid_Underflow
3443 if (aadj <= 0x7fffffff) {
3444 if ((z = aadj) <= 0)
3447 aadj1 = bc.
dsign ? aadj : -aadj;
3449 dval(&aadj2) = aadj1;
3451 aadj1 =
dval(&aadj2);
3452 adj.
d = aadj1 * ulp(&
rv);
3455#ifdef NO_STRTOD_BIGCOMP
3465 adj.
d = aadj1 * ulp(&
rv);
3469#ifdef Sudden_Underflow
3473 adj.
d = aadj1 * ulp(&
rv);
3497 adj.
d = aadj1 * ulp(&
rv);
3509 aadj1 = (double)(
int)(aadj + 0.5);
3513 adj.
d = aadj1 * ulp(&
rv);
3521#ifdef Avoid_Underflow
3530 if (aadj < .4999999 || aadj > .5000001)
3533 else if (aadj < .4999999/FLT_RADIX)
3549#ifndef NO_STRTOD_BIGCOMP
3553 bigcomp(&
rv, s0, &bc);
3557 if (y == 0 &&
rv.d == 0.)
3569 else if (!oldinexact)
3572#ifdef Avoid_Underflow
3591 dval(&rv0) = 1e-300;
3601#if !defined(MULTIPLE_THREADS) && !defined(dtoa_result)
3616 rem =
sizeof(
Bigint) -
sizeof(
ULong) -
sizeof(int);
3620 if (i > ((
INT_MAX >> 2) + rem))
3623 rem +
j <= (size_t)i;
j <<= 1)
3626 r = (
int*)Balloc(k);
3629#ifndef MULTIPLE_THREADS
3637nrv_alloc(
s, rve,
n)
char *
s, **rve;
int n;
3639nrv_alloc(
const char *
s,
char **rve,
int n)
3644 t =
rv = rv_alloc(
n);
3645 while((*t = *
s++)) t++;
3665 b->
maxwds = 1 << (b->
k = *(
int*)b);
3667#ifndef MULTIPLE_THREADS
3743 int bbits, b2, b5, be, dig, i, ieps, ilim = 0, ilim0, ilim1,
3744 j, j1 = 0, k, k0, k_check, leftright, m2, m5, s2, s5,
3745 spec_case = 0, try_quick;
3747#ifndef Sudden_Underflow
3751 Bigint *b, *b1, *delta, *mlo, *mhi, *
S;
3761 int inexact, oldinexact;
3763#ifdef Honor_FLT_ROUNDS
3765#ifdef Trust_FLT_ROUNDS
3769 switch(fegetround()) {
3770 case FE_TOWARDZERO:
Rounding = 0;
break;
3771 case FE_UPWARD:
Rounding = 2;
break;
3777#ifndef MULTIPLE_THREADS
3793#if defined(IEEE_Arith) + defined(VAX)
3804 return nrv_alloc(
"Infinity", rve, 8);
3806 return nrv_alloc(
"NaN", rve, 3);
3814 return nrv_alloc(
"0", rve, 1);
3818 try_quick = oldinexact = get_inexact();
3821#ifdef Honor_FLT_ROUNDS
3831 b = d2b(&
u, &be, &bbits);
3832#ifdef Sudden_Underflow
3872#ifndef Sudden_Underflow
3878 i = bbits + be + (
Bias + (
P-1) - 1);
3879 x = i > 32 ?
word0(&
u) << (64 - i) |
word1(&
u) >> (i - 32)
3883 i -= (
Bias + (
P-1) - 1) + 1;
3887 ds = (
dval(&
d2)-1.5)*0.289529654602168 + 0.1760912590558 + i*0.301029995663981;
3889 if (ds < 0. && ds != k)
3893 if (
dval(&
u) < tens[k])
3920#ifdef Check_FLT_ROUNDS
3946 ilim = ilim1 = i = ndigits;
3952 i = ndigits + k + 1;
3958 s = s0 = rv_alloc(i);
3960#ifdef Honor_FLT_ROUNDS
3965 if (ilim >= 0 && ilim <=
Quick_max && try_quick) {
3983 for(;
j;
j >>= 1, i++)
3990 else if ((j1 = -k)) {
3991 dval(&
u) *= tens[j1 & 0xf];
3992 for(
j = j1 >> 4;
j;
j >>= 1, i++)
3995 dval(&
u) *= bigtens[i];
3998 if (k_check &&
dval(&
u) < 1. && ilim > 0) {
4022 dval(&eps) = 0.5/tens[ilim-1] -
dval(&eps);
4024 if (k0 < 0 && j1 >= 307) {
4027 dval(&eps1) *= tens[j1 & 0xf];
4028 for(i = 0,
j = (j1-256) >> 4;
j;
j >>= 1, i++)
4030 dval(&eps1) *= bigtens[i];
4038 *
s++ =
'0' + (int)L;
4052 dval(&eps) *= tens[ilim-1];
4053 for(i = 1;; i++,
dval(&
u) *= 10.) {
4055 if (!(
dval(&
u) -= L))
4057 *
s++ =
'0' + (int)L;
4081 if (be >= 0 && k <=
Int_max) {
4084 if (ndigits < 0 && ilim <= 0) {
4086 if (ilim < 0 ||
dval(&
u) <= 5*ds)
4090 for(i = 1;; i++,
dval(&
u) *= 10.) {
4093#ifdef Check_FLT_ROUNDS
4100 *
s++ =
'0' + (int)L;
4108#ifdef Honor_FLT_ROUNDS
4112 case 2:
goto bump_up;
4119 if (
dval(&
u) > ds || (
dval(&
u) == ds && L & 1))
4142#ifndef Sudden_Underflow
4143 denorm ? be + (
Bias + (
P-1) - 1 + 1) :
4146 1 + 4*
P - 3 - bbits + ((bbits + be - 1) & 3);
4154 if (m2 > 0 && s2 > 0) {
4155 i = m2 < s2 ? m2 : s2;
4163 mhi = pow5mult(mhi, m5);
4172 b = pow5mult(b, b5);
4176 S = pow5mult(
S, s5);
4181 if ((
mode < 2 || leftright)
4182#ifdef Honor_FLT_ROUNDS
4187#ifndef Sudden_Underflow
4216 b = multadd(b, 10, 0);
4218 mhi = multadd(mhi, 10, 0);
4222 if (ilim <= 0 && (
mode == 3 ||
mode == 5)) {
4223 if (ilim < 0 || cmp(b,
S = multadd(
S,5,0)) <= 0) {
4236 mhi = lshift(mhi, m2);
4244 mhi = Balloc(mhi->
k);
4246 mhi = lshift(mhi,
Log2P);
4250 dig = quorem(b,
S) +
'0';
4255 delta = diff(
S, mhi);
4256 j1 = delta->
sign ? 1 : cmp(b, delta);
4260#ifdef Honor_FLT_ROUNDS
4269 else if (!b->
x[0] && b->
wds <= 1)
4276 if (
j < 0 || (
j == 0 &&
mode != 1
4281 if (!b->
x[0] && b->
wds <= 1) {
4287#ifdef Honor_FLT_ROUNDS
4290 case 0:
goto accept_dig;
4291 case 2:
goto keep_dig;
4300 if ((j1 > 0 || (j1 == 0 && dig & 1))
4310#ifdef Honor_FLT_ROUNDS
4322#ifdef Honor_FLT_ROUNDS
4328 b = multadd(b, 10, 0);
4330 mlo = mhi = multadd(mhi, 10, 0);
4332 mlo = multadd(mlo, 10, 0);
4333 mhi = multadd(mhi, 10, 0);
4339 *
s++ = dig = quorem(b,
S) +
'0';
4340 if (!b->
x[0] && b->
wds <= 1) {
4348 b = multadd(b, 10, 0);
4353#ifdef Honor_FLT_ROUNDS
4355 case 0:
goto trimzeros;
4356 case 2:
goto roundoff;
4364 if (
j > 0 || (
j == 0 && dig & 1))
4377#ifdef Honor_FLT_ROUNDS
4386 if (mlo && mlo != mhi)
4399 else if (!oldinexact)
4412 const char *
s = str;
4417 if (*
s ==
'0' && (
s[1] ==
'x' ||
s[1] ==
'X')) {
4421 while ((c = *
s++)) {
4422 if (c >=
'0' && c <=
'9') {
4424 }
else if (c >=
'A' && c <=
'F') {
4426 }
else if (c >=
'a' && c <=
'f') {
4445 const char *
s = str;
4450 if (str[0] ==
'\0') {
4457 while ((c = *
s++)) {
4458 if (c <
'0' || c >
'7') {
4477 const char *
s = str;
4482 if (
'0' == *
s && (
'b' ==
s[1] ||
'B' ==
s[1])) {
4486 while ((c = *
s++)) {
4492 if (
'0' == c ||
'1' == c)
4507 *
endptr = (
char *)(any ?
s - 1 : str);
4515 char *digits, *dst, *src;
4518 int mode = ndigit >= 0 ? 2 : 0;
4524 if (decpt == 9999) {
4529 snprintf(
buf, ndigit + 1,
"%s%s", (
sign && *digits ==
'I') ?
"-" :
"", *digits ==
'I' ?
"INF" :
"NAN");
4539 if ((decpt >= 0 && decpt > ndigit) || decpt < -3) {
4555 }
while (*src !=
'\0');
4564 *dst++ =
'0' + decpt;
4569 for (
n = decpt, i = 0; (
n /= 10) != 0; i++);
4571 while (decpt != 0) {
4572 dst[i--] =
'0' + decpt % 10;
4576 }
else if (decpt < 0) {
4582 }
while (++decpt < 0);
4584 while (*src !=
'\0') {
4590 for (i = 0, src = digits; i < decpt; i++) {
4598 if (src == digits) {
4602 for (i = decpt; digits[i] !=
'\0'; i++) {
4612static void destroy_freelist(
void)
4620 while ((tmp = *listp) !=
NULL) {
4629static void free_p5s(
void)
fprintf($stream, string $format, mixed ... $values)
zend_ffi_ctype_name_buf buf
file_private int match(struct magic_set *, struct magic *, size_t, const struct buffer *, size_t, int, int, int, uint16_t *, uint16_t *, int *, int *, int *, int *, int *)
ZEND_API ZEND_COLD ZEND_NORETURN void zend_error_noreturn(int type, const char *format,...)
defined(string $constant_name)
#define rounded_product(a, b)
ZEND_API void zend_freedtoa(char *s)
ZEND_API double zend_bin_strtod(const char *str, const char **endptr)
#define FREE_DTOA_LOCK(n)
ZEND_API double zend_hex_strtod(const char *str, const char **endptr)
#define rounded_quotient(a, b)
ZEND_API double zend_oct_strtod(const char *str, const char **endptr)
ZEND_API char * zend_dtoa(double dd, int mode, int ndigits, int *decpt, bool *sign, char **rve)
ZEND_API int zend_shutdown_strtod(void)
ZEND_API double zend_strtod(const char *s00, const char **se)
#define Storeinc(a, b, c)
#define ACQUIRE_DTOA_LOCK(n)
ZEND_API char * zend_gcvt(double value, int ndigit, char dec_point, char exponent, char *buf)