Gentoo Websites Logo
Go to: Gentoo Home Documentation Forums Lists Bugs Planet Store Wiki Get Gentoo!
View | Details | Raw Unified | Return to bug 265579
Collapse All | Expand All

(-)trunk/JavaScriptCore/wtf/dtoa.cpp (-204 / +209 lines)
Lines 190-200 Link Here
190
#else
190
#else
191
#ifdef IEEE_8087
191
#ifdef IEEE_8087
192
#define word0(x) ((U*)&x)->L[1]
192
#define word0(x) (x)->L[1]
193
#define word1(x) ((U*)&x)->L[0]
193
#define word1(x) (x)->L[0]
194
#else
194
#else
195
#define word0(x) ((U*)&x)->L[0]
195
#define word0(x) (x)->L[0]
196
#define word1(x) ((U*)&x)->L[1]
196
#define word1(x) (x)->L[1]
197
#endif
197
#endif
198
#define dval(x) ((U*)&x)->d
198
#define dval(x) (x)->d
199
#endif
199
#endif
200
200
Lines 773-780 Link Here
773
}
773
}
774
774
775
static double ulp(double x)
775
static double ulp(U *x)
776
{
776
{
777
    register int32_t L;
777
    register int32_t L;
778
    double a;
778
    U u;
779
779
780
    L = (word0(x) & Exp_mask) - (P - 1) * Exp_msk1;
780
    L = (word0(x) & Exp_mask) - (P - 1) * Exp_msk1;
Lines 784-789 Link Here
784
#endif
784
#endif
785
#endif
785
#endif
786
        word0(a) = L;
786
        word0(&u) = L;
787
        word1(a) = 0;
787
        word1(&u) = 0;
788
#ifndef Avoid_Underflow
788
#ifndef Avoid_Underflow
789
#ifndef Sudden_Underflow
789
#ifndef Sudden_Underflow
Lines 791-805 Link Here
791
        L = -L >> Exp_shift;
791
        L = -L >> Exp_shift;
792
        if (L < Exp_shift) {
792
        if (L < Exp_shift) {
793
            word0(a) = 0x80000 >> L;
793
            word0(&u) = 0x80000 >> L;
794
            word1(a) = 0;
794
            word1(&u) = 0;
795
        } else {
795
        } else {
796
            word0(a) = 0;
796
            word0(&u) = 0;
797
            L -= Exp_shift;
797
            L -= Exp_shift;
798
            word1(a) = L >= 31 ? 1 : 1 << 31 - L;
798
            word1(&u) = L >= 31 ? 1 : 1 << 31 - L;
799
        }
799
        }
800
    }
800
    }
801
#endif
801
#endif
802
#endif
802
#endif
803
    return dval(a);
803
    return dval(&u);
804
}
804
}
805
805
Lines 812-819 Link Here
812
    uint32_t z;
812
    uint32_t z;
813
    int k;
813
    int k;
814
    double d;
814
    U d;
815
815
816
#define d0 word0(d)
816
#define d0 word0(&d)
817
#define d1 word1(d)
817
#define d1 word1(&d)
818
818
819
    xa0 = a->x;
819
    xa0 = a->x;
Lines 858-865 Link Here
858
#undef d0
858
#undef d0
859
#undef d1
859
#undef d1
860
    return dval(d);
860
    return dval(&d);
861
}
861
}
862
862
863
static Bigint* d2b(double d, int* e, int* bits)
863
static Bigint* d2b(U* d, int* e, int* bits)
864
{
864
{
865
    Bigint* b;
865
    Bigint* b;
Lines 966-974 Link Here
966
static double ratio(Bigint* a, Bigint* b)
966
static double ratio(Bigint* a, Bigint* b)
967
{
967
{
968
    double da, db;
968
    U da, db;
969
    int k, ka, kb;
969
    int k, ka, kb;
970
970
971
    dval(da) = b2d(a, &ka);
971
    dval(&da) = b2d(a, &ka);
972
    dval(db) = b2d(b, &kb);
972
    dval(&db) = b2d(b, &kb);
973
#ifdef Pack_32
973
#ifdef Pack_32
974
    k = ka - kb + 32 * (a->wds - b->wds);
974
    k = ka - kb + 32 * (a->wds - b->wds);
Lines 977-986 Link Here
977
#endif
977
#endif
978
    if (k > 0)
978
    if (k > 0)
979
        word0(da) += k * Exp_msk1;
979
        word0(&da) += k * Exp_msk1;
980
    else {
980
    else {
981
        k = -k;
981
        k = -k;
982
        word0(db) += k * Exp_msk1;
982
        word0(&db) += k * Exp_msk1;
983
    }
983
    }
984
    return dval(da) / dval(db);
984
    return dval(&da) / dval(&db);
985
}
985
}
986
986
Lines 1032-1036 Link Here
1032
1032
1033
#ifndef No_Hex_NaN
1033
#ifndef No_Hex_NaN
1034
static void hexnan(double* rvp, const char** sp)
1034
static void hexnan(U* rvp, const char** sp)
1035
{
1035
{
1036
    uint32_t c, x[2];
1036
    uint32_t c, x[2];
Lines 1071-1076 Link Here
1071
    }
1071
    }
1072
    if ((x[0] &= 0xfffff) || x[1]) {
1072
    if ((x[0] &= 0xfffff) || x[1]) {
1073
        word0(*rvp) = Exp_mask | x[0];
1073
        word0(rvp) = Exp_mask | x[0];
1074
        word1(*rvp) = x[1];
1074
        word1(rvp) = x[1];
1075
    }
1075
    }
1076
}
1076
}
Lines 1086-1090 Link Here
1086
         e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign;
1086
         e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign;
1087
    const char *s, *s0, *s1;
1087
    const char *s, *s0, *s1;
1088
    double aadj, aadj1, adj, rv, rv0;
1088
    double aadj, aadj1;
1089
    U aadj2, adj, rv, rv0;
1089
    int32_t L;
1090
    int32_t L;
1090
    uint32_t y, z;
1091
    uint32_t y, z;
Lines 1095-1099 Link Here
1095
1096
1096
    sign = nz0 = nz = 0;
1097
    sign = nz0 = nz = 0;
1097
    dval(rv) = 0.;
1098
    dval(&rv) = 0;
1098
    for (s = s00; ; s++)
1099
    for (s = s00; ; s++)
1099
        switch (*s) {
1100
        switch (*s) {
Lines 1210-1215 Link Here
1210
                        if (!match(&s,"inity"))
1211
                        if (!match(&s,"inity"))
1211
                            ++s;
1212
                            ++s;
1212
                        word0(rv) = 0x7ff00000;
1213
                        word0(&rv) = 0x7ff00000;
1213
                        word1(rv) = 0;
1214
                        word1(&rv) = 0;
1214
                        goto ret;
1215
                        goto ret;
1215
                    }
1216
                    }
Lines 1218-1223 Link Here
1218
                case 'N':
1219
                case 'N':
1219
                    if (match(&s, "an")) {
1220
                    if (match(&s, "an")) {
1220
                        word0(rv) = NAN_WORD0;
1221
                        word0(&rv) = NAN_WORD0;
1221
                        word1(rv) = NAN_WORD1;
1222
                        word1(&rv) = NAN_WORD1;
1222
#ifndef No_Hex_NaN
1223
#ifndef No_Hex_NaN
1223
                        if (*s == '(') /*)*/
1224
                        if (*s == '(') /*)*/
Lines 1244-1248 Link Here
1244
        nd0 = nd;
1245
        nd0 = nd;
1245
    k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1;
1246
    k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1;
1246
    dval(rv) = y;
1247
    dval(&rv) = y;
1247
    if (k > 9) {
1248
    if (k > 9) {
1248
#ifdef SET_INEXACT
1249
#ifdef SET_INEXACT
Lines 1250-1254 Link Here
1250
            oldinexact = get_inexact();
1251
            oldinexact = get_inexact();
1251
#endif
1252
#endif
1252
        dval(rv) = tens[k - 9] * dval(rv) + z;
1253
        dval(&rv) = tens[k - 9] * dval(&rv) + z;
1253
    }
1254
    }
1254
    bd0 = 0;
1255
    bd0 = 0;
Lines 1258-1262 Link Here
1258
        if (e > 0) {
1259
        if (e > 0) {
1259
            if (e <= Ten_pmax) {
1260
            if (e <= Ten_pmax) {
1260
                /* rv = */ rounded_product(dval(rv), tens[e]);
1261
                /* rv = */ rounded_product(dval(&rv), tens[e]);
1261
                goto ret;
1262
                goto ret;
1262
            }
1263
            }
Lines 1267-1272 Link Here
1267
                 */
1268
                 */
1268
                e -= i;
1269
                e -= i;
1269
                dval(rv) *= tens[i];
1270
                dval(&rv) *= tens[i];
1270
                /* rv = */ rounded_product(dval(rv), tens[e]);
1271
                /* rv = */ rounded_product(dval(&rv), tens[e]);
1271
                goto ret;
1272
                goto ret;
1272
            }
1273
            }
Lines 1274-1278 Link Here
1274
#ifndef Inaccurate_Divide
1275
#ifndef Inaccurate_Divide
1275
        else if (e >= -Ten_pmax) {
1276
        else if (e >= -Ten_pmax) {
1276
            /* rv = */ rounded_quotient(dval(rv), tens[-e]);
1277
            /* rv = */ rounded_quotient(dval(&rv), tens[-e]);
1277
            goto ret;
1278
            goto ret;
1278
        }
1279
        }
Lines 1294-1298 Link Here
1294
    if (e1 > 0) {
1295
    if (e1 > 0) {
1295
        if ((i = e1 & 15))
1296
        if ((i = e1 & 15))
1296
            dval(rv) *= tens[i];
1297
            dval(&rv) *= tens[i];
1297
        if (e1 &= ~15) {
1298
        if (e1 &= ~15) {
1298
            if (e1 > DBL_MAX_10_EXP) {
1299
            if (e1 > DBL_MAX_10_EXP) {
Lines 1302-1311 Link Here
1302
#endif
1303
#endif
1303
                /* Can't trust HUGE_VAL */
1304
                /* Can't trust HUGE_VAL */
1304
                word0(rv) = Exp_mask;
1305
                word0(&rv) = Exp_mask;
1305
                word1(rv) = 0;
1306
                word1(&rv) = 0;
1306
#ifdef SET_INEXACT
1307
#ifdef SET_INEXACT
1307
                /* set overflow bit */
1308
                /* set overflow bit */
1308
                dval(rv0) = 1e300;
1309
                dval(&rv0) = 1e300;
1309
                dval(rv0) *= dval(rv0);
1310
                dval(&rv0) *= dval(&rv0);
1310
#endif
1311
#endif
1311
                if (bd0)
1312
                if (bd0)
Lines 1316-1337 Link Here
1316
            for (j = 0; e1 > 1; j++, e1 >>= 1)
1317
            for (j = 0; e1 > 1; j++, e1 >>= 1)
1317
                if (e1 & 1)
1318
                if (e1 & 1)
1318
                    dval(rv) *= bigtens[j];
1319
                    dval(&rv) *= bigtens[j];
1319
        /* The last multiplication could overflow. */
1320
        /* The last multiplication could overflow. */
1320
            word0(rv) -= P * Exp_msk1;
1321
            word0(&rv) -= P * Exp_msk1;
1321
            dval(rv) *= bigtens[j];
1322
            dval(&rv) *= bigtens[j];
1322
            if ((z = word0(rv) & Exp_mask) > Exp_msk1 * (DBL_MAX_EXP + Bias - P))
1323
            if ((z = word0(&rv) & Exp_mask) > Exp_msk1 * (DBL_MAX_EXP + Bias - P))
1323
                goto ovfl;
1324
                goto ovfl;
1324
            if (z > Exp_msk1 * (DBL_MAX_EXP + Bias - 1 - P)) {
1325
            if (z > Exp_msk1 * (DBL_MAX_EXP + Bias - 1 - P)) {
1325
                /* set to largest number */
1326
                /* set to largest number */
1326
                /* (Can't trust DBL_MAX) */
1327
                /* (Can't trust DBL_MAX) */
1327
                word0(rv) = Big0;
1328
                word0(&rv) = Big0;
1328
                word1(rv) = Big1;
1329
                word1(&rv) = Big1;
1329
            } else
1330
            } else
1330
                word0(rv) += P * Exp_msk1;
1331
                word0(&rv) += P * Exp_msk1;
1331
        }
1332
        }
1332
    } else if (e1 < 0) {
1333
    } else if (e1 < 0) {
1333
        e1 = -e1;
1334
        e1 = -e1;
1334
        if ((i = e1 & 15))
1335
        if ((i = e1 & 15))
1335
            dval(rv) /= tens[i];
1336
            dval(&rv) /= tens[i];
1336
        if (e1 >>= 4) {
1337
        if (e1 >>= 4) {
1337
            if (e1 >= 1 << n_bigtens)
1338
            if (e1 >= 1 << n_bigtens)
Lines 1342-1371 Link Here
1342
            for (j = 0; e1 > 0; j++, e1 >>= 1)
1343
            for (j = 0; e1 > 0; j++, e1 >>= 1)
1343
                if (e1 & 1)
1344
                if (e1 & 1)
1344
                    dval(rv) *= tinytens[j];
1345
                    dval(&rv) *= tinytens[j];
1345
            if (scale && (j = (2 * P) + 1 - ((word0(rv) & Exp_mask) >> Exp_shift)) > 0) {
1346
            if (scale && (j = (2 * P) + 1 - ((word0(&rv) & Exp_mask) >> Exp_shift)) > 0) {
1346
                /* scaled rv is denormal; zap j low bits */
1347
                /* scaled rv is denormal; zap j low bits */
1347
                if (j >= 32) {
1348
                if (j >= 32) {
1348
                    word1(rv) = 0;
1349
                    word1(&rv) = 0;
1349
                    if (j >= 53)
1350
                    if (j >= 53)
1350
                       word0(rv) = (P + 2) * Exp_msk1;
1351
                       word0(&rv) = (P + 2) * Exp_msk1;
1351
                    else
1352
                    else
1352
                       word0(rv) &= 0xffffffff << (j - 32);
1353
                       word0(&rv) &= 0xffffffff << (j - 32);
1353
                } else
1354
                } else
1354
                    word1(rv) &= 0xffffffff << j;
1355
                    word1(&rv) &= 0xffffffff << j;
1355
            }
1356
            }
1356
#else
1357
#else
1357
            for (j = 0; e1 > 1; j++, e1 >>= 1)
1358
            for (j = 0; e1 > 1; j++, e1 >>= 1)
1358
                if (e1 & 1)
1359
                if (e1 & 1)
1359
                    dval(rv) *= tinytens[j];
1360
                    dval(&rv) *= tinytens[j];
1360
            /* The last multiplication could underflow. */
1361
            /* The last multiplication could underflow. */
1361
            dval(rv0) = dval(rv);
1362
            dval(&rv0) = dval(&rv);
1362
            dval(rv) *= tinytens[j];
1363
            dval(&rv) *= tinytens[j];
1363
            if (!dval(rv)) {
1364
            if (!dval(&rv)) {
1364
                dval(rv) = 2. * dval(rv0);
1365
                dval(&rv) = 2. * dval(&rv0);
1365
                dval(rv) *= tinytens[j];
1366
                dval(&rv) *= tinytens[j];
1366
#endif
1367
#endif
1367
                if (!dval(rv)) {
1368
                if (!dval(&rv)) {
1368
undfl:
1369
undfl:
1369
                    dval(rv) = 0.;
1370
                    dval(&rv) = 0.;
1370
#ifndef NO_ERRNO
1371
#ifndef NO_ERRNO
1371
                    errno = ERANGE;
1372
                    errno = ERANGE;
Lines 1376-1381 Link Here
1376
                }
1377
                }
1377
#ifndef Avoid_Underflow
1378
#ifndef Avoid_Underflow
1378
                word0(rv) = Tiny0;
1379
                word0(&rv) = Tiny0;
1379
                word1(rv) = Tiny1;
1380
                word1(&rv) = Tiny1;
1380
                /* The refinement below will clean
1381
                /* The refinement below will clean
1381
                 * this approximation up.
1382
                 * this approximation up.
Lines 1395-1399 Link Here
1395
        bd = Balloc(bd0->k);
1396
        bd = Balloc(bd0->k);
1396
        Bcopy(bd, bd0);
1397
        Bcopy(bd, bd0);
1397
        bb = d2b(dval(rv), &bbe, &bbbits);    /* rv = bb * 2^bbe */
1398
        bb = d2b(&rv, &bbe, &bbbits);    /* rv = bb * 2^bbe */
1398
        bs = i2b(1);
1399
        bs = i2b(1);
1399
1400
Lines 1465-1473 Link Here
1465
             * special case of mantissa a power of two.
1466
             * special case of mantissa a power of two.
1466
             */
1467
             */
1467
            if (dsign || word1(rv) || word0(rv) & Bndry_mask
1468
            if (dsign || word1(&rv) || word0(&rv) & Bndry_mask
1468
#ifdef Avoid_Underflow
1469
#ifdef Avoid_Underflow
1469
             || (word0(rv) & Exp_mask) <= (2 * P + 1) * Exp_msk1
1470
             || (word0(&rv) & Exp_mask) <= (2 * P + 1) * Exp_msk1
1470
#else
1471
#else
1471
             || (word0(rv) & Exp_mask) <= Exp_msk1
1472
             || (word0(&rv) & Exp_mask) <= Exp_msk1
1472
#endif
1473
#endif
1473
                ) {
1474
                ) {
Lines 1493-1506 Link Here
1493
            /* exactly half-way between */
1494
            /* exactly half-way between */
1494
            if (dsign) {
1495
            if (dsign) {
1495
                if ((word0(rv) & Bndry_mask1) == Bndry_mask1
1496
                if ((word0(&rv) & Bndry_mask1) == Bndry_mask1
1496
                 &&  word1(rv) == (
1497
                 &&  word1(&rv) == (
1497
#ifdef Avoid_Underflow
1498
#ifdef Avoid_Underflow
1498
            (scale && (y = word0(rv) & Exp_mask) <= 2 * P * Exp_msk1)
1499
            (scale && (y = word0(&rv) & Exp_mask) <= 2 * P * Exp_msk1)
1499
        ? (0xffffffff & (0xffffffff << (2 * P + 1 - (y >> Exp_shift)))) :
1500
        ? (0xffffffff & (0xffffffff << (2 * P + 1 - (y >> Exp_shift)))) :
1500
#endif
1501
#endif
1501
                           0xffffffff)) {
1502
                           0xffffffff)) {
1502
                    /*boundary case -- increment exponent*/
1503
                    /*boundary case -- increment exponent*/
1503
                    word0(rv) = (word0(rv) & Exp_mask) + Exp_msk1;
1504
                    word0(&rv) = (word0(&rv) & Exp_mask) + Exp_msk1;
1504
                    word1(rv) = 0;
1505
                    word1(&rv) = 0;
1505
#ifdef Avoid_Underflow
1506
#ifdef Avoid_Underflow
1506
                    dsign = 0;
1507
                    dsign = 0;
Lines 1508-1516 Link Here
1508
                    break;
1509
                    break;
1509
                }
1510
                }
1510
            } else if (!(word0(rv) & Bndry_mask) && !word1(rv)) {
1511
            } else if (!(word0(&rv) & Bndry_mask) && !word1(&rv)) {
1511
drop_down:
1512
drop_down:
1512
                /* boundary case -- decrement exponent */
1513
                /* boundary case -- decrement exponent */
1513
#ifdef Sudden_Underflow /*{{*/
1514
#ifdef Sudden_Underflow /*{{*/
1514
                L = word0(rv) & Exp_mask;
1515
                L = word0(&rv) & Exp_mask;
1515
#ifdef Avoid_Underflow
1516
#ifdef Avoid_Underflow
1516
                if (L <= (scale ? (2 * P + 1) * Exp_msk1 : Exp_msk1))
1517
                if (L <= (scale ? (2 * P + 1) * Exp_msk1 : Exp_msk1))
Lines 1523-1527 Link Here
1523
#ifdef Avoid_Underflow
1524
#ifdef Avoid_Underflow
1524
                if (scale) {
1525
                if (scale) {
1525
                    L = word0(rv) & Exp_mask;
1526
                    L = word0(&rv) & Exp_mask;
1526
                    if (L <= (2 * P + 1) * Exp_msk1) {
1527
                    if (L <= (2 * P + 1) * Exp_msk1) {
1527
                        if (L > (P + 2) * Exp_msk1)
1528
                        if (L > (P + 2) * Exp_msk1)
Lines 1534-1551 Link Here
1534
                }
1535
                }
1535
#endif /*Avoid_Underflow*/
1536
#endif /*Avoid_Underflow*/
1536
                L = (word0(rv) & Exp_mask) - Exp_msk1;
1537
                L = (word0(&rv) & Exp_mask) - Exp_msk1;
1537
#endif /*Sudden_Underflow}}*/
1538
#endif /*Sudden_Underflow}}*/
1538
                word0(rv) = L | Bndry_mask1;
1539
                word0(&rv) = L | Bndry_mask1;
1539
                word1(rv) = 0xffffffff;
1540
                word1(&rv) = 0xffffffff;
1540
                break;
1541
                break;
1541
            }
1542
            }
1542
            if (!(word1(rv) & LSB))
1543
            if (!(word1(&rv) & LSB))
1543
                break;
1544
                break;
1544
            if (dsign)
1545
            if (dsign)
1545
                dval(rv) += ulp(dval(rv));
1546
                dval(&rv) += ulp(&rv);
1546
            else {
1547
            else {
1547
                dval(rv) -= ulp(dval(rv));
1548
                dval(&rv) -= ulp(&rv);
1548
#ifndef Sudden_Underflow
1549
#ifndef Sudden_Underflow
1549
                if (!dval(rv))
1550
                if (!dval(&rv))
1550
                    goto undfl;
1551
                    goto undfl;
1551
#endif
1552
#endif
Lines 1559-1565 Link Here
1559
            if (dsign)
1560
            if (dsign)
1560
                aadj = aadj1 = 1.;
1561
                aadj = aadj1 = 1.;
1561
            else if (word1(rv) || word0(rv) & Bndry_mask) {
1562
            else if (word1(&rv) || word0(&rv) & Bndry_mask) {
1562
#ifndef Sudden_Underflow
1563
#ifndef Sudden_Underflow
1563
                if (word1(rv) == Tiny1 && !word0(rv))
1564
                if (word1(&rv) == Tiny1 && !word0(&rv))
1564
                    goto undfl;
1565
                    goto undfl;
1565
#endif
1566
#endif
Lines 1593-1613 Link Here
1593
#endif /*Check_FLT_ROUNDS*/
1594
#endif /*Check_FLT_ROUNDS*/
1594
        }
1595
        }
1595
        y = word0(rv) & Exp_mask;
1596
        y = word0(&rv) & Exp_mask;
1596
1597
1597
        /* Check for overflow */
1598
        /* Check for overflow */
1598
1599
1599
        if (y == Exp_msk1 * (DBL_MAX_EXP + Bias - 1)) {
1600
        if (y == Exp_msk1 * (DBL_MAX_EXP + Bias - 1)) {
1600
            dval(rv0) = dval(rv);
1601
            dval(&rv0) = dval(&rv);
1601
            word0(rv) -= P * Exp_msk1;
1602
            word0(&rv) -= P * Exp_msk1;
1602
            adj = aadj1 * ulp(dval(rv));
1603
            adj.d = aadj1 * ulp(&rv);
1603
            dval(rv) += adj;
1604
            dval(&rv) += adj.d;
1604
            if ((word0(rv) & Exp_mask) >= Exp_msk1 * (DBL_MAX_EXP + Bias - P)) {
1605
            if ((word0(&rv) & Exp_mask) >= Exp_msk1 * (DBL_MAX_EXP + Bias - P)) {
1605
                if (word0(rv0) == Big0 && word1(rv0) == Big1)
1606
                if (word0(&rv0) == Big0 && word1(&rv0) == Big1)
1606
                    goto ovfl;
1607
                    goto ovfl;
1607
                word0(rv) = Big0;
1608
                word0(&rv) = Big0;
1608
                word1(rv) = Big1;
1609
                word1(&rv) = Big1;
1609
                goto cont;
1610
                goto cont;
1610
            } else
1611
            } else
1611
                word0(rv) += P * Exp_msk1;
1612
                word0(&rv) += P * Exp_msk1;
1612
        } else {
1613
        } else {
1613
#ifdef Avoid_Underflow
1614
#ifdef Avoid_Underflow
Lines 1619-1646 Link Here
1619
                    aadj1 = dsign ? aadj : -aadj;
1620
                    aadj1 = dsign ? aadj : -aadj;
1620
                }
1621
                }
1621
                word0(aadj1) += (2 * P + 1) * Exp_msk1 - y;
1622
                dval(&aadj2) = aadj1;
1622
            }
1623
                word0(&aadj2) += (2 * P + 1) * Exp_msk1 - y;
1623
            adj = aadj1 * ulp(dval(rv));
1624
                aadj1 = dval(&aadj2);
1624
            dval(rv) += adj;
1625
            }
1626
            adj.d = aadj1 * ulp(&rv);
1627
            dval(&rv) += adj.d;
1625
#else
1628
#else
1626
#ifdef Sudden_Underflow
1629
#ifdef Sudden_Underflow
1627
            if ((word0(rv) & Exp_mask) <= P * Exp_msk1) {
1630
            if ((word0(&rv) & Exp_mask) <= P * Exp_msk1) {
1628
                dval(rv0) = dval(rv);
1631
                dval(&rv0) = dval(&rv);
1629
                word0(rv) += P * Exp_msk1;
1632
                word0(&rv) += P * Exp_msk1;
1630
                adj = aadj1 * ulp(dval(rv));
1633
                adj.d = aadj1 * ulp(&rv);
1631
                dval(rv) += adj;
1634
                dval(&rv) += adj.d;
1632
                if ((word0(rv) & Exp_mask) <= P * Exp_msk1)
1635
                if ((word0(&rv) & Exp_mask) <= P * Exp_msk1)
1633
                {
1636
                {
1634
                    if (word0(rv0) == Tiny0 && word1(rv0) == Tiny1)
1637
                    if (word0(&rv0) == Tiny0 && word1(&rv0) == Tiny1)
1635
                        goto undfl;
1638
                        goto undfl;
1636
                    word0(rv) = Tiny0;
1639
                    word0(&rv) = Tiny0;
1637
                    word1(rv) = Tiny1;
1640
                    word1(&rv) = Tiny1;
1638
                    goto cont;
1641
                    goto cont;
1639
                }
1642
                }
1640
                else
1643
                else
1641
                    word0(rv) -= P * Exp_msk1;
1644
                    word0(&rv) -= P * Exp_msk1;
1642
            } else {
1645
            } else {
1643
                adj = aadj1 * ulp(dval(rv));
1646
                adj.d = aadj1 * ulp(&rv);
1644
                dval(rv) += adj;
1647
                dval(&rv) += adj.d;
1645
            }
1648
            }
1646
#else /*Sudden_Underflow*/
1649
#else /*Sudden_Underflow*/
Lines 1657-1666 Link Here
1657
                    aadj1 = -aadj1;
1660
                    aadj1 = -aadj1;
1658
            }
1661
            }
1659
            adj = aadj1 * ulp(dval(rv));
1662
            adj.d = aadj1 * ulp(&rv);
1660
            dval(rv) += adj;
1663
            dval(&rv) += adj.d;
1661
#endif /*Sudden_Underflow*/
1664
#endif /*Sudden_Underflow*/
1662
#endif /*Avoid_Underflow*/
1665
#endif /*Avoid_Underflow*/
1663
        }
1666
        }
1664
        z = word0(rv) & Exp_mask;
1667
        z = word0(&rv) & Exp_mask;
1665
#ifndef SET_INEXACT
1668
#ifndef SET_INEXACT
1666
#ifdef Avoid_Underflow
1669
#ifdef Avoid_Underflow
Lines 1672-1676 Link Here
1672
            aadj -= L;
1675
            aadj -= L;
1673
            /* The tolerances below are conservative. */
1676
            /* The tolerances below are conservative. */
1674
            if (dsign || word1(rv) || word0(rv) & Bndry_mask) {
1677
            if (dsign || word1(&rv) || word0(&rv) & Bndry_mask) {
1675
                if (aadj < .4999999 || aadj > .5000001)
1678
                if (aadj < .4999999 || aadj > .5000001)
1676
                    break;
1679
                    break;
Lines 1688-1694 Link Here
1688
    if (inexact) {
1691
    if (inexact) {
1689
        if (!oldinexact) {
1692
        if (!oldinexact) {
1690
            word0(rv0) = Exp_1 + (70 << Exp_shift);
1693
            word0(&rv0) = Exp_1 + (70 << Exp_shift);
1691
            word1(rv0) = 0;
1694
            word1(&rv0) = 0;
1692
            dval(rv0) += 1.;
1695
            dval(&rv0) += 1.;
1693
        }
1696
        }
1694
    } else if (!oldinexact)
1697
    } else if (!oldinexact)
Lines 1697-1706 Link Here
1697
#ifdef Avoid_Underflow
1700
#ifdef Avoid_Underflow
1698
    if (scale) {
1701
    if (scale) {
1699
        word0(rv0) = Exp_1 - 2 * P * Exp_msk1;
1702
        word0(&rv0) = Exp_1 - 2 * P * Exp_msk1;
1700
        word1(rv0) = 0;
1703
        word1(&rv0) = 0;
1701
        dval(rv) *= dval(rv0);
1704
        dval(&rv) *= dval(&rv0);
1702
#ifndef NO_ERRNO
1705
#ifndef NO_ERRNO
1703
        /* try to avoid the bug of testing an 8087 register value */
1706
        /* try to avoid the bug of testing an 8087 register value */
1704
        if (word0(rv) == 0 && word1(rv) == 0)
1707
        if (word0(&rv) == 0 && word1(&rv) == 0)
1705
            errno = ERANGE;
1708
            errno = ERANGE;
1706
#endif
1709
#endif
Lines 1708-1715 Link Here
1708
#endif /* Avoid_Underflow */
1711
#endif /* Avoid_Underflow */
1709
#ifdef SET_INEXACT
1712
#ifdef SET_INEXACT
1710
    if (inexact && !(word0(rv) & Exp_mask)) {
1713
    if (inexact && !(word0(&rv) & Exp_mask)) {
1711
        /* set underflow bit */
1714
        /* set underflow bit */
1712
        dval(rv0) = 1e-300;
1715
        dval(&rv0) = 1e-300;
1713
        dval(rv0) *= dval(rv0);
1716
        dval(&rv0) *= dval(&rv0);
1714
    }
1717
    }
1715
#endif
1718
#endif
Lines 1723-1727 Link Here
1723
    if (se)
1726
    if (se)
1724
        *se = const_cast<char*>(s);
1727
        *se = const_cast<char*>(s);
1725
    return sign ? -dval(rv) : dval(rv);
1728
    return sign ? -dval(&rv) : dval(&rv);
1726
}
1729
}
1727
1730
Lines 1915-1919 Link Here
1915
 */
1918
 */
1916
1919
1917
char* dtoa(double d, int ndigits, int* decpt, int* sign, char** rve)
1920
char* dtoa(double dd, int ndigits, int* decpt, int* sign, char** rve)
1918
{
1921
{
1919
    /*
1922
    /*
Lines 1935-1939 Link Here
1935
#endif
1938
#endif
1936
    Bigint *b, *b1, *delta, *mlo = NULL, *mhi, *S;
1939
    Bigint *b, *b1, *delta, *mlo = NULL, *mhi, *S;
1937
    double d2, ds, eps;
1940
    U d2, eps, u;
1941
    double ds;
1938
    char *s, *s0;
1942
    char *s, *s0;
1939
#ifdef SET_INEXACT
1943
#ifdef SET_INEXACT
Lines 1948-1967 Link Here
1948
#endif
1952
#endif
1949
1953
1950
    if (word0(d) & Sign_bit) {
1954
    u.d = dd;
1955
    if (word0(&u) & Sign_bit) {
1951
        /* set sign for everything, including 0's and NaNs */
1956
        /* set sign for everything, including 0's and NaNs */
1952
        *sign = 1;
1957
        *sign = 1;
1953
        word0(d) &= ~Sign_bit;    /* clear sign bit */
1958
        word0(&u) &= ~Sign_bit;    /* clear sign bit */
1954
    } else
1959
    } else
1955
        *sign = 0;
1960
        *sign = 0;
1956
1961
1957
    if ((word0(d) & Exp_mask) == Exp_mask)
1962
    if ((word0(&u) & Exp_mask) == Exp_mask)
1958
    {
1963
    {
1959
        /* Infinity or NaN */
1964
        /* Infinity or NaN */
1960
        *decpt = 9999;
1965
        *decpt = 9999;
1961
        if (!word1(d) && !(word0(d) & 0xfffff))
1966
        if (!word1(&u) && !(word0(&u) & 0xfffff))
1962
            return nrv_alloc("Infinity", rve, 8);
1967
            return nrv_alloc("Infinity", rve, 8);
1963
        return nrv_alloc("NaN", rve, 3);
1968
        return nrv_alloc("NaN", rve, 3);
1964
    }
1969
    }
1965
    if (!dval(d)) {
1970
    if (!dval(&u)) {
1966
        *decpt = 1;
1971
        *decpt = 1;
1967
        return nrv_alloc("0", rve, 1);
1972
        return nrv_alloc("0", rve, 1);
Lines 1973-1985 Link Here
1973
#endif
1978
#endif
1974
1979
1975
    b = d2b(dval(d), &be, &bbits);
1980
    b = d2b(&u, &be, &bbits);
1976
#ifdef Sudden_Underflow
1981
#ifdef Sudden_Underflow
1977
    i = (int)(word0(d) >> Exp_shift1 & (Exp_mask >> Exp_shift1));
1982
    i = (int)(word0(&u) >> Exp_shift1 & (Exp_mask >> Exp_shift1));
1978
#else
1983
#else
1979
    if ((i = (int)(word0(d) >> Exp_shift1 & (Exp_mask >> Exp_shift1)))) {
1984
    if ((i = (int)(word0(&u) >> Exp_shift1 & (Exp_mask >> Exp_shift1)))) {
1980
#endif
1985
#endif
1981
        dval(d2) = dval(d);
1986
        dval(&d2) = dval(&u);
1982
        word0(d2) &= Frac_mask1;
1987
        word0(&d2) &= Frac_mask1;
1983
        word0(d2) |= Exp_11;
1988
        word0(&d2) |= Exp_11;
1984
1989
1985
        /* log(x)    ~=~ log(1.5) + (x-1.5)/1.5
1990
        /* log(x)    ~=~ log(1.5) + (x-1.5)/1.5
Lines 2012-2024 Link Here
2012
2017
2013
        i = bbits + be + (Bias + (P - 1) - 1);
2018
        i = bbits + be + (Bias + (P - 1) - 1);
2014
        x = (i > 32) ? (word0(d) << (64 - i)) | (word1(d) >> (i - 32))
2019
        x = (i > 32) ? (word0(&u) << (64 - i)) | (word1(&u) >> (i - 32))
2015
                : word1(d) << (32 - i);
2020
                : word1(&u) << (32 - i);
2016
        dval(d2) = x;
2021
        dval(&d2) = x;
2017
        word0(d2) -= 31 * Exp_msk1; /* adjust exponent */
2022
        word0(&d2) -= 31 * Exp_msk1; /* adjust exponent */
2018
        i -= (Bias + (P - 1) - 1) + 1;
2023
        i -= (Bias + (P - 1) - 1) + 1;
2019
        denorm = 1;
2024
        denorm = 1;
2020
    }
2025
    }
2021
#endif
2026
#endif
2022
    ds = (dval(d2) - 1.5) * 0.289529654602168 + 0.1760912590558 + (i * 0.301029995663981);
2027
    ds = (dval(&d2) - 1.5) * 0.289529654602168 + 0.1760912590558 + (i * 0.301029995663981);
2023
    k = (int)ds;
2028
    k = (int)ds;
2024
    if (ds < 0. && ds != k)
2029
    if (ds < 0. && ds != k)
Lines 2026-2030 Link Here
2026
    k_check = 1;
2031
    k_check = 1;
2027
    if (k >= 0 && k <= Ten_pmax) {
2032
    if (k >= 0 && k <= Ten_pmax) {
2028
        if (dval(d) < tens[k])
2033
        if (dval(&u) < tens[k])
2029
            k--;
2034
            k--;
2030
        k_check = 0;
2035
        k_check = 0;
Lines 2067-2071 Link Here
2067
2072
2068
        i = 0;
2073
        i = 0;
2069
        dval(d2) = dval(d);
2074
        dval(&d2) = dval(&u);
2070
        k0 = k;
2075
        k0 = k;
2071
        ilim0 = ilim;
2076
        ilim0 = ilim;
Lines 2077-2081 Link Here
2077
                /* prevent overflows */
2082
                /* prevent overflows */
2078
                j &= Bletch - 1;
2083
                j &= Bletch - 1;
2079
                dval(d) /= bigtens[n_bigtens - 1];
2084
                dval(&u) /= bigtens[n_bigtens - 1];
2080
                ieps++;
2085
                ieps++;
2081
            }
2086
            }
Lines 2086-2115 Link Here
2086
                }
2091
                }
2087
            }
2092
            }
2088
            dval(d) /= ds;
2093
            dval(&u) /= ds;
2089
        } else if ((j1 = -k)) {
2094
        } else if ((j1 = -k)) {
2090
            dval(d) *= tens[j1 & 0xf];
2095
            dval(&u) *= tens[j1 & 0xf];
2091
            for (j = j1 >> 4; j; j >>= 1, i++) {
2096
            for (j = j1 >> 4; j; j >>= 1, i++) {
2092
                if (j & 1) {
2097
                if (j & 1) {
2093
                    ieps++;
2098
                    ieps++;
2094
                    dval(d) *= bigtens[i];
2099
                    dval(&u) *= bigtens[i];
2095
                }
2100
                }
2096
            }
2101
            }
2097
        }
2102
        }
2098
        if (k_check && dval(d) < 1. && ilim > 0) {
2103
        if (k_check && dval(&u) < 1. && ilim > 0) {
2099
            if (ilim1 <= 0)
2104
            if (ilim1 <= 0)
2100
                goto fast_failed;
2105
                goto fast_failed;
2101
            ilim = ilim1;
2106
            ilim = ilim1;
2102
            k--;
2107
            k--;
2103
            dval(d) *= 10.;
2108
            dval(&u) *= 10.;
2104
            ieps++;
2109
            ieps++;
2105
        }
2110
        }
2106
        dval(eps) = (ieps * dval(d)) + 7.;
2111
        dval(&eps) = (ieps * dval(&u)) + 7.;
2107
        word0(eps) -= (P - 1) * Exp_msk1;
2112
        word0(&eps) -= (P - 1) * Exp_msk1;
2108
        if (ilim == 0) {
2113
        if (ilim == 0) {
2109
            S = mhi = 0;
2114
            S = mhi = 0;
2110
            dval(d) -= 5.;
2115
            dval(&u) -= 5.;
2111
            if (dval(d) > dval(eps))
2116
            if (dval(&u) > dval(&eps))
2112
                goto one_digit;
2117
                goto one_digit;
2113
            if (dval(d) < -dval(eps))
2118
            if (dval(&u) < -dval(&eps))
2114
                goto no_digits;
2119
                goto no_digits;
2115
            goto fast_failed;
2120
            goto fast_failed;
Lines 2120-2150 Link Here
2120
             * generating digits needed.
2125
             * generating digits needed.
2121
             */
2126
             */
2122
            dval(eps) = (0.5 / tens[ilim - 1]) - dval(eps);
2127
            dval(&eps) = (0.5 / tens[ilim - 1]) - dval(&eps);
2123
            for (i = 0;;) {
2128
            for (i = 0;;) {
2124
                L = (long int)dval(d);
2129
                L = (long int)dval(&u);
2125
                dval(d) -= L;
2130
                dval(&u) -= L;
2126
                *s++ = '0' + (int)L;
2131
                *s++ = '0' + (int)L;
2127
                if (dval(d) < dval(eps))
2132
                if (dval(&u) < dval(&eps))
2128
                    goto ret1;
2133
                    goto ret1;
2129
                if (1. - dval(d) < dval(eps))
2134
                if (1. - dval(&u) < dval(&eps))
2130
                    goto bump_up;
2135
                    goto bump_up;
2131
                if (++i >= ilim)
2136
                if (++i >= ilim)
2132
                    break;
2137
                    break;
2133
                dval(eps) *= 10.;
2138
                dval(&eps) *= 10.;
2134
                dval(d) *= 10.;
2139
                dval(&u) *= 10.;
2135
            }
2140
            }
2136
        } else {
2141
        } else {
2137
#endif
2142
#endif
2138
            /* Generate ilim digits, then fix them up. */
2143
            /* Generate ilim digits, then fix them up. */
2139
            dval(eps) *= tens[ilim - 1];
2144
            dval(&eps) *= tens[ilim - 1];
2140
            for (i = 1;; i++, dval(d) *= 10.) {
2145
            for (i = 1;; i++, dval(&u) *= 10.) {
2141
                L = (int32_t)(dval(d));
2146
                L = (int32_t)(dval(&u));
2142
                if (!(dval(d) -= L))
2147
                if (!(dval(&u) -= L))
2143
                    ilim = i;
2148
                    ilim = i;
2144
                *s++ = '0' + (int)L;
2149
                *s++ = '0' + (int)L;
2145
                if (i == ilim) {
2150
                if (i == ilim) {
2146
                    if (dval(d) > 0.5 + dval(eps))
2151
                    if (dval(&u) > 0.5 + dval(&eps))
2147
                        goto bump_up;
2152
                        goto bump_up;
2148
                    else if (dval(d) < 0.5 - dval(eps)) {
2153
                    else if (dval(&u) < 0.5 - dval(&eps)) {
2149
                        while (*--s == '0') { }
2154
                        while (*--s == '0') { }
2150
                        s++;
2155
                        s++;
Lines 2159-2163 Link Here
2159
fast_failed:
2164
fast_failed:
2160
        s = s0;
2165
        s = s0;
2161
        dval(d) = dval(d2);
2166
        dval(&u) = dval(&d2);
2162
        k = k0;
2167
        k = k0;
2163
        ilim = ilim0;
2168
        ilim = ilim0;
Lines 2171-2190 Link Here
2171
        if (ndigits < 0 && ilim <= 0) {
2176
        if (ndigits < 0 && ilim <= 0) {
2172
            S = mhi = 0;
2177
            S = mhi = 0;
2173
            if (ilim < 0 || dval(d) <= 5 * ds)
2178
            if (ilim < 0 || dval(&u) <= 5 * ds)
2174
                goto no_digits;
2179
                goto no_digits;
2175
            goto one_digit;
2180
            goto one_digit;
2176
        }
2181
        }
2177
        for (i = 1;; i++, dval(d) *= 10.) {
2182
        for (i = 1;; i++, dval(&u) *= 10.) {
2178
            L = (int32_t)(dval(d) / ds);
2183
            L = (int32_t)(dval(&u) / ds);
2179
            dval(d) -= L * ds;
2184
            dval(&u) -= L * ds;
2180
#ifdef Check_FLT_ROUNDS
2185
#ifdef Check_FLT_ROUNDS
2181
            /* If FLT_ROUNDS == 2, L will usually be high by 1 */
2186
            /* If FLT_ROUNDS == 2, L will usually be high by 1 */
2182
            if (dval(d) < 0) {
2187
            if (dval(&u) < 0) {
2183
                L--;
2188
                L--;
2184
                dval(d) += ds;
2189
                dval(&u) += ds;
2185
            }
2190
            }
2186
#endif
2191
#endif
2187
            *s++ = '0' + (int)L;
2192
            *s++ = '0' + (int)L;
2188
            if (!dval(d)) {
2193
            if (!dval(&u)) {
2189
#ifdef SET_INEXACT
2194
#ifdef SET_INEXACT
2190
                inexact = 0;
2195
                inexact = 0;
Lines 2193-2198 Link Here
2193
            }
2198
            }
2194
            if (i == ilim) {
2199
            if (i == ilim) {
2195
                dval(d) += dval(d);
2200
                dval(&u) += dval(&u);
2196
                if (dval(d) > ds || (dval(d) == ds && (L & 1))) {
2201
                if (dval(&u) > ds || (dval(&u) == ds && (L & 1))) {
2197
bump_up:
2202
bump_up:
2198
                    while (*--s == '9')
2203
                    while (*--s == '9')
Lines 2249-2255 Link Here
2249
2254
2250
    spec_case = 0;
2255
    spec_case = 0;
2251
    if (!word1(d) && !(word0(d) & Bndry_mask)
2256
    if (!word1(&u) && !(word0(&u) & Bndry_mask)
2252
#ifndef Sudden_Underflow
2257
#ifndef Sudden_Underflow
2253
     && word0(d) & (Exp_mask & ~Exp_msk1)
2258
     && word0(&u) & (Exp_mask & ~Exp_msk1)
2254
#endif
2259
#endif
2255
            ) {
2260
            ) {
Lines 2323-2327 Link Here
2323
            j1 = delta->sign ? 1 : cmp(b, delta);
2328
            j1 = delta->sign ? 1 : cmp(b, delta);
2324
            Bfree(delta);
2329
            Bfree(delta);
2325
            if (j1 == 0 && !(word1(d) & 1)) {
2330
            if (j1 == 0 && !(word1(&u) & 1)) {
2326
                if (dig == '9')
2331
                if (dig == '9')
2327
                    goto round_9_up;
2332
                    goto round_9_up;
Lines 2335-2339 Link Here
2335
                goto ret;
2340
                goto ret;
2336
            }
2341
            }
2337
            if (j < 0 || (j == 0 && !(word1(d) & 1))) {
2342
            if (j < 0 || (j == 0 && !(word1(&u) & 1))) {
2338
                if (!b->x[0] && b->wds <= 1) {
2343
                if (!b->x[0] && b->wds <= 1) {
2339
#ifdef SET_INEXACT
2344
#ifdef SET_INEXACT
Lines 2422-2428 Link Here
2422
    if (inexact) {
2427
    if (inexact) {
2423
        if (!oldinexact) {
2428
        if (!oldinexact) {
2424
            word0(d) = Exp_1 + (70 << Exp_shift);
2429
            word0(&u) = Exp_1 + (70 << Exp_shift);
2425
            word1(d) = 0;
2430
            word1(&u) = 0;
2426
            dval(d) += 1.;
2431
            dval(&u) += 1.;
2427
        }
2432
        }
2428
    } else if (!oldinexact)
2433
    } else if (!oldinexact)

Return to bug 265579