15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Copyright 2010 the V8 project authors. All rights reserved.
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Redistribution and use in source and binary forms, with or without
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// modification, are permitted provided that the following conditions are
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// met:
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//     * Redistributions of source code must retain the above copyright
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//       notice, this list of conditions and the following disclaimer.
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//     * Redistributions in binary form must reproduce the above
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//       copyright notice, this list of conditions and the following
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//       disclaimer in the documentation and/or other materials provided
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//       with the distribution.
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//     * Neither the name of Google Inc. nor the names of its
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//       contributors may be used to endorse or promote products derived
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//       from this software without specific prior written permission.
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <stdarg.h>
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <limits.h>
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "strtod.h"
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "bignum.h"
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "cached-powers.h"
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "double.h"
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WTF {
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace double_conversion {
41fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // 2^53 = 9007199254740992.
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Any integer with at most 15 decimal digits will hence fit into a double
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // (which has a 53bit significand) without loss of precision.
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static const int kMaxExactDoubleIntegerDecimalDigits = 15;
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // 2^64 = 18446744073709551616 > 10^19
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static const int kMaxUint64DecimalDigits = 19;
48fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Max double: 1.7976931348623157 x 10^308
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Min non-zero double: 4.9406564584124654 x 10^-324
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Any x >= 10^309 is interpreted as +infinity.
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Any x <= 10^-324 is interpreted as 0.
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Note that 2.5e-324 (despite being smaller than the min double) will be read
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // as non-zero (equal to the min non-zero double).
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static const int kMaxDecimalPower = 309;
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static const int kMinDecimalPower = -324;
57fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // 2^64 = 18446744073709551616
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static const uint64_t kMaxUint64 = UINT64_2PART_C(0xFFFFFFFF, FFFFFFFF);
60fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
61fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static const double exact_powers_of_ten[] = {
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        1.0,  // 10^0
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        10.0,
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        100.0,
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        1000.0,
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        10000.0,
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        100000.0,
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        1000000.0,
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        10000000.0,
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        100000000.0,
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        1000000000.0,
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        10000000000.0,  // 10^10
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        100000000000.0,
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        1000000000000.0,
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        10000000000000.0,
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        100000000000000.0,
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        1000000000000000.0,
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        10000000000000000.0,
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        100000000000000000.0,
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        1000000000000000000.0,
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        10000000000000000000.0,
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        100000000000000000000.0,  // 10^20
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        1000000000000000000000.0,
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // 10^22 = 0x21e19e0c9bab2400000 = 0x878678326eac9 * 2^22
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        10000000000000000000000.0
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static const int kExactPowersOfTenSize = ARRAY_SIZE(exact_powers_of_ten);
89fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Maximum number of significant digits in the decimal representation.
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // In fact the value is 772 (see conversions.cc), but to give us some margin
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // we round up to 780.
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static const int kMaxSignificantDecimalDigits = 780;
94fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static Vector<const char> TrimLeadingZeros(Vector<const char> buffer) {
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (int i = 0; i < buffer.length(); i++) {
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (buffer[i] != '0') {
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return buffer.SubVector(i, buffer.length());
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return Vector<const char>(buffer.start(), 0);
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
103fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
104fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static Vector<const char> TrimTrailingZeros(Vector<const char> buffer) {
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (int i = buffer.length() - 1; i >= 0; --i) {
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (buffer[i] != '0') {
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return buffer.SubVector(0, i + 1);
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return Vector<const char>(buffer.start(), 0);
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
113fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
114fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static void TrimToMaxSignificantDigits(Vector<const char> buffer,
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                           int exponent,
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                           char* significant_buffer,
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                           int* significant_exponent) {
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (int i = 0; i < kMaxSignificantDecimalDigits - 1; ++i) {
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            significant_buffer[i] = buffer[i];
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // The input buffer has been trimmed. Therefore the last digit must be
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // different from '0'.
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(buffer[buffer.length() - 1] != '0');
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Set the last digit to be non-zero. This is sufficient to guarantee
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // correct rounding.
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        significant_buffer[kMaxSignificantDecimalDigits - 1] = '1';
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        *significant_exponent =
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        exponent + (buffer.length() - kMaxSignificantDecimalDigits);
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
131fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Reads digits from the buffer and converts them to a uint64.
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Reads in as many digits as fit into a uint64.
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // When the string starts with "1844674407370955161" no further digit is read.
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Since 2^64 = 18446744073709551616 it would still be possible read another
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // digit if it was less or equal than 6, but this would complicate the code.
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static uint64_t ReadUint64(Vector<const char> buffer,
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                               int* number_of_read_digits) {
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        uint64_t result = 0;
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        int i = 0;
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        while (i < buffer.length() && result <= (kMaxUint64 / 10 - 1)) {
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            int digit = buffer[i++] - '0';
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            ASSERT(0 <= digit && digit <= 9);
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            result = 10 * result + digit;
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        *number_of_read_digits = i;
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return result;
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
149fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
150fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Reads a DiyFp from the buffer.
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // The returned DiyFp is not necessarily normalized.
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If remaining_decimals is zero then the returned DiyFp is accurate.
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Otherwise it has been rounded and has error of at most 1/2 ulp.
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static void ReadDiyFp(Vector<const char> buffer,
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                          DiyFp* result,
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                          int* remaining_decimals) {
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        int read_digits;
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        uint64_t significand = ReadUint64(buffer, &read_digits);
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (buffer.length() == read_digits) {
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            *result = DiyFp(significand, 0);
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            *remaining_decimals = 0;
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } else {
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Round the significand.
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (buffer[read_digits] >= '5') {
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                significand++;
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Compute the binary exponent.
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            int exponent = 0;
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            *result = DiyFp(significand, exponent);
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            *remaining_decimals = buffer.length() - read_digits;
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
174fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
175fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static bool DoubleStrtod(Vector<const char> trimmed,
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                             int exponent,
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                             double* result) {
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if !defined(DOUBLE_CONVERSION_CORRECT_DOUBLE_OPERATIONS)
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // On x86 the floating-point stack can be 64 or 80 bits wide. If it is
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // 80 bits wide (as is the case on Linux) then double-rounding occurs and the
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // result is not accurate.
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // We know that Windows32 uses 64 bits and is therefore accurate.
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Note that the ARM simulator is compiled for 32bits. It therefore exhibits
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // the same problem.
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (trimmed.length() <= kMaxExactDoubleIntegerDecimalDigits) {
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            int read_digits;
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // The trimmed input fits into a double.
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // If the 10^exponent (resp. 10^-exponent) fits into a double too then we
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // can compute the result-double simply by multiplying (resp. dividing) the
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // two numbers.
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // This is possible because IEEE guarantees that floating-point operations
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // return the best possible approximation.
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (exponent < 0 && -exponent < kExactPowersOfTenSize) {
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // 10^-exponent fits into a double.
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                *result = static_cast<double>(ReadUint64(trimmed, &read_digits));
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                ASSERT(read_digits == trimmed.length());
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                *result /= exact_powers_of_ten[-exponent];
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return true;
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (0 <= exponent && exponent < kExactPowersOfTenSize) {
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // 10^exponent fits into a double.
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                *result = static_cast<double>(ReadUint64(trimmed, &read_digits));
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                ASSERT(read_digits == trimmed.length());
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                *result *= exact_powers_of_ten[exponent];
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return true;
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            int remaining_digits =
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            kMaxExactDoubleIntegerDecimalDigits - trimmed.length();
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if ((0 <= exponent) &&
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                (exponent - remaining_digits < kExactPowersOfTenSize)) {
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // The trimmed string was short and we can multiply it with
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // 10^remaining_digits. As a result the remaining exponent now fits
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // into a double too.
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                *result = static_cast<double>(ReadUint64(trimmed, &read_digits));
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                ASSERT(read_digits == trimmed.length());
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                *result *= exact_powers_of_ten[remaining_digits];
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                *result *= exact_powers_of_ten[exponent - remaining_digits];
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return true;
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
226fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
227fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Returns 10^exponent as an exact DiyFp.
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // The given exponent must be in the range [1; kDecimalExponentDistance[.
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static DiyFp AdjustmentPowerOfTen(int exponent) {
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(0 < exponent);
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(exponent < PowersOfTenCache::kDecimalExponentDistance);
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Simply hardcode the remaining powers for the given decimal exponent
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // distance.
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(PowersOfTenCache::kDecimalExponentDistance == 8);
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        switch (exponent) {
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            case 1: return DiyFp(UINT64_2PART_C(0xa0000000, 00000000), -60);
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            case 2: return DiyFp(UINT64_2PART_C(0xc8000000, 00000000), -57);
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            case 3: return DiyFp(UINT64_2PART_C(0xfa000000, 00000000), -54);
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            case 4: return DiyFp(UINT64_2PART_C(0x9c400000, 00000000), -50);
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            case 5: return DiyFp(UINT64_2PART_C(0xc3500000, 00000000), -47);
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            case 6: return DiyFp(UINT64_2PART_C(0xf4240000, 00000000), -44);
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            case 7: return DiyFp(UINT64_2PART_C(0x98968000, 00000000), -40);
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            default:
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                UNREACHABLE();
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return DiyFp(0, 0);
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
249fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
250fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If the function returns true then the result is the correct double.
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Otherwise it is either the correct double or the double that is just below
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // the correct double.
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static bool DiyFpStrtod(Vector<const char> buffer,
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                            int exponent,
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                            double* result) {
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        DiyFp input;
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        int remaining_decimals;
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ReadDiyFp(buffer, &input, &remaining_decimals);
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Since we may have dropped some digits the input is not accurate.
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // If remaining_decimals is different than 0 than the error is at most
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // .5 ulp (unit in the last place).
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // We don't want to deal with fractions and therefore keep a common
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // denominator.
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        const int kDenominatorLog = 3;
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        const int kDenominator = 1 << kDenominatorLog;
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Move the remaining decimals into the exponent.
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        exponent += remaining_decimals;
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        int error = (remaining_decimals == 0 ? 0 : kDenominator / 2);
270fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        int old_e = input.e();
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        input.Normalize();
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        error <<= old_e - input.e();
274fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(exponent <= PowersOfTenCache::kMaxDecimalExponent);
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (exponent < PowersOfTenCache::kMinDecimalExponent) {
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            *result = 0.0;
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return true;
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        DiyFp cached_power;
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        int cached_decimal_exponent;
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        PowersOfTenCache::GetCachedPowerForDecimalExponent(exponent,
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                           &cached_power,
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                           &cached_decimal_exponent);
285fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (cached_decimal_exponent != exponent) {
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            int adjustment_exponent = exponent - cached_decimal_exponent;
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            DiyFp adjustment_power = AdjustmentPowerOfTen(adjustment_exponent);
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            input.Multiply(adjustment_power);
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (kMaxUint64DecimalDigits - buffer.length() >= adjustment_exponent) {
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // The product of input with the adjustment power fits into a 64 bit
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // integer.
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                ASSERT(DiyFp::kSignificandSize == 64);
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            } else {
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // The adjustment power is exact. There is hence only an error of 0.5.
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                error += kDenominator / 2;
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
299fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        input.Multiply(cached_power);
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // The error introduced by a multiplication of a*b equals
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        //   error_a + error_b + error_a*error_b/2^64 + 0.5
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Substituting a with 'input' and b with 'cached_power' we have
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        //   error_b = 0.5  (all cached powers have an error of less than 0.5 ulp),
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        //   error_ab = 0 or 1 / kDenominator > error_a*error_b/ 2^64
3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        int error_b = kDenominator / 2;
3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        int error_ab = (error == 0 ? 0 : 1);  // We round up to 1.
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        int fixed_error = kDenominator / 2;
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        error += error_b + error_ab + fixed_error;
310fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        old_e = input.e();
3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        input.Normalize();
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        error <<= old_e - input.e();
314fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // See if the double's significand changes if we add/subtract the error.
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        int order_of_magnitude = DiyFp::kSignificandSize + input.e();
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        int effective_significand_size =
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Double::SignificandSizeForOrderOfMagnitude(order_of_magnitude);
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        int precision_digits_count =
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        DiyFp::kSignificandSize - effective_significand_size;
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (precision_digits_count + kDenominatorLog >= DiyFp::kSignificandSize) {
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // This can only happen for very small denormals. In this case the
3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // half-way multiplied by the denominator exceeds the range of an uint64.
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Simply shift everything to the right.
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            int shift_amount = (precision_digits_count + kDenominatorLog) -
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            DiyFp::kSignificandSize + 1;
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            input.set_f(input.f() >> shift_amount);
3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            input.set_e(input.e() + shift_amount);
3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // We add 1 for the lost precision of error, and kDenominator for
3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // the lost precision of input.f().
3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            error = (error >> shift_amount) + 1 + kDenominator;
3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            precision_digits_count -= shift_amount;
3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // We use uint64_ts now. This only works if the DiyFp uses uint64_ts too.
3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(DiyFp::kSignificandSize == 64);
3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(precision_digits_count < 64);
3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        uint64_t one64 = 1;
3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        uint64_t precision_bits_mask = (one64 << precision_digits_count) - 1;
3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        uint64_t precision_bits = input.f() & precision_bits_mask;
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        uint64_t half_way = one64 << (precision_digits_count - 1);
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        precision_bits *= kDenominator;
3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        half_way *= kDenominator;
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        DiyFp rounded_input(input.f() >> precision_digits_count,
3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                            input.e() + precision_digits_count);
3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (precision_bits >= half_way + error) {
3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            rounded_input.set_f(rounded_input.f() + 1);
3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // If the last_bits are too close to the half-way case than we are too
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // inaccurate and round down. In this case we return false so that we can
3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // fall back to a more precise algorithm.
351fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        *result = Double(rounded_input).value();
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (half_way - error < precision_bits && precision_bits < half_way + error) {
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Too imprecise. The caller will have to fall back to a slower version.
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // However the returned number is guaranteed to be either the correct
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // double, or the next-lower double.
3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return false;
3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } else {
3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return true;
3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
362fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
363fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Returns the correct double for the buffer*10^exponent.
3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // The variable guess should be a close guess that is either the correct double
3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // or its lower neighbor (the nearest double less than the correct one).
3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Preconditions:
3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //   buffer.length() + exponent <= kMaxDecimalPower + 1
3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //   buffer.length() + exponent > kMinDecimalPower
3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //   buffer.length() <= kMaxDecimalSignificantDigits
3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static double BignumStrtod(Vector<const char> buffer,
3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                               int exponent,
3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                               double guess) {
3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (guess == Double::Infinity()) {
3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return guess;
3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
377fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        DiyFp upper_boundary = Double(guess).UpperBoundary();
379fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(buffer.length() + exponent <= kMaxDecimalPower + 1);
3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(buffer.length() + exponent > kMinDecimalPower);
3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(buffer.length() <= kMaxSignificantDecimalDigits);
3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Make sure that the Bignum will be able to hold all our numbers.
3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Our Bignum implementation has a separate field for exponents. Shifts will
3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // consume at most one bigit (< 64 bits).
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // ln(10) == 3.3219...
3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(((kMaxDecimalPower + 1) * 333 / 100) < Bignum::kMaxSignificantBits);
3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Bignum input;
3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Bignum boundary;
3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        input.AssignDecimalString(buffer);
3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        boundary.AssignUInt64(upper_boundary.f());
3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (exponent >= 0) {
3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            input.MultiplyByPowerOfTen(exponent);
3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } else {
3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            boundary.MultiplyByPowerOfTen(-exponent);
3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (upper_boundary.e() > 0) {
3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            boundary.ShiftLeft(upper_boundary.e());
3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } else {
4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            input.ShiftLeft(-upper_boundary.e());
4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        int comparison = Bignum::Compare(input, boundary);
4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (comparison < 0) {
4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return guess;
4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } else if (comparison > 0) {
4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return Double(guess).NextDouble();
4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } else if ((Double(guess).Significand() & 1) == 0) {
4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Round towards even.
4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return guess;
4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        } else {
4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return Double(guess).NextDouble();
4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
414fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
415fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    double Strtod(Vector<const char> buffer, int exponent) {
4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Vector<const char> left_trimmed = TrimLeadingZeros(buffer);
4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Vector<const char> trimmed = TrimTrailingZeros(left_trimmed);
4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        exponent += left_trimmed.length() - trimmed.length();
4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (trimmed.length() == 0) return 0.0;
4215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (trimmed.length() > kMaxSignificantDecimalDigits) {
4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            char significant_buffer[kMaxSignificantDecimalDigits];
4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            int significant_exponent;
4245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            TrimToMaxSignificantDigits(trimmed, exponent,
4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                       significant_buffer, &significant_exponent);
4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return Strtod(Vector<const char>(significant_buffer,
4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                             kMaxSignificantDecimalDigits),
4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                          significant_exponent);
4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (exponent + trimmed.length() - 1 >= kMaxDecimalPower) {
4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return Double::Infinity();
4325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
4335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (exponent + trimmed.length() <= kMinDecimalPower) {
4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return 0.0;
4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
436fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
4375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        double guess;
4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (DoubleStrtod(trimmed, exponent, &guess) ||
4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            DiyFpStrtod(trimmed, exponent, &guess)) {
4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return guess;
4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return BignumStrtod(trimmed, exponent, guess);
4435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
444fff8884795cb540f87cf6e6d67b629519b00eb8bBen Murdoch
4455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}  // namespace double_conversion
4465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WTF
448