155#ifdef WORDS_BIGENDIAN 
  156#define IEEE_BIG_ENDIAN 
  158#define IEEE_LITTLE_ENDIAN 
  163#undef IEEE_BIG_ENDIAN 
  164#undef IEEE_LITTLE_ENDIAN 
  167#if defined(__arm__) && !defined(__VFP_FP__) 
  168#define IEEE_BIG_ENDIAN 
  169#undef IEEE_LITTLE_ENDIAN 
  180#if (INT_MAX >> 30) && !(INT_MAX >> 31) 
  182#define ULong unsigned int 
  183#elif (LONG_MAX >> 30) && !(LONG_MAX >> 31) 
  185#define ULong unsigned long int 
  187#error No 32bit integer 
  190#if defined(HAVE_LONG_LONG) && (HAVE_LONG_LONG) 
  191#define Llong LONG_LONG 
  198#define Bug(x) {fprintf(stderr, "%s\n", (x)); exit(EXIT_FAILURE);} 
  203#define ISDIGIT(c) isdigit(c) 
  213#if defined(HAVE_STDCKDINT_H) || !defined(__has_include) 
  214#elif __has_include(<stdckdint.h>) 
  215# define HAVE_STDCKDINT_H 1 
  217#ifdef HAVE_STDCKDINT_H 
  218# include <stdckdint.h> 
  223ckd_add(
int *result, 
int x, 
int y)
 
  226        if (y < INT_MIN - x) 
return 1;
 
  229        if (y > INT_MAX - x) 
return 1;
 
  237extern void *MALLOC(
size_t);
 
  242extern void FREE(
void*);
 
  247#define NO_SANITIZE(x, y) y 
  251#undef Avoid_Underflow 
  252#ifdef IEEE_BIG_ENDIAN 
  255#ifdef IEEE_LITTLE_ENDIAN 
  263#define DBL_MAX_10_EXP 308 
  264#define DBL_MAX_EXP 1024 
  270#define DBL_MAX_10_EXP 75 
  271#define DBL_MAX_EXP 63 
  273#define DBL_MAX 7.2370055773322621e+75 
  278#define DBL_MAX_10_EXP 38 
  279#define DBL_MAX_EXP 127 
  281#define DBL_MAX 1.7014118346046923e+38 
  285#define LONG_MAX 2147483647 
  302static const char hexdigit[] = 
"0123456789abcdef0123456789ABCDEF";
 
  305#if defined(IEEE_LITTLE_ENDIAN) + defined(IEEE_BIG_ENDIAN) + defined(VAX) + defined(IBM) != 1 
  306Exactly one of IEEE_LITTLE_ENDIAN, IEEE_BIG_ENDIAN, VAX, or IBM should be defined.
 
  309typedef union { 
double d; ULong L[2]; } 
U;
 
  314#  ifdef IEEE_LITTLE_ENDIAN 
  315#    define word0(x) (((ULong *)&(x))[1]) 
  316#    define word1(x) (((ULong *)&(x))[0]) 
  318#    define word0(x) (((ULong *)&(x))[0]) 
  319#    define word1(x) (((ULong *)&(x))[1]) 
  323#  ifdef IEEE_LITTLE_ENDIAN 
  324#    define word0(x) ((x).L[1]) 
  325#    define word1(x) ((x).L[0]) 
  327#    define word0(x) ((x).L[0]) 
  328#    define word1(x) ((x).L[1]) 
  330#  define dval(x) ((x).d) 
  337#if defined(IEEE_LITTLE_ENDIAN) + defined(VAX) + defined(__arm__) 
  338#define Storeinc(a,b,c) (((unsigned short *)(a))[1] = (unsigned short)(b), \ 
  339((unsigned short *)(a))[0] = (unsigned short)(c), (a)++) 
  341#define Storeinc(a,b,c) (((unsigned short *)(a))[0] = (unsigned short)(b), \ 
  342((unsigned short *)(a))[1] = (unsigned short)(c), (a)++) 
  354#define Exp_msk1    0x100000 
  355#define Exp_msk11   0x100000 
  356#define Exp_mask  0x7ff00000 
  360#define Exp_1  0x3ff00000 
  361#define Exp_11 0x3ff00000 
  363#define Frac_mask  0xfffff 
  364#define Frac_mask1 0xfffff 
  367#define Bndry_mask  0xfffff 
  368#define Bndry_mask1 0xfffff 
  370#define Sign_bit 0x80000000 
  377#define Avoid_Underflow 
  379#undef Sudden_Underflow 
  385#define Flt_Rounds FLT_ROUNDS 
  391#ifdef Honor_FLT_ROUNDS 
  392#define Rounding rounding 
  393#undef Check_FLT_ROUNDS 
  394#define Check_FLT_ROUNDS 
  396#define Rounding Flt_Rounds 
  400#undef Check_FLT_ROUNDS 
  401#undef Honor_FLT_ROUNDS 
  403#undef  Sudden_Underflow 
  404#define Sudden_Underflow 
  410#define Exp_msk1   0x1000000 
  411#define Exp_msk11  0x1000000 
  412#define Exp_mask  0x7f000000 
  415#define Exp_1  0x41000000 
  416#define Exp_11 0x41000000 
  418#define Frac_mask  0xffffff 
  419#define Frac_mask1 0xffffff 
  422#define Bndry_mask  0xefffff 
  423#define Bndry_mask1 0xffffff 
  425#define Sign_bit 0x80000000 
  427#define Tiny0 0x100000 
  437#define Exp_msk11   0x800000 
  438#define Exp_mask  0x7f80 
  441#define Exp_1  0x40800000 
  444#define Frac_mask  0x7fffff 
  445#define Frac_mask1 0xffff007f 
  448#define Bndry_mask  0xffff007f 
  449#define Bndry_mask1 0xffff007f 
  451#define Sign_bit 0x8000 
  465#define rounded_product(a,b) ((a) = rnd_prod((a), (b))) 
  466#define rounded_quotient(a,b) ((a) = rnd_quot((a), (b))) 
  467extern double rnd_prod(
double, 
double), rnd_quot(
double, 
double);
 
  469#define rounded_product(a,b) ((a) *= (b)) 
  470#define rounded_quotient(a,b) ((a) /= (b)) 
  473#define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1)) 
  474#define Big1 0xffffffff 
  480#define FFFFFFFF 0xffffffffUL 
  494#define Llong long long 
  497#define ULLong unsigned Llong 
  501#define MULTIPLE_THREADS 1 
  503#ifndef MULTIPLE_THREADS 
  504#define ACQUIRE_DTOA_LOCK(n)     
  505#define FREE_DTOA_LOCK(n)        
  507#define ACQUIRE_DTOA_LOCK(n)     
  508#define FREE_DTOA_LOCK(n)        
  511#ifndef ATOMIC_PTR_CAS 
  512#define ATOMIC_PTR_CAS(var, old, new) ((var) = (new), (void *)(old)) 
  518#define UNLIKELY(x) (x) 
  521#define ASSUME(x) (void)(x) 
  528    int k, maxwds, sign, wds;
 
 
  541    rv = (
Bigint *)MALLOC(
sizeof(
Bigint) + (x-1)*
sizeof(ULong));
 
  542    if (!rv) 
return NULL;
 
  545    rv->sign = rv->wds = 0;
 
  555#define Bcopy(x,y) memcpy((char *)&(x)->sign, (char *)&(y)->sign, \ 
  556(y)->wds*sizeof(Long) + 2*sizeof(int)) 
  559multadd(
Bigint *b, 
int m, 
int a)   
 
  579        y = *x * (ULLong)m + carry;
 
  581        *x++ = (ULong)(y & FFFFFFFF);
 
  585        y = (xi & 0xffff) * m + carry;
 
  586        z = (xi >> 16) * m + (y >> 16);
 
  588        *x++ = (z << 16) + (y & 0xffff);
 
  597        if (wds >= b->maxwds) {
 
  607        b->x[wds++] = (ULong)carry;
 
  614s2b(
const char *s, 
int nd0, 
int nd, ULong y9)
 
  621    for (k = 0, y = 1; x > y; y <<= 1, k++) ;
 
  630    b->x[0] = y9 & 0xffff;
 
  631    b->wds = (b->x[1] = y9 >> 16) ? 2 : 1;
 
  638            b = multadd(b, 10, *s++ - 
'0');
 
  645    for (; i < nd; i++) {
 
  646        b = multadd(b, 10, *s++ - 
'0');
 
  653hi0bits(
register ULong x)
 
  657    if (!(x & 0xffff0000)) {
 
  661    if (!(x & 0xff000000)) {
 
  665    if (!(x & 0xf0000000)) {
 
  669    if (!(x & 0xc0000000)) {
 
  673    if (!(x & 0x80000000)) {
 
  675        if (!(x & 0x40000000))
 
  685    register ULong x = *y;
 
  736#define Bzero_p(b) (!(b)->x[0] && (b)->wds <= 1) 
  743    ULong *x, *xa, *xae, *xb, *xbe, *xc, *xc0;
 
  754    if (Bzero_p(a) || Bzero_p(b)) {
 
  762    if (a->wds < b->wds) {
 
  775    for (x = c->x, xa = x + wc; x < xa; x++)
 
  783    for (; xb < xbe; xc0++) {
 
  784        if ((y = *xb++) != 0) {
 
  789                z = *x++ * (ULLong)y + *xc + carry;
 
  791                *xc++ = (ULong)(z & FFFFFFFF);
 
  798    for (; xb < xbe; xb++, xc0++) {
 
  799        if ((y = *xb & 0xffff) != 0) {
 
  804                z = (*x & 0xffff) * y + (*xc & 0xffff) + carry;
 
  806                z2 = (*x++ >> 16) * y + (*xc >> 16) + carry;
 
  812        if ((y = *xb >> 16) != 0) {
 
  818                z = (*x & 0xffff) * y + (*xc >> 16) + carry;
 
  821                z2 = (*x++ >> 16) * y + (*xc & 0xffff) + carry;
 
  828    for (; xb < xbe; xc0++) {
 
  834                z = *x++ * y + *xc + carry;
 
  843    for (xc0 = c->x, xc = xc0 + wc; wc > 0 && !*--xc; --wc) ;
 
  855    static const int p05[3] = { 5, 25, 125 };
 
  857    if ((i = k & 3) != 0) {
 
  858        b = multadd(b, p05[i-1], 0);
 
  862#define b_cache(var, addr, new_expr) \ 
  863    if ((var = addr) != 0) {} else { \ 
  865        ACQUIRE_DTOA_LOCK(1); \ 
  866        if (!(var = addr) && (var = (new_expr)) != 0) { \ 
  868            tmp = ATOMIC_PTR_CAS(addr, NULL, var); \ 
  871        if (UNLIKELY(tmp)) { \ 
  884    b_cache(p5, p5s, i2b(625));
 
  894        b_cache(p51, p5->next, mult(p5, p5));
 
  905    ULong *x, *x1, *xe, z;
 
  907    if (!k || Bzero_p(b)) 
return b;
 
  916    for (i = b->maxwds; n1 > i; i <<= 1)
 
  924    for (i = 0; i < n; i++)
 
  944            *x1++ = *x << k  & 0xffff | z;
 
  963    ULong *xa, *xa0, *xb, *xb0;
 
  969    if (i > 1 && !a->x[i-1])
 
  970        Bug(
"cmp called with a->x[a->wds-1] == 0");
 
  971    if (j > 1 && !b->x[j-1])
 
  972        Bug(
"cmp called with b->x[b->wds-1] == 0");
 
  982            return *xa < *xb ? -1 : 1;
 
  995    ULong *xa, *xae, *xb, *xbe, *xc;
 
 1008        if (!c) 
return NULL;
 
 1022    if (!c) 
return NULL;
 
 1034        y = (ULLong)*xa++ - *xb++ - borrow;
 
 1035        borrow = y >> 32 & (ULong)1;
 
 1036        *xc++ = (ULong)(y & FFFFFFFF);
 
 1040        borrow = y >> 32 & (ULong)1;
 
 1041        *xc++ = (ULong)(y & FFFFFFFF);
 
 1046        y = (*xa & 0xffff) - (*xb & 0xffff) - borrow;
 
 1047        borrow = (y & 0x10000) >> 16;
 
 1048        z = (*xa++ >> 16) - (*xb++ >> 16) - borrow;
 
 1049        borrow = (z & 0x10000) >> 16;
 
 1053        y = (*xa & 0xffff) - borrow;
 
 1054        borrow = (y & 0x10000) >> 16;
 
 1055        z = (*xa++ >> 16) - borrow;
 
 1056        borrow = (z & 0x10000) >> 16;
 
 1061        y = *xa++ - *xb++ - borrow;
 
 1062        borrow = (y & 0x10000) >> 16;
 
 1067        borrow = (y & 0x10000) >> 16;
 
 1085    L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1;
 
 1086#ifndef Avoid_Underflow 
 1087#ifndef Sudden_Underflow 
 1096#ifndef Avoid_Underflow 
 1097#ifndef Sudden_Underflow 
 1100        L = -L >> Exp_shift;
 
 1101        if (L < Exp_shift) {
 
 1102            word0(a) = 0x80000 >> L;
 
 1108            word1(a) = L >= 31 ? 1 : 1 << 31 - L;
 
 1119    ULong *xa, *xa0, w, y, z;
 
 1133    if (!y) Bug(
"zero y in b2d");
 
 1139        d0 = Exp_1 | y >> (Ebits - k);
 
 1140        w = xa > xa0 ? *--xa : 0;
 
 1141        d1 = y << ((32-Ebits) + k) | w >> (Ebits - k);
 
 1144    z = xa > xa0 ? *--xa : 0;
 
 1146        d0 = Exp_1 | y << k | z >> (32 - k);
 
 1147        y = xa > xa0 ? *--xa : 0;
 
 1148        d1 = z << k | y >> (32 - k);
 
 1155    if (k < Ebits + 16) {
 
 1156        z = xa > xa0 ? *--xa : 0;
 
 1157        d0 = Exp_1 | y << k - Ebits | z >> Ebits + 16 - k;
 
 1158        w = xa > xa0 ? *--xa : 0;
 
 1159        y = xa > xa0 ? *--xa : 0;
 
 1160        d1 = z << k + 16 - Ebits | w << k - Ebits | y >> 16 + Ebits - k;
 
 1163    z = xa > xa0 ? *--xa : 0;
 
 1164    w = xa > xa0 ? *--xa : 0;
 
 1166    d0 = Exp_1 | y << k + 16 | z << k | w >> 16 - k;
 
 1167    y = xa > xa0 ? *--xa : 0;
 
 1168    d1 = w << k + 16 | y << k;
 
 1172    word0(d) = d0 >> 16 | d0 << 16;
 
 1173    word1(d) = d1 >> 16 | d1 << 16;
 
 1182d2b(
double d_, 
int *e, 
int *bits)
 
 1188#ifndef Sudden_Underflow 
 1196    d0 = word0(d) >> 16 | word0(d) << 16;
 
 1197    d1 = word1(d) >> 16 | word1(d) << 16;
 
 1208    if (!b) 
return NULL;
 
 1213#ifdef Sudden_Underflow 
 1214    de = (int)(d0 >> Exp_shift);
 
 1219    if ((de = (
int)(d0 >> Exp_shift)) != 0)
 
 1223    if ((y = d1) != 0) {
 
 1224        if ((k = lo0bits(&y)) != 0) {
 
 1225            x[0] = y | z << (32 - k);
 
 1230#ifndef Sudden_Underflow 
 1233        b->wds = (x[1] = z) ? 2 : 1;
 
 1238            Bug(
"Zero passed to d2b");
 
 1242#ifndef Sudden_Underflow 
 1250        if (k = lo0bits(&y))
 
 1252                x[0] = y | z << 32 - k & 0xffff;
 
 1253                x[1] = z >> k - 16 & 0xffff;
 
 1259                x[1] = y >> 16 | z << 16 - k & 0xffff;
 
 1260                x[2] = z >> k & 0xffff;
 
 1275            Bug(
"Zero passed to d2b");
 
 1293#ifndef Sudden_Underflow 
 1297        *e = (de - Bias - (P-1) << 2) + k;
 
 1298        *bits = 4*P + 8 - k - hi0bits(word0(d) & Frac_mask);
 
 1300        *e = de - Bias - (P-1) + k;
 
 1303#ifndef Sudden_Underflow 
 1306        *e = de - Bias - (P-1) + 1 + k;
 
 1308        *bits = 32*i - hi0bits(x[i-1]);
 
 1310        *bits = (i+2)*16 - hi0bits(x[i]);
 
 1325    dval(da) = b2d(a, &ka);
 
 1326    dval(db) = b2d(b, &kb);
 
 1328    k = ka - kb + 32*(a->wds - b->wds);
 
 1330    k = ka - kb + 16*(a->wds - b->wds);
 
 1334        word0(da) += (k >> 2)*Exp_msk1;
 
 1340        word0(db) += (k >> 2)*Exp_msk1;
 
 1346        word0(da) += k*Exp_msk1;
 
 1349        word0(db) += k*Exp_msk1;
 
 1352    return dval(da) / dval(db);
 
 1357    1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9,
 
 1358    1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19,
 
 1367bigtens[] = { 1e16, 1e32, 1e64, 1e128, 1e256 };
 
 1368static const double tinytens[] = { 1e-16, 1e-32, 1e-64, 1e-128,
 
 1369#ifdef Avoid_Underflow 
 1370    9007199254740992.*9007199254740992.e-256
 
 1378#define Scale_Bit 0x10 
 1382bigtens[] = { 1e16, 1e32, 1e64 };
 
 1383static const double tinytens[] = { 1e-16, 1e-32, 1e-64 };
 
 1386bigtens[] = { 1e16, 1e32 };
 
 1387static const double tinytens[] = { 1e-16, 1e-32 };
 
 1399#define NAN_WORD0 0x7ff80000 
 1407match(
const char **sp, 
char *t)
 
 1410    const char *s = *sp;
 
 1413        if ((c = *++s) >= 
'A' && c <= 
'Z')
 
 1424hexnan(
double *rvp, 
const char **sp)
 
 1428    int havedig, udx0, xshift;
 
 1431    havedig = xshift = 0;
 
 1434    while (c = *(
const unsigned char*)++s) {
 
 1435        if (c >= 
'0' && c <= 
'9')
 
 1437        else if (c >= 
'a' && c <= 
'f')
 
 1439        else if (c >= 
'A' && c <= 
'F')
 
 1441        else if (c <= 
' ') {
 
 1442            if (udx0 && havedig) {
 
 1448        else if ( c == 
')' && havedig) {
 
 1461            x[0] = (x[0] << 4) | (x[1] >> 28);
 
 1462        x[1] = (x[1] << 4) | c;
 
 1464    if ((x[0] &= 0xfffff) || x[1]) {
 
 1465        word0(*rvp) = Exp_mask | x[0];
 
 1472NO_SANITIZE(
"unsigned-integer-overflow", 
double strtod(
const char *s00, 
char **se));
 
 1474strtod(
const char *s00, 
char **se)
 
 1476#ifdef Avoid_Underflow 
 1479    int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, dsign,
 
 1480         e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign;
 
 1481    const char *s, *s0, *s1;
 
 1486    Bigint *bb, *bb1, *bd, *bd0, *bs, *delta;
 
 1488    int inexact, oldinexact;
 
 1490#ifdef Honor_FLT_ROUNDS 
 1498    sign = nz0 = nz = 0;
 
 1523        if (s[1] == 
'x' || s[1] == 
'X') {
 
 1529            if (!*++s || (!(s1 = strchr(hexdigit, *s)) && *s != 
'.')) 
goto ret0;
 
 1531                while (*++s == 
'0');
 
 1533                s1 = strchr(hexdigit, *s);
 
 1537                    adj += aadj * ((s1 - hexdigit) & 15);
 
 1540                } 
while (*++s && (s1 = strchr(hexdigit, *s)));
 
 1543            if ((*s == 
'.') && *++s && (s1 = strchr(hexdigit, *s))) {
 
 1550                for (; *s && (s1 = strchr(hexdigit, *s)); ++s) {
 
 1551                    adj += aadj * ((s1 - hexdigit) & 15);
 
 1552                    if ((aadj /= 16) == 0.0) {
 
 1553                        while (*++s && strchr(hexdigit, *s));
 
 1559            if (*s == 
'P' || *s == 
'p') {
 
 1560                dsign = 0x2C - *++s; 
 
 1561                if (abs(dsign) == 1) s++;
 
 1566                if (c < 
'0' || 
'9' < c) 
goto ret0;
 
 1573                    if (nd + dsign * nd0 > 2095) {
 
 1574                        while (
'0' <= c && c <= 
'9') c = *++s;
 
 1577                } 
while (
'0' <= c && c <= 
'9');
 
 1580            dval(rv) = ldexp(adj, nd0);
 
 1584        while (*++s == 
'0') ;
 
 1590    for (nd = nf = 0; (c = *s) >= 
'0' && c <= 
'9'; nd++, s++)
 
 1593        else if (nd < DBL_DIG + 2)
 
 1597    s1 = localeconv()->decimal_point;
 
 1620            for (; c == 
'0'; c = *++s)
 
 1622            if (c > 
'0' && c <= 
'9') {
 
 1630        for (; c >= 
'0' && c <= 
'9'; c = *++s) {
 
 1633            if (nd > DBL_DIG * 4) {
 
 1638                for (i = 1; i < nz; i++)
 
 1641                    else if (nd <= DBL_DIG + 2)
 
 1645                else if (nd <= DBL_DIG + 2)
 
 1653    if (c == 
'e' || c == 
'E') {
 
 1654        if (!nd && !nz && !nz0) {
 
 1665        if (c >= 
'0' && c <= 
'9') {
 
 1668            if (c > 
'0' && c <= 
'9') {
 
 1671                while ((c = *++s) >= 
'0' && c <= 
'9')
 
 1673                if (s - s1 > 8 || L > 19999)
 
 1696                if (match(&s,
"nf")) {
 
 1698                    if (!match(&s,
"inity"))
 
 1700                    word0(rv) = 0x7ff00000;
 
 1707                if (match(&s, 
"an")) {
 
 1708                    word0(rv) = NAN_WORD0;
 
 1709                    word1(rv) = NAN_WORD1;
 
 1733    k = nd < DBL_DIG + 2 ? nd : DBL_DIG + 2;
 
 1738            oldinexact = get_inexact();
 
 1740        dval(rv) = tens[k - 9] * dval(rv) + z;
 
 1742    bd0 = bb = bd = bs = delta = 0;
 
 1745#ifndef Honor_FLT_ROUNDS
 
 1753            if (e <= Ten_pmax) {
 
 1755                goto vax_ovfl_check;
 
 1757#ifdef Honor_FLT_ROUNDS 
 1760                    dval(rv) = -dval(rv);
 
 1764                 rounded_product(dval(rv), tens[e]);
 
 1769            if (e <= Ten_pmax + i) {
 
 1773#ifdef Honor_FLT_ROUNDS 
 1776                    dval(rv) = -dval(rv);
 
 1781                dval(rv) *= tens[i];
 
 1787                word0(rv) -= P*Exp_msk1;
 
 1788                 rounded_product(dval(rv), tens[e]);
 
 1789                if ((word0(rv) & Exp_mask)
 
 1790                        > Exp_msk1*(DBL_MAX_EXP+Bias-1-P))
 
 1792                word0(rv) += P*Exp_msk1;
 
 1794                 rounded_product(dval(rv), tens[e]);
 
 1799#ifndef Inaccurate_Divide 
 1800        else if (e >= -Ten_pmax) {
 
 1801#ifdef Honor_FLT_ROUNDS 
 1804                dval(rv) = -dval(rv);
 
 1808             rounded_quotient(dval(rv), tens[-e]);
 
 1819        oldinexact = get_inexact();
 
 1821#ifdef Avoid_Underflow 
 1824#ifdef Honor_FLT_ROUNDS 
 1825    if ((rounding = Flt_Rounds) >= 2) {
 
 1827            rounding = rounding == 2 ? 0 : 2;
 
 1838        if ((i = e1 & 15) != 0)
 
 1839            dval(rv) *= tens[i];
 
 1841            if (e1 > DBL_MAX_10_EXP) {
 
 1848#ifdef Honor_FLT_ROUNDS 
 1856                    word0(rv) = Exp_mask;
 
 1860                word0(rv) = Exp_mask;
 
 1866                dval(rv0) *= dval(rv0);
 
 1877            for (j = 0; e1 > 1; j++, e1 >>= 1)
 
 1879                    dval(rv) *= bigtens[j];
 
 1881            word0(rv) -= P*Exp_msk1;
 
 1882            dval(rv) *= bigtens[j];
 
 1883            if ((z = word0(rv) & Exp_mask)
 
 1884                    > Exp_msk1*(DBL_MAX_EXP+Bias-P))
 
 1886            if (z > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) {
 
 1893                word0(rv) += P*Exp_msk1;
 
 1898        if ((i = e1 & 15) != 0)
 
 1899            dval(rv) /= tens[i];
 
 1901            if (e1 >= 1 << n_bigtens)
 
 1903#ifdef Avoid_Underflow 
 1906            for (j = 0; e1 > 0; j++, e1 >>= 1)
 
 1908                    dval(rv) *= tinytens[j];
 
 1909            if (scale && (j = 2*P + 1 - ((word0(rv) & Exp_mask)
 
 1910                    >> Exp_shift)) > 0) {
 
 1915                        word0(rv) = (P+2)*Exp_msk1;
 
 1917                        word0(rv) &= 0xffffffff << (j-32);
 
 1920                    word1(rv) &= 0xffffffff << j;
 
 1923            for (j = 0; e1 > 1; j++, e1 >>= 1)
 
 1925                    dval(rv) *= tinytens[j];
 
 1927            dval(rv0) = dval(rv);
 
 1928            dval(rv) *= tinytens[j];
 
 1930                dval(rv) = 2.*dval(rv0);
 
 1931                dval(rv) *= tinytens[j];
 
 1943#ifndef Avoid_Underflow 
 1958    bd0 = s2b(s0, nd0, nd, y);
 
 1962        bd = Balloc(bd0->k);
 
 1963        if (!bd) 
goto retfree;
 
 1965        bb = d2b(dval(rv), &bbe, &bbbits);  
 
 1966        if (!bb) 
goto retfree;
 
 1968        if (!bs) 
goto retfree;
 
 1983#ifdef Honor_FLT_ROUNDS 
 1987#ifdef Avoid_Underflow 
 1995#ifdef Sudden_Underflow 
 1997        j = 1 + 4*P - 3 - bbbits + ((bbe + bbbits - 1) & 3);
 
 2012#ifdef Avoid_Underflow 
 2015        i = bb2 < bd2 ? bb2 : bd2;
 
 2024            bs = pow5mult(bs, bb5);
 
 2025            if (!bs) 
goto retfree;
 
 2029            if (!bb) 
goto retfree;
 
 2032            bb = lshift(bb, bb2);
 
 2033            if (!bb) 
goto retfree;
 
 2036            bd = pow5mult(bd, bd5);
 
 2037            if (!bd) 
goto retfree;
 
 2040            bd = lshift(bd, bd2);
 
 2041            if (!bd) 
goto retfree;
 
 2044            bs = lshift(bs, bs2);
 
 2045            if (!bs) 
goto retfree;
 
 2047        delta = diff(bb, bd);
 
 2048        if (!delta) 
goto retfree;
 
 2049        dsign = delta->sign;
 
 2052#ifdef Honor_FLT_ROUNDS 
 2053        if (rounding != 1) {
 
 2056                if (!delta->x[0] && delta->wds <= 1) {
 
 2072                     && !(word0(rv) & Frac_mask)) {
 
 2073                        y = word0(rv) & Exp_mask;
 
 2074#ifdef Avoid_Underflow 
 2075                        if (!scale || y > 2*P*Exp_msk1)
 
 2080                            delta = lshift(delta,Log2P);
 
 2081                            if (!delta) 
goto nomem;
 
 2082                            if (cmp(delta, bs) <= 0)
 
 2087#ifdef Avoid_Underflow 
 2088                    if (scale && (y = word0(rv) & Exp_mask)
 
 2090                        word0(adj) += (2*P+1)*Exp_msk1 - y;
 
 2092#ifdef Sudden_Underflow 
 2093                    if ((word0(rv) & Exp_mask) <=
 
 2095                        word0(rv) += P*Exp_msk1;
 
 2096                        dval(rv) += adj*ulp(dval(rv));
 
 2097                        word0(rv) -= P*Exp_msk1;
 
 2102                    dval(rv) += adj*ulp(dval(rv));
 
 2106            adj = ratio(delta, bs);
 
 2109            if (adj <= 0x7ffffffe) {
 
 2113                    if (!((rounding>>1) ^ dsign))
 
 2118#ifdef Avoid_Underflow 
 2119            if (scale && (y = word0(rv) & Exp_mask) <= 2*P*Exp_msk1)
 
 2120                word0(adj) += (2*P+1)*Exp_msk1 - y;
 
 2122#ifdef Sudden_Underflow 
 2123            if ((word0(rv) & Exp_mask) <= P*Exp_msk1) {
 
 2124                word0(rv) += P*Exp_msk1;
 
 2125                adj *= ulp(dval(rv));
 
 2130                word0(rv) -= P*Exp_msk1;
 
 2135            adj *= ulp(dval(rv));
 
 2148            if (dsign || word1(rv) || word0(rv) & Bndry_mask
 
 2150#ifdef Avoid_Underflow
 
 2151                || (word0(rv) & Exp_mask) <= (2*P+1)*Exp_msk1
 
 2153                || (word0(rv) & Exp_mask) <= Exp_msk1
 
 2158                if (!delta->x[0] && delta->wds <= 1)
 
 2163            if (!delta->x[0] && delta->wds <= 1) {
 
 2170            delta = lshift(delta,Log2P);
 
 2171            if (!delta) 
goto retfree;
 
 2172            if (cmp(delta, bs) > 0)
 
 2179                if ((word0(rv) & Bndry_mask1) == Bndry_mask1
 
 2181#ifdef Avoid_Underflow
 
 2182                        (scale && (y = word0(rv) & Exp_mask) <= 2*P*Exp_msk1)
 
 2183                        ? (0xffffffff & (0xffffffff << (2*P+1-(y>>Exp_shift)))) :
 
 2187                    word0(rv) = (word0(rv) & Exp_mask)
 
 2194#ifdef Avoid_Underflow 
 2200            else if (!(word0(rv) & Bndry_mask) && !word1(rv)) {
 
 2203#ifdef Sudden_Underflow  
 2204                L = word0(rv) & Exp_mask;
 
 2208#ifdef Avoid_Underflow 
 2209                if (L <= (scale ? (2*P+1)*Exp_msk1 : Exp_msk1))
 
 2217#ifdef Avoid_Underflow 
 2219                    L = word0(rv) & Exp_mask;
 
 2220                    if (L <= (2*P+1)*Exp_msk1) {
 
 2221                        if (L > (P+2)*Exp_msk1)
 
 2230                L = (word0(rv) & Exp_mask) - Exp_msk1;
 
 2232                word0(rv) = L | Bndry_mask1;
 
 2233                word1(rv) = 0xffffffff;
 
 2241            if (!(word1(rv) & LSB))
 
 2245                dval(rv) += ulp(dval(rv));
 
 2248                dval(rv) -= ulp(dval(rv));
 
 2249#ifndef Sudden_Underflow 
 2254#ifdef Avoid_Underflow 
 2260        if ((aadj = ratio(delta, bs)) <= 2.) {
 
 2262                aadj = dval(aadj1) = 1.;
 
 2263            else if (word1(rv) || word0(rv) & Bndry_mask) {
 
 2264#ifndef Sudden_Underflow 
 2265                if (word1(rv) == Tiny1 && !word0(rv))
 
 2275                if (aadj < 2./FLT_RADIX)
 
 2276                    aadj = 1./FLT_RADIX;
 
 2279                dval(aadj1) = -aadj;
 
 2284            dval(aadj1) = dsign ? aadj : -aadj;
 
 2285#ifdef Check_FLT_ROUNDS 
 2295            if (Flt_Rounds == 0)
 
 2299        y = word0(rv) & Exp_mask;
 
 2303        if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) {
 
 2304            dval(rv0) = dval(rv);
 
 2305            word0(rv) -= P*Exp_msk1;
 
 2306            adj = dval(aadj1) * ulp(dval(rv));
 
 2308            if ((word0(rv) & Exp_mask) >=
 
 2309                    Exp_msk1*(DBL_MAX_EXP+Bias-P)) {
 
 2310                if (word0(rv0) == Big0 && word1(rv0) == Big1)
 
 2317                word0(rv) += P*Exp_msk1;
 
 2320#ifdef Avoid_Underflow 
 2321            if (scale && y <= 2*P*Exp_msk1) {
 
 2322                if (aadj <= 0x7fffffff) {
 
 2323                    if ((z = (
int)aadj) <= 0)
 
 2326                    dval(aadj1) = dsign ? aadj : -aadj;
 
 2328                word0(aadj1) += (2*P+1)*Exp_msk1 - y;
 
 2330            adj = dval(aadj1) * ulp(dval(rv));
 
 2333#ifdef Sudden_Underflow 
 2334            if ((word0(rv) & Exp_mask) <= P*Exp_msk1) {
 
 2335                dval(rv0) = dval(rv);
 
 2336                word0(rv) += P*Exp_msk1;
 
 2337                adj = dval(aadj1) * ulp(dval(rv));
 
 2340                if ((word0(rv) & Exp_mask) <  P*Exp_msk1)
 
 2342                if ((word0(rv) & Exp_mask) <= P*Exp_msk1)
 
 2345                    if (word0(rv0) == Tiny0 && word1(rv0) == Tiny1)
 
 2352                    word0(rv) -= P*Exp_msk1;
 
 2355                adj = dval(aadj1) * ulp(dval(rv));
 
 2366            if (y <= (P-1)*Exp_msk1 && aadj > 1.) {
 
 2367                dval(aadj1) = (double)(
int)(aadj + 0.5);
 
 2369                    dval(aadj1) = -dval(aadj1);
 
 2371            adj = dval(aadj1) * ulp(dval(rv));
 
 2376        z = word0(rv) & Exp_mask;
 
 2378#ifdef Avoid_Underflow 
 2386            if (dsign || word1(rv) || word0(rv) & Bndry_mask) {
 
 2387                if (aadj < .4999999 || aadj > .5000001)
 
 2390            else if (aadj < .4999999/FLT_RADIX)
 
 2403            word0(rv0) = Exp_1 + (70 << Exp_shift);
 
 2408    else if (!oldinexact)
 
 2411#ifdef Avoid_Underflow 
 2413        word0(rv0) = Exp_1 - 2*P*Exp_msk1;
 
 2415        dval(rv) *= dval(rv0);
 
 2418        if (word0(rv) == 0 && word1(rv) == 0)
 
 2424    if (inexact && !(word0(rv) & Exp_mask)) {
 
 2427        dval(rv0) *= dval(rv0);
 
 2439    return sign ? -dval(rv) : dval(rv);
 
 2442NO_SANITIZE(
"unsigned-integer-overflow", 
static int quorem(
Bigint *b, 
Bigint *S));
 
 2447    ULong *bx, *bxe, q, *sx, *sxe;
 
 2449    ULLong borrow, carry, y, ys;
 
 2451    ULong borrow, carry, y, ys;
 
 2460       Bug(
"oversize b in quorem");
 
 2468    q = *bxe / (*sxe + 1);  
 
 2471       Bug(
"oversized quotient in quorem");
 
 2478            ys = *sx++ * (ULLong)q + carry;
 
 2480            y = *bx - (ys & FFFFFFFF) - borrow;
 
 2481            borrow = y >> 32 & (ULong)1;
 
 2482            *bx++ = (ULong)(y & FFFFFFFF);
 
 2486            ys = (si & 0xffff) * q + carry;
 
 2487            zs = (si >> 16) * q + (ys >> 16);
 
 2489            y = (*bx & 0xffff) - (ys & 0xffff) - borrow;
 
 2490            borrow = (y & 0x10000) >> 16;
 
 2491            z = (*bx >> 16) - (zs & 0xffff) - borrow;
 
 2492            borrow = (z & 0x10000) >> 16;
 
 2495            ys = *sx++ * q + carry;
 
 2497            y = *bx - (ys & 0xffff) - borrow;
 
 2498            borrow = (y & 0x10000) >> 16;
 
 2502        } 
while (sx <= sxe);
 
 2505            while (--bxe > bx && !*bxe)
 
 2510    if (cmp(b, S) >= 0) {
 
 2520            y = *bx - (ys & FFFFFFFF) - borrow;
 
 2521            borrow = y >> 32 & (ULong)1;
 
 2522            *bx++ = (ULong)(y & FFFFFFFF);
 
 2526            ys = (si & 0xffff) + carry;
 
 2527            zs = (si >> 16) + (ys >> 16);
 
 2529            y = (*bx & 0xffff) - (ys & 0xffff) - borrow;
 
 2530            borrow = (y & 0x10000) >> 16;
 
 2531            z = (*bx >> 16) - (zs & 0xffff) - borrow;
 
 2532            borrow = (z & 0x10000) >> 16;
 
 2537            y = *bx - (ys & 0xffff) - borrow;
 
 2538            borrow = (y & 0x10000) >> 16;
 
 2542        } 
while (sx <= sxe);
 
 2546            while (--bxe > bx && !*bxe)
 
 2554#ifndef MULTIPLE_THREADS 
 2555static char *dtoa_result;
 
 2558#ifndef MULTIPLE_THREADS 
 2562    return dtoa_result = MALLOC(i);
 
 2565#define rv_alloc(i) MALLOC(i) 
 2569nrv_alloc(
const char *s, 
char **rve, 
size_t n)
 
 2573    t = rv = rv_alloc(n);
 
 2574    if (!rv) 
return NULL;
 
 2575    while ((*t = *s++) != 0) t++;
 
 2581#define rv_strdup(s, rve) nrv_alloc((s), (rve), strlen(s)+1) 
 2583#ifndef MULTIPLE_THREADS 
 2597static const char INFSTR[] = 
"Infinity";
 
 2598static const char NANSTR[] = 
"NaN";
 
 2599static const char ZEROSTR[] = 
"0";
 
 2636dtoa(
double d_, 
int mode, 
int ndigits, 
int *decpt, 
int *sign, 
char **rve)
 
 2672    int bbits, b2, b5, be, dig, i, ieps, ilim, ilim0, ilim1,
 
 2673        j, j1, k, k0, k_check, leftright, m2, m5, s2, s5,
 
 2674        spec_case, try_quick, half = 0;
 
 2676#ifndef Sudden_Underflow 
 2680    Bigint *b, *b1, *delta, *mlo = 0, *mhi = 0, *S;
 
 2684#ifdef Honor_FLT_ROUNDS 
 2688    int inexact, oldinexact;
 
 2693#ifndef MULTIPLE_THREADS 
 2695        freedtoa(dtoa_result);
 
 2700    if (word0(d) & Sign_bit) {
 
 2703        word0(d) &= ~Sign_bit;  
 
 2708#if defined(IEEE_Arith) + defined(VAX) 
 2710    if ((word0(d) & Exp_mask) == Exp_mask)
 
 2712    if (word0(d)  == 0x8000)
 
 2718        if (!word1(d) && !(word0(d) & 0xfffff))
 
 2719            return rv_strdup(INFSTR, rve);
 
 2721        return rv_strdup(NANSTR, rve);
 
 2729        return rv_strdup(ZEROSTR, rve);
 
 2733    try_quick = oldinexact = get_inexact();
 
 2736#ifdef Honor_FLT_ROUNDS 
 2737    if ((rounding = Flt_Rounds) >= 2) {
 
 2739            rounding = rounding == 2 ? 0 : 2;
 
 2746    b = d2b(dval(d), &be, &bbits);
 
 2747    if (!b) 
return NULL;
 
 2748#ifdef Sudden_Underflow 
 2749    i = (int)(word0(d) >> Exp_shift1 & (Exp_mask>>Exp_shift1));
 
 2751    if ((i = (
int)(word0(d) >> Exp_shift1 & (Exp_mask>>Exp_shift1))) != 0) {
 
 2754        word0(d2) &= Frac_mask1;
 
 2755        word0(d2) |= Exp_11;
 
 2757        if (j = 11 - hi0bits(word0(d2) & Frac_mask))
 
 2788#ifndef Sudden_Underflow 
 2794        i = bbits + be + (Bias + (P-1) - 1);
 
 2795        x = i > 32  ? word0(d) << (64 - i) | word1(d) >> (i - 32)
 
 2796            : word1(d) << (32 - i);
 
 2798        word0(d2) -= 31*Exp_msk1; 
 
 2799        i -= (Bias + (P-1) - 1) + 1;
 
 2803    ds = (dval(d2)-1.5)*0.289529654602168 + 0.1760912590558 + i*0.301029995663981;
 
 2805    if (ds < 0. && ds != k)
 
 2808    if (k >= 0 && k <= Ten_pmax) {
 
 2809        if (dval(d) < tens[k])
 
 2832    if (mode < 0 || mode > 9)
 
 2836#ifdef Check_FLT_ROUNDS 
 2837    try_quick = Rounding == 1;
 
 2861        ilim = ilim1 = i = ndigits;
 
 2867        if (ckd_add(&i, ndigits, k + 1)) { 
 
 2876    s = s0 = rv_alloc(i+1);
 
 2882#ifdef Honor_FLT_ROUNDS 
 2883    if (mode > 1 && rounding != 1)
 
 2887    if (ilim >= 0 && ilim <= Quick_max && try_quick) {
 
 2902                dval(d) /= bigtens[n_bigtens-1];
 
 2905            for (; j; j >>= 1, i++)
 
 2912        else if ((j1 = -k) != 0) {
 
 2913            dval(d) *= tens[j1 & 0xf];
 
 2914            for (j = j1 >> 4; j; j >>= 1, i++)
 
 2917                    dval(d) *= bigtens[i];
 
 2920        if (k_check && dval(d) < 1. && ilim > 0) {
 
 2928        dval(eps) = ieps*dval(d) + 7.;
 
 2929        word0(eps) -= (P-1)*Exp_msk1;
 
 2933            if (dval(d) > dval(eps))
 
 2935            if (dval(d) < -dval(eps))
 
 2944            dval(eps) = 0.5/tens[ilim-1] - dval(eps);
 
 2948                *s++ = 
'0' + (int)L;
 
 2949                if (dval(d) < dval(eps))
 
 2951                if (1. - dval(d) < dval(eps))
 
 2962            dval(eps) *= tens[ilim-1];
 
 2963            for (i = 1;; i++, dval(d) *= 10.) {
 
 2964                L = (Long)(dval(d));
 
 2965                if (!(dval(d) -= L))
 
 2967                *s++ = 
'0' + (int)L;
 
 2969                    if (dval(d) > 0.5 + dval(eps))
 
 2971                    else if (dval(d) < 0.5 - dval(eps)) {
 
 2972                        while (*--s == 
'0') ;
 
 2977                    if ((*(s-1) - 
'0') & 1) {
 
 2995    if (be >= 0 && k <= Int_max) {
 
 2998        if (ndigits < 0 && ilim <= 0) {
 
 3000            if (ilim < 0 || dval(d) <= 5*ds)
 
 3004        for (i = 1;; i++, dval(d) *= 10.) {
 
 3005            L = (Long)(dval(d) / ds);
 
 3007#ifdef Check_FLT_ROUNDS 
 3014            *s++ = 
'0' + (int)L;
 
 3022#ifdef Honor_FLT_ROUNDS 
 3026                  case 2: 
goto bump_up;
 
 3030                if (dval(d) > ds || (dval(d) == ds && (L & 1))) {
 
 3050#ifndef Sudden_Underflow 
 3051            denorm ? be + (Bias + (P-1) - 1 + 1) :
 
 3054            1 + 4*P - 3 - bbits + ((bbits + be - 1) & 3);
 
 3061        if (!mhi) 
goto nomem;
 
 3063    if (m2 > 0 && s2 > 0) {
 
 3064        i = m2 < s2 ? m2 : s2;
 
 3072                mhi = pow5mult(mhi, m5);
 
 3073                if (!mhi) 
goto nomem;
 
 3079            if ((j = b5 - m5) != 0) {
 
 3085            b = pow5mult(b, b5);
 
 3092        S = pow5mult(S, s5);
 
 3099    if ((mode < 2 || leftright)
 
 3100#ifdef Honor_FLT_ROUNDS
 
 3104        if (!word1(d) && !(word0(d) & Bndry_mask)
 
 3105#ifndef Sudden_Underflow
 
 3106            && word0(d) & (Exp_mask & ~Exp_msk1)
 
 3124    if ((i = ((s5 ? 32 - hi0bits(S->x[S->wds-1]) : 1) + s2) & 0x1f) != 0)
 
 3127    if ((i = ((s5 ? 32 - hi0bits(S->x[S->wds-1]) : 1) + s2) & 0xf) != 0)
 
 3153            b = multadd(b, 10, 0);  
 
 3156                mhi = multadd(mhi, 10, 0);
 
 3157                if (!mhi) 
goto nomem;
 
 3162    if (ilim <= 0 && (mode == 3 || mode == 5)) {
 
 3163        if (ilim < 0 || cmp(b,S = multadd(S,5,0)) <= 0) {
 
 3176            mhi = lshift(mhi, m2);
 
 3177            if (!mhi) 
goto nomem;
 
 3186            mhi = Balloc(mhi->k);
 
 3187            if (!mhi) 
goto nomem;
 
 3189            mhi = lshift(mhi, Log2P);
 
 3190            if (!mhi) 
goto nomem;
 
 3194            dig = quorem(b,S) + 
'0';
 
 3199            delta = diff(S, mhi);
 
 3200            if (!delta) 
goto nomem;
 
 3201            j1 = delta->sign ? 1 : cmp(b, delta);
 
 3204            if (j1 == 0 && mode != 1 && !(word1(d) & 1)
 
 3205#ifdef Honor_FLT_ROUNDS
 
 3214                else if (!b->x[0] && b->wds <= 1)
 
 3221            if (j < 0 || (j == 0 && mode != 1
 
 3226                if (!b->x[0] && b->wds <= 1) {
 
 3232#ifdef Honor_FLT_ROUNDS 
 3235                      case 0: 
goto accept_dig;
 
 3236                      case 2: 
goto keep_dig;
 
 3243                    if ((j1 > 0 || (j1 == 0 && (dig & 1))) && dig++ == 
'9')
 
 3251#ifdef Honor_FLT_ROUNDS 
 3263#ifdef Honor_FLT_ROUNDS 
 3269            b = multadd(b, 10, 0);
 
 3272                mlo = mhi = multadd(mhi, 10, 0);
 
 3273                if (!mlo) 
goto nomem;
 
 3276                mlo = multadd(mlo, 10, 0);
 
 3277                if (!mlo) 
goto nomem;
 
 3278                mhi = multadd(mhi, 10, 0);
 
 3279                if (!mhi) 
goto nomem;
 
 3285            *s++ = dig = quorem(b,S) + 
'0';
 
 3286            if (!b->x[0] && b->wds <= 1) {
 
 3294            b = multadd(b, 10, 0);
 
 3300#ifdef Honor_FLT_ROUNDS 
 3302      case 0: 
goto trimzeros;
 
 3303      case 2: 
goto roundoff;
 
 3309    if (j > 0 || (j == 0 && (dig & 1))) {
 
 3317        if (!half || (*s - 
'0') & 1)
 
 3321        while (*--s == 
'0') ;
 
 3327        if (mlo && mlo != mhi)
 
 3335            word0(d) = Exp_1 + (70 << Exp_shift);
 
 3340    else if (!oldinexact)
 
 3352        if (mlo && mlo != mhi)
 
 3387#define DBL_MANH_SIZE   20 
 3388#define DBL_MANL_SIZE   32 
 3389#define DBL_ADJ (DBL_MAX_EXP - 2) 
 3390#define SIGFIGS ((DBL_MANT_DIG + 3) / 4 + 1) 
 3391#define dexp_get(u) ((int)(word0(u) >> Exp_shift) & ~Exp_msk1) 
 3392#define dexp_set(u,v) (word0(u) = (((int)(word0(u)) & ~Exp_mask) | ((v) << Exp_shift))) 
 3393#define dmanh_get(u) ((uint32_t)(word0(u) & Frac_mask)) 
 3394#define dmanl_get(u) ((uint32_t)word1(u)) 
 3422hdtoa(
double d, 
const char *xdigs, 
int ndigits, 
int *decpt, 
int *sign, 
char **rve)
 
 3427        uint32_t manh, manl;
 
 3430        if (word0(u) & Sign_bit) {
 
 3433            word0(u) &= ~Sign_bit;  
 
 3440            return rv_strdup(INFSTR, rve);
 
 3442        else if (isnan(d)) { 
 
 3444            return rv_strdup(NANSTR, rve);
 
 3446        else if (d == 0.0) { 
 
 3448            return rv_strdup(ZEROSTR, rve);
 
 3450        else if (dexp_get(u)) { 
 
 3451            *decpt = dexp_get(u) - DBL_ADJ;
 
 3454            u.d *= 5.363123171977039e+154 ;
 
 3455            *decpt = dexp_get(u) - (514 + DBL_ADJ);
 
 3465        bufsize = (ndigits > 0) ? ndigits : SIGFIGS;
 
 3466        s0 = rv_alloc(bufsize+1);
 
 3467        if (!s0) 
return NULL;
 
 3470        if (SIGFIGS > ndigits && ndigits > 0) {
 
 3472                int offset = 4 * ndigits + DBL_MAX_EXP - 4 - DBL_MANT_DIG;
 
 3473                dexp_set(u, offset);
 
 3476                *decpt += dexp_get(u) - offset;
 
 3479        manh = dmanh_get(u);
 
 3480        manl = dmanl_get(u);
 
 3482        for (s = s0 + 1; s < s0 + bufsize; s++) {
 
 3483                *s = xdigs[(manh >> (DBL_MANH_SIZE - 4)) & 0xf];
 
 3484                manh = (manh << 4) | (manl >> (DBL_MANL_SIZE - 4));
 
 3490                for (ndigits = SIGFIGS; s0[ndigits - 1] == 
'0'; ndigits--)
 
#define ISDIGIT
Old name of rb_isdigit.
#define strtod(s, e)
Just another name of ruby_strtod.
#define errno
Ractor-aware version of errno.