// Copyright 2010 the V8 project authors. All rights reserved.
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
//     * Redistributions of source code must retain the above copyright
//       notice, this list of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above
//       copyright notice, this list of conditions and the following
//       disclaimer in the documentation and/or other materials provided
//       with the distribution.
//     * Neither the name of Google Inc. nor the names of its
//       contributors may be used to endorse or promote products derived
//       from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

#include "config.h"

#include "fast-dtoa.h"

#include "cached-powers.h"
#include "diy-fp.h"
#include "double.h"

namespace WTF {

namespace double_conversion {
    
    // The minimal and maximal target exponent define the range of w's binary
    // exponent, where 'w' is the result of multiplying the input by a cached power
    // of ten.
    //
    // A different range might be chosen on a different platform, to optimize digit
    // generation, but a smaller range requires more powers of ten to be cached.
    static const int kMinimalTargetExponent = -60;
    static const int kMaximalTargetExponent = -32;
    
    
    // Adjusts the last digit of the generated number, and screens out generated
    // solutions that may be inaccurate. A solution may be inaccurate if it is
    // outside the safe interval, or if we cannot prove that it is closer to the
    // input than a neighboring representation of the same length.
    //
    // Input: * buffer containing the digits of too_high / 10^kappa
    //        * the buffer's length
    //        * distance_too_high_w == (too_high - w).f() * unit
    //        * unsafe_interval == (too_high - too_low).f() * unit
    //        * rest = (too_high - buffer * 10^kappa).f() * unit
    //        * ten_kappa = 10^kappa * unit
    //        * unit = the common multiplier
    // Output: returns true if the buffer is guaranteed to contain the closest
    //    representable number to the input.
    //  Modifies the generated digits in the buffer to approach (round towards) w.
    static bool RoundWeed(Vector<char> buffer,
                          int length,
                          uint64_t distance_too_high_w,
                          uint64_t unsafe_interval,
                          uint64_t rest,
                          uint64_t ten_kappa,
                          uint64_t unit) {
        uint64_t small_distance = distance_too_high_w - unit;
        uint64_t big_distance = distance_too_high_w + unit;
        // Let w_low  = too_high - big_distance, and
        //     w_high = too_high - small_distance.
        // Note: w_low < w < w_high
        //
        // The real w (* unit) must lie somewhere inside the interval
        // ]w_low; w_high[ (often written as "(w_low; w_high)")
        
        // Basically the buffer currently contains a number in the unsafe interval
        // ]too_low; too_high[ with too_low < w < too_high
        //
        //  too_high - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        //                     ^v 1 unit            ^      ^                 ^      ^
        //  boundary_high ---------------------     .      .                 .      .
        //                     ^v 1 unit            .      .                 .      .
        //   - - - - - - - - - - - - - - - - - - -  +  - - + - - - - - -     .      .
        //                                          .      .         ^       .      .
        //                                          .  big_distance  .       .      .
        //                                          .      .         .       .    rest
        //                              small_distance     .         .       .      .
        //                                          v      .         .       .      .
        //  w_high - - - - - - - - - - - - - - - - - -     .         .       .      .
        //                     ^v 1 unit                   .         .       .      .
        //  w ----------------------------------------     .         .       .      .
        //                     ^v 1 unit                   v         .       .      .
        //  w_low  - - - - - - - - - - - - - - - - - - - - -         .       .      .
        //                                                           .       .      v
        //  buffer --------------------------------------------------+-------+--------
        //                                                           .       .
        //                                                  safe_interval    .
        //                                                           v       .
        //   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -     .
        //                     ^v 1 unit                                     .
        //  boundary_low -------------------------                     unsafe_interval
        //                     ^v 1 unit                                     v
        //  too_low  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        //
        //
        // Note that the value of buffer could lie anywhere inside the range too_low
        // to too_high.
        //
        // boundary_low, boundary_high and w are approximations of the real boundaries
        // and v (the input number). They are guaranteed to be precise up to one unit.
        // In fact the error is guaranteed to be strictly less than one unit.
        //
        // Anything that lies outside the unsafe interval is guaranteed not to round
        // to v when read again.
        // Anything that lies inside the safe interval is guaranteed to round to v
        // when read again.
        // If the number inside the buffer lies inside the unsafe interval but not
        // inside the safe interval then we simply do not know and bail out (returning
        // false).
        //
        // Similarly we have to take into account the imprecision of 'w' when finding
        // the closest representation of 'w'. If we have two potential
        // representations, and one is closer to both w_low and w_high, then we know
        // it is closer to the actual value v.
        //
        // By generating the digits of too_high we got the largest (closest to
        // too_high) buffer that is still in the unsafe interval. In the case where
        // w_high < buffer < too_high we try to decrement the buffer.
        // This way the buffer approaches (rounds towards) w.
        // There are 3 conditions that stop the decrementation process:
        //   1) the buffer is already below w_high
        //   2) decrementing the buffer would make it leave the unsafe interval
        //   3) decrementing the buffer would yield a number below w_high and farther
        //      away than the current number. In other words:
        //              (buffer{-1} < w_high) && w_high - buffer{-1} > buffer - w_high
        // Instead of using the buffer directly we use its distance to too_high.
        // Conceptually rest ~= too_high - buffer
        // We need to do the following tests in this order to avoid over- and
        // underflows.
        ASSERT(rest <= unsafe_interval);
        while (rest < small_distance &&  // Negated condition 1
               unsafe_interval - rest >= ten_kappa &&  // Negated condition 2
               (rest + ten_kappa < small_distance ||  // buffer{-1} > w_high
                small_distance - rest >= rest + ten_kappa - small_distance)) {
                   buffer[length - 1]--;
                   rest += ten_kappa;
               }
        
        // We have approached w+ as much as possible. We now test if approaching w-
        // would require changing the buffer. If yes, then we have two possible
        // representations close to w, but we cannot decide which one is closer.
        if (rest < big_distance &&
            unsafe_interval - rest >= ten_kappa &&
            (rest + ten_kappa < big_distance ||
             big_distance - rest > rest + ten_kappa - big_distance)) {
                return false;
            }
        
        // Weeding test.
        //   The safe interval is [too_low + 2 ulp; too_high - 2 ulp]
        //   Since too_low = too_high - unsafe_interval this is equivalent to
        //      [too_high - unsafe_interval + 4 ulp; too_high - 2 ulp]
        //   Conceptually we have: rest ~= too_high - buffer
        return (2 * unit <= rest) && (rest <= unsafe_interval - 4 * unit);
    }
    
    
    // Rounds the buffer upwards if the result is closer to v by possibly adding
    // 1 to the buffer. If the precision of the calculation is not sufficient to
    // round correctly, return false.
    // The rounding might shift the whole buffer in which case the kappa is
    // adjusted. For example "99", kappa = 3 might become "10", kappa = 4.
    //
    // If 2*rest > ten_kappa then the buffer needs to be round up.
    // rest can have an error of +/- 1 unit. This function accounts for the
    // imprecision and returns false, if the rounding direction cannot be
    // unambiguously determined.
    //
    // Precondition: rest < ten_kappa.
    static bool RoundWeedCounted(Vector<char> buffer,
                                 int length,
                                 uint64_t rest,
                                 uint64_t ten_kappa,
                                 uint64_t unit,
                                 int* kappa) {
        ASSERT(rest < ten_kappa);
        // The following tests are done in a specific order to avoid overflows. They
        // will work correctly with any uint64 values of rest < ten_kappa and unit.
        //
        // If the unit is too big, then we don't know which way to round. For example
        // a unit of 50 means that the real number lies within rest +/- 50. If
        // 10^kappa == 40 then there is no way to tell which way to round.
        if (unit >= ten_kappa) return false;
        // Even if unit is just half the size of 10^kappa we are already completely
        // lost. (And after the previous test we know that the expression will not
        // over/underflow.)
        if (ten_kappa - unit <= unit) return false;
        // If 2 * (rest + unit) <= 10^kappa we can safely round down.
        if ((ten_kappa - rest > rest) && (ten_kappa - 2 * rest >= 2 * unit)) {
            return true;
        }
        // If 2 * (rest - unit) >= 10^kappa, then we can safely round up.
        if ((rest > unit) && (ten_kappa - (rest - unit) <= (rest - unit))) {
            // Increment the last digit recursively until we find a non '9' digit.
            buffer[length - 1]++;
            for (int i = length - 1; i > 0; --i) {
                if (buffer[i] != '0' + 10) break;
                buffer[i] = '0';
                buffer[i - 1]++;
            }
            // If the first digit is now '0'+ 10 we had a buffer with all '9's. With the
            // exception of the first digit all digits are now '0'. Simply switch the
            // first digit to '1' and adjust the kappa. Example: "99" becomes "10" and
            // the power (the kappa) is increased.
            if (buffer[0] == '0' + 10) {
                buffer[0] = '1';
                (*kappa) += 1;
            }
            return true;
        }
        return false;
    }
    
    
    static const uint32_t kTen4 = 10000;
    static const uint32_t kTen5 = 100000;
    static const uint32_t kTen6 = 1000000;
    static const uint32_t kTen7 = 10000000;
    static const uint32_t kTen8 = 100000000;
    static const uint32_t kTen9 = 1000000000;
    
    // Returns the biggest power of ten that is less than or equal to the given
    // number. We furthermore receive the maximum number of bits 'number' has.
    // If number_bits == 0 then 0^-1 is returned
    // The number of bits must be <= 32.
    // Precondition: number < (1 << (number_bits + 1)).
    static void BiggestPowerTen(uint32_t number,
                                int number_bits,
                                uint32_t* power,
                                int* exponent) {
        ASSERT(number < (uint32_t)(1 << (number_bits + 1)));
        
        switch (number_bits) {
            case 32:
            case 31:
            case 30:
                if (kTen9 <= number) {
                    *power = kTen9;
                    *exponent = 9;
                    break;
                }  // else fallthrough
            case 29:
            case 28:
            case 27:
                if (kTen8 <= number) {
                    *power = kTen8;
                    *exponent = 8;
                    break;
                }  // else fallthrough
            case 26:
            case 25:
            case 24:
                if (kTen7 <= number) {
                    *power = kTen7;
                    *exponent = 7;
                    break;
                }  // else fallthrough
            case 23:
            case 22:
            case 21:
            case 20:
                if (kTen6 <= number) {
                    *power = kTen6;
                    *exponent = 6;
                    break;
                }  // else fallthrough
            case 19:
            case 18:
            case 17:
                if (kTen5 <= number) {
                    *power = kTen5;
                    *exponent = 5;
                    break;
                }  // else fallthrough
            case 16:
            case 15:
            case 14:
                if (kTen4 <= number) {
                    *power = kTen4;
                    *exponent = 4;
                    break;
                }  // else fallthrough
            case 13:
            case 12:
            case 11:
            case 10:
                if (1000 <= number) {
                    *power = 1000;
                    *exponent = 3;
                    break;
                }  // else fallthrough
            case 9:
            case 8:
            case 7:
                if (100 <= number) {
                    *power = 100;
                    *exponent = 2;
                    break;
                }  // else fallthrough
            case 6:
            case 5:
            case 4:
                if (10 <= number) {
                    *power = 10;
                    *exponent = 1;
                    break;
                }  // else fallthrough
            case 3:
            case 2:
            case 1:
                if (1 <= number) {
                    *power = 1;
                    *exponent = 0;
                    break;
                }  // else fallthrough
            case 0:
                *power = 0;
                *exponent = -1;
                break;
            default:
                // Following assignments are here to silence compiler warnings.
                *power = 0;
                *exponent = 0;
                UNREACHABLE();
        }
    }
    
    
    // Generates the digits of input number w.
    // w is a floating-point number (DiyFp), consisting of a significand and an
    // exponent. Its exponent is bounded by kMinimalTargetExponent and
    // kMaximalTargetExponent.
    //       Hence -60 <= w.e() <= -32.
    //
    // Returns false if it fails, in which case the generated digits in the buffer
    // should not be used.
    // Preconditions:
    //  * low, w and high are correct up to 1 ulp (unit in the last place). That
    //    is, their error must be less than a unit of their last digits.
    //  * low.e() == w.e() == high.e()
    //  * low < w < high, and taking into account their error: low~ <= high~
    //  * kMinimalTargetExponent <= w.e() <= kMaximalTargetExponent
    // Postconditions: returns false if procedure fails.
    //   otherwise:
    //     * buffer is not null-terminated, but len contains the number of digits.
    //     * buffer contains the shortest possible decimal digit-sequence
    //       such that LOW < buffer * 10^kappa < HIGH, where LOW and HIGH are the
    //       correct values of low and high (without their error).
    //     * if more than one decimal representation gives the minimal number of
    //       decimal digits then the one closest to W (where W is the correct value
    //       of w) is chosen.
    // Remark: this procedure takes into account the imprecision of its input
    //   numbers. If the precision is not enough to guarantee all the postconditions
    //   then false is returned. This usually happens rarely (~0.5%).
    //
    // Say, for the sake of example, that
    //   w.e() == -48, and w.f() == 0x1234567890abcdef
    // w's value can be computed by w.f() * 2^w.e()
    // We can obtain w's integral digits by simply shifting w.f() by -w.e().
    //  -> w's integral part is 0x1234
    //  w's fractional part is therefore 0x567890abcdef.
    // Printing w's integral part is easy (simply print 0x1234 in decimal).
    // In order to print its fraction we repeatedly multiply the fraction by 10 and
    // get each digit. Example the first digit after the point would be computed by
    //   (0x567890abcdef * 10) >> 48. -> 3
    // The whole thing becomes slightly more complicated because we want to stop
    // once we have enough digits. That is, once the digits inside the buffer
    // represent 'w' we can stop. Everything inside the interval low - high
    // represents w. However we have to pay attention to low, high and w's
    // imprecision.
    static bool DigitGen(DiyFp low,
                         DiyFp w,
                         DiyFp high,
                         Vector<char> buffer,
                         int* length,
                         int* kappa) {
        ASSERT(low.e() == w.e() && w.e() == high.e());
        ASSERT(low.f() + 1 <= high.f() - 1);
        ASSERT(kMinimalTargetExponent <= w.e() && w.e() <= kMaximalTargetExponent);
        // low, w and high are imprecise, but by less than one ulp (unit in the last
        // place).
        // If we remove (resp. add) 1 ulp from low (resp. high) we are certain that
        // the new numbers are outside of the interval we want the final
        // representation to lie in.
        // Inversely adding (resp. removing) 1 ulp from low (resp. high) would yield
        // numbers that are certain to lie in the interval. We will use this fact
        // later on.
        // We will now start by generating the digits within the uncertain
        // interval. Later we will weed out representations that lie outside the safe
        // interval and thus _might_ lie outside the correct interval.
        uint64_t unit = 1;
        DiyFp too_low = DiyFp(low.f() - unit, low.e());
        DiyFp too_high = DiyFp(high.f() + unit, high.e());
        // too_low and too_high are guaranteed to lie outside the interval we want the
        // generated number in.
        DiyFp unsafe_interval = DiyFp::Minus(too_high, too_low);
        // We now cut the input number into two parts: the integral digits and the
        // fractionals. We will not write any decimal separator though, but adapt
        // kappa instead.
        // Reminder: we are currently computing the digits (stored inside the buffer)
        // such that:   too_low < buffer * 10^kappa < too_high
        // We use too_high for the digit_generation and stop as soon as possible.
        // If we stop early we effectively round down.
        DiyFp one = DiyFp(static_cast<uint64_t>(1) << -w.e(), w.e());
        // Division by one is a shift.
        uint32_t integrals = static_cast<uint32_t>(too_high.f() >> -one.e());
        // Modulo by one is an and.
        uint64_t fractionals = too_high.f() & (one.f() - 1);
        uint32_t divisor;
        int divisor_exponent;
        BiggestPowerTen(integrals, DiyFp::kSignificandSize - (-one.e()),
                        &divisor, &divisor_exponent);
        *kappa = divisor_exponent + 1;
        *length = 0;
        // Loop invariant: buffer = too_high / 10^kappa  (integer division)
        // The invariant holds for the first iteration: kappa has been initialized
        // with the divisor exponent + 1. And the divisor is the biggest power of ten
        // that is smaller than integrals.
        while (*kappa > 0) {
            int digit = integrals / divisor;
            buffer[*length] = '0' + digit;
            (*length)++;
            integrals %= divisor;
            (*kappa)--;
            // Note that kappa now equals the exponent of the divisor and that the
            // invariant thus holds again.
            uint64_t rest =
            (static_cast<uint64_t>(integrals) << -one.e()) + fractionals;
            // Invariant: too_high = buffer * 10^kappa + DiyFp(rest, one.e())
            // Reminder: unsafe_interval.e() == one.e()
            if (rest < unsafe_interval.f()) {
                // Rounding down (by not emitting the remaining digits) yields a number
                // that lies within the unsafe interval.
                return RoundWeed(buffer, *length, DiyFp::Minus(too_high, w).f(),
                                 unsafe_interval.f(), rest,
                                 static_cast<uint64_t>(divisor) << -one.e(), unit);
            }
            divisor /= 10;
        }
        
        // The integrals have been generated. We are at the point of the decimal
        // separator. In the following loop we simply multiply the remaining digits by
        // 10 and divide by one. We just need to pay attention to multiply associated
        // data (like the interval or 'unit'), too.
        // Note that the multiplication by 10 does not overflow, because w.e >= -60
        // and thus one.e >= -60.
        ASSERT(one.e() >= -60);
        ASSERT(fractionals < one.f());
        ASSERT(UINT64_2PART_C(0xFFFFFFFF, FFFFFFFF) / 10 >= one.f());
        while (true) {
            fractionals *= 10;
            unit *= 10;
            unsafe_interval.set_f(unsafe_interval.f() * 10);
            // Integer division by one.
            int digit = static_cast<int>(fractionals >> -one.e());
            buffer[*length] = '0' + digit;
            (*length)++;
            fractionals &= one.f() - 1;  // Modulo by one.
            (*kappa)--;
            if (fractionals < unsafe_interval.f()) {
                return RoundWeed(buffer, *length, DiyFp::Minus(too_high, w).f() * unit,
                                 unsafe_interval.f(), fractionals, one.f(), unit);
            }
        }
    }
    
    
    
    // Generates (at most) requested_digits digits of input number w.
    // w is a floating-point number (DiyFp), consisting of a significand and an
    // exponent. Its exponent is bounded by kMinimalTargetExponent and
    // kMaximalTargetExponent.
    //       Hence -60 <= w.e() <= -32.
    //
    // Returns false if it fails, in which case the generated digits in the buffer
    // should not be used.
    // Preconditions:
    //  * w is correct up to 1 ulp (unit in the last place). That
    //    is, its error must be strictly less than a unit of its last digit.
    //  * kMinimalTargetExponent <= w.e() <= kMaximalTargetExponent
    //
    // Postconditions: returns false if procedure fails.
    //   otherwise:
    //     * buffer is not null-terminated, but length contains the number of
    //       digits.
    //     * the representation in buffer is the most precise representation of
    //       requested_digits digits.
    //     * buffer contains at most requested_digits digits of w. If there are less
    //       than requested_digits digits then some trailing '0's have been removed.
    //     * kappa is such that
    //            w = buffer * 10^kappa + eps with |eps| < 10^kappa / 2.
    //
    // Remark: This procedure takes into account the imprecision of its input
    //   numbers. If the precision is not enough to guarantee all the postconditions
    //   then false is returned. This usually happens rarely, but the failure-rate
    //   increases with higher requested_digits.
    static bool DigitGenCounted(DiyFp w,
                                int requested_digits,
                                Vector<char> buffer,
                                int* length,
                                int* kappa) {
        ASSERT(kMinimalTargetExponent <= w.e() && w.e() <= kMaximalTargetExponent);
        ASSERT(kMinimalTargetExponent >= -60);
        ASSERT(kMaximalTargetExponent <= -32);
        // w is assumed to have an error less than 1 unit. Whenever w is scaled we
        // also scale its error.
        uint64_t w_error = 1;
        // We cut the input number into two parts: the integral digits and the
        // fractional digits. We don't emit any decimal separator, but adapt kappa
        // instead. Example: instead of writing "1.2" we put "12" into the buffer and
        // increase kappa by 1.
        DiyFp one = DiyFp(static_cast<uint64_t>(1) << -w.e(), w.e());
        // Division by one is a shift.
        uint32_t integrals = static_cast<uint32_t>(w.f() >> -one.e());
        // Modulo by one is an and.
        uint64_t fractionals = w.f() & (one.f() - 1);
        uint32_t divisor;
        int divisor_exponent;
        BiggestPowerTen(integrals, DiyFp::kSignificandSize - (-one.e()),
                        &divisor, &divisor_exponent);
        *kappa = divisor_exponent + 1;
        *length = 0;
        
        // Loop invariant: buffer = w / 10^kappa  (integer division)
        // The invariant holds for the first iteration: kappa has been initialized
        // with the divisor exponent + 1. And the divisor is the biggest power of ten
        // that is smaller than 'integrals'.
        while (*kappa > 0) {
            int digit = integrals / divisor;
            buffer[*length] = '0' + digit;
            (*length)++;
            requested_digits--;
            integrals %= divisor;
            (*kappa)--;
            // Note that kappa now equals the exponent of the divisor and that the
            // invariant thus holds again.
            if (requested_digits == 0) break;
            divisor /= 10;
        }
        
        if (requested_digits == 0) {
            uint64_t rest =
            (static_cast<uint64_t>(integrals) << -one.e()) + fractionals;
            return RoundWeedCounted(buffer, *length, rest,
                                    static_cast<uint64_t>(divisor) << -one.e(), w_error,
                                    kappa);
        }
        
        // The integrals have been generated. We are at the point of the decimal
        // separator. In the following loop we simply multiply the remaining digits by
        // 10 and divide by one. We just need to pay attention to multiply associated
        // data (the 'unit'), too.
        // Note that the multiplication by 10 does not overflow, because w.e >= -60
        // and thus one.e >= -60.
        ASSERT(one.e() >= -60);
        ASSERT(fractionals < one.f());
        ASSERT(UINT64_2PART_C(0xFFFFFFFF, FFFFFFFF) / 10 >= one.f());
        while (requested_digits > 0 && fractionals > w_error) {
            fractionals *= 10;
            w_error *= 10;
            // Integer division by one.
            int digit = static_cast<int>(fractionals >> -one.e());
            buffer[*length] = '0' + digit;
            (*length)++;
            requested_digits--;
            fractionals &= one.f() - 1;  // Modulo by one.
            (*kappa)--;
        }
        if (requested_digits != 0) return false;
        return RoundWeedCounted(buffer, *length, fractionals, one.f(), w_error,
                                kappa);
    }
    
    
    // Provides a decimal representation of v.
    // Returns true if it succeeds, otherwise the result cannot be trusted.
    // There will be *length digits inside the buffer (not null-terminated).
    // If the function returns true then
    //        v == (double) (buffer * 10^decimal_exponent).
    // The digits in the buffer are the shortest representation possible: no
    // 0.09999999999999999 instead of 0.1. The shorter representation will even be
    // chosen even if the longer one would be closer to v.
    // The last digit will be closest to the actual v. That is, even if several
    // digits might correctly yield 'v' when read again, the closest will be
    // computed.
    static bool Grisu3(double v,
                       Vector<char> buffer,
                       int* length,
                       int* decimal_exponent) {
        DiyFp w = Double(v).AsNormalizedDiyFp();
        // boundary_minus and boundary_plus are the boundaries between v and its
        // closest floating-point neighbors. Any number strictly between
        // boundary_minus and boundary_plus will round to v when convert to a double.
        // Grisu3 will never output representations that lie exactly on a boundary.
        DiyFp boundary_minus, boundary_plus;
        Double(v).NormalizedBoundaries(&boundary_minus, &boundary_plus);
        ASSERT(boundary_plus.e() == w.e());
        DiyFp ten_mk;  // Cached power of ten: 10^-k
        int mk;        // -k
        int ten_mk_minimal_binary_exponent =
        kMinimalTargetExponent - (w.e() + DiyFp::kSignificandSize);
        int ten_mk_maximal_binary_exponent =
        kMaximalTargetExponent - (w.e() + DiyFp::kSignificandSize);
        PowersOfTenCache::GetCachedPowerForBinaryExponentRange(
                                                               ten_mk_minimal_binary_exponent,
                                                               ten_mk_maximal_binary_exponent,
                                                               &ten_mk, &mk);
        ASSERT((kMinimalTargetExponent <= w.e() + ten_mk.e() +
                DiyFp::kSignificandSize) &&
               (kMaximalTargetExponent >= w.e() + ten_mk.e() +
                DiyFp::kSignificandSize));
        // Note that ten_mk is only an approximation of 10^-k. A DiyFp only contains a
        // 64 bit significand and ten_mk is thus only precise up to 64 bits.
        
        // The DiyFp::Times procedure rounds its result, and ten_mk is approximated
        // too. The variable scaled_w (as well as scaled_boundary_minus/plus) are now
        // off by a small amount.
        // In fact: scaled_w - w*10^k < 1ulp (unit in the last place) of scaled_w.
        // In other words: let f = scaled_w.f() and e = scaled_w.e(), then
        //           (f-1) * 2^e < w*10^k < (f+1) * 2^e
        DiyFp scaled_w = DiyFp::Times(w, ten_mk);
        ASSERT(scaled_w.e() ==
               boundary_plus.e() + ten_mk.e() + DiyFp::kSignificandSize);
        // In theory it would be possible to avoid some recomputations by computing
        // the difference between w and boundary_minus/plus (a power of 2) and to
        // compute scaled_boundary_minus/plus by subtracting/adding from
        // scaled_w. However the code becomes much less readable and the speed
        // enhancements are not terriffic.
        DiyFp scaled_boundary_minus = DiyFp::Times(boundary_minus, ten_mk);
        DiyFp scaled_boundary_plus  = DiyFp::Times(boundary_plus,  ten_mk);
        
        // DigitGen will generate the digits of scaled_w. Therefore we have
        // v == (double) (scaled_w * 10^-mk).
        // Set decimal_exponent == -mk and pass it to DigitGen. If scaled_w is not an
        // integer than it will be updated. For instance if scaled_w == 1.23 then
        // the buffer will be filled with "123" und the decimal_exponent will be
        // decreased by 2.
        int kappa;
        bool result = DigitGen(scaled_boundary_minus, scaled_w, scaled_boundary_plus,
                               buffer, length, &kappa);
        *decimal_exponent = -mk + kappa;
        return result;
    }
    
    
    // The "counted" version of grisu3 (see above) only generates requested_digits
    // number of digits. This version does not generate the shortest representation,
    // and with enough requested digits 0.1 will at some point print as 0.9999999...
    // Grisu3 is too imprecise for real halfway cases (1.5 will not work) and
    // therefore the rounding strategy for halfway cases is irrelevant.
    static bool Grisu3Counted(double v,
                              int requested_digits,
                              Vector<char> buffer,
                              int* length,
                              int* decimal_exponent) {
        DiyFp w = Double(v).AsNormalizedDiyFp();
        DiyFp ten_mk;  // Cached power of ten: 10^-k
        int mk;        // -k
        int ten_mk_minimal_binary_exponent =
        kMinimalTargetExponent - (w.e() + DiyFp::kSignificandSize);
        int ten_mk_maximal_binary_exponent =
        kMaximalTargetExponent - (w.e() + DiyFp::kSignificandSize);
        PowersOfTenCache::GetCachedPowerForBinaryExponentRange(
                                                               ten_mk_minimal_binary_exponent,
                                                               ten_mk_maximal_binary_exponent,
                                                               &ten_mk, &mk);
        ASSERT((kMinimalTargetExponent <= w.e() + ten_mk.e() +
                DiyFp::kSignificandSize) &&
               (kMaximalTargetExponent >= w.e() + ten_mk.e() +
                DiyFp::kSignificandSize));
        // Note that ten_mk is only an approximation of 10^-k. A DiyFp only contains a
        // 64 bit significand and ten_mk is thus only precise up to 64 bits.
        
        // The DiyFp::Times procedure rounds its result, and ten_mk is approximated
        // too. The variable scaled_w (as well as scaled_boundary_minus/plus) are now
        // off by a small amount.
        // In fact: scaled_w - w*10^k < 1ulp (unit in the last place) of scaled_w.
        // In other words: let f = scaled_w.f() and e = scaled_w.e(), then
        //           (f-1) * 2^e < w*10^k < (f+1) * 2^e
        DiyFp scaled_w = DiyFp::Times(w, ten_mk);
        
        // We now have (double) (scaled_w * 10^-mk).
        // DigitGen will generate the first requested_digits digits of scaled_w and
        // return together with a kappa such that scaled_w ~= buffer * 10^kappa. (It
        // will not always be exactly the same since DigitGenCounted only produces a
        // limited number of digits.)
        int kappa;
        bool result = DigitGenCounted(scaled_w, requested_digits,
                                      buffer, length, &kappa);
        *decimal_exponent = -mk + kappa;
        return result;
    }
    
    
    bool FastDtoa(double v,
                  FastDtoaMode mode,
                  int requested_digits,
                  Vector<char> buffer,
                  int* length,
                  int* decimal_point) {
        ASSERT(v > 0);
        ASSERT(!Double(v).IsSpecial());
        
        bool result = false;
        int decimal_exponent = 0;
        switch (mode) {
            case FAST_DTOA_SHORTEST:
                result = Grisu3(v, buffer, length, &decimal_exponent);
                break;
            case FAST_DTOA_PRECISION:
                result = Grisu3Counted(v, requested_digits,
                                       buffer, length, &decimal_exponent);
                break;
            default:
                UNREACHABLE();
        }
        if (result) {
            *decimal_point = *length + decimal_exponent;
            buffer[*length] = '\0';
        }
        return result;
    }
    
}  // namespace double_conversion

} // namespace WTF
