| Index: src/grisu3.cc
|
| ===================================================================
|
| --- src/grisu3.cc (revision 4092)
|
| +++ src/grisu3.cc (working copy)
|
| @@ -74,8 +74,10 @@
|
|
|
|
|
| template<int alpha, int gamma>
|
| -bool Grisu3<alpha, gamma>::grisu3(
|
| - double v, char* buffer, int* length, int* decimal_exponent) {
|
| +bool Grisu3<alpha, gamma>::grisu3(double v,
|
| + char* buffer,
|
| + int* length,
|
| + int* decimal_exponent) {
|
| DiyFp w = Double(v).AsNormalizedDiyFp();
|
| // boundary_minus and boundary_plus are the boundaries between v and its
|
| // neighbors. Any number strictly between boundary_minus and boundary_plus
|
| @@ -147,8 +149,12 @@
|
| // numbers. If the precision is not enough to guarantee all the postconditions
|
| // then false is returned. This usually happens rarely (~0.5%).
|
| template<int alpha, int gamma>
|
| -bool Grisu3<alpha, gamma>::DigitGen(
|
| - DiyFp low, DiyFp w, DiyFp high, char* buffer, int* len, int* kappa) {
|
| +bool Grisu3<alpha, gamma>::DigitGen(DiyFp low,
|
| + DiyFp w,
|
| + DiyFp high,
|
| + char* buffer,
|
| + int* len,
|
| + int* kappa) {
|
| ASSERT(low.e() == w.e() && w.e() == high.e());
|
| ASSERT(low.f() + 1 <= high.f() - 1);
|
| ASSERT(alpha <= w.e() && w.e() <= gamma);
|
| @@ -177,8 +183,10 @@
|
| // 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.
|
| -static void BiggestPowerTen(uint32_t number, int number_bits,
|
| - uint32_t* power, int* exponent) {
|
| +static void BiggestPowerTen(uint32_t number,
|
| + int number_bits,
|
| + uint32_t* power,
|
| + int* exponent) {
|
| switch (number_bits) {
|
| case 32:
|
| case 31:
|
| @@ -294,8 +302,12 @@
|
| // represents w. However we have to pay attention to low, high and w's
|
| // imprecision.
|
| template<int alpha, int gamma>
|
| -bool Grisu3<alpha, gamma>::DigitGen_m60_m32(
|
| - DiyFp low, DiyFp w, DiyFp high, char* buffer, int* length, int* kappa) {
|
| +bool Grisu3<alpha, gamma>::DigitGen_m60_m32(DiyFp low,
|
| + DiyFp w,
|
| + DiyFp high,
|
| + char* buffer,
|
| + int* length,
|
| + int* kappa) {
|
| // 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
|
| @@ -321,8 +333,10 @@
|
| // 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());
|
| - uint32_t integrals = too_high.f() >> -one.e(); // Division by one.
|
| - uint64_t fractionals = too_high.f() & (one.f() - 1); // Modulo by one.
|
| + // 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 divider;
|
| int divider_exponent;
|
| BiggestPowerTen(integrals, DiyFp::kSignificandSize - (-one.e()),
|
| @@ -332,7 +346,7 @@
|
| // Loop invariant: buffer = too_high / 10^kappa (integer division)
|
| // The invariant holds for the first iteration: kappa has been initialized
|
| // with the divider exponent + 1. And the divider is the biggest power of ten
|
| - // that fits into the bits that had been reserved for the integrals.
|
| + // that is smaller than integrals.
|
| while (*kappa > 0) {
|
| int digit = integrals / divider;
|
| buffer[*length] = '0' + digit;
|
| @@ -376,7 +390,8 @@
|
| unsafe_interval.set_e(unsafe_interval.e() + 1); // Will be optimized out.
|
| one.set_f(one.f() >> 1);
|
| one.set_e(one.e() + 1);
|
| - int digit = fractionals >> -one.e(); // Integer division by one.
|
| + // Integer division by one.
|
| + int digit = static_cast<int>(fractionals >> -one.e());
|
| buffer[*length] = '0' + digit;
|
| (*length)++;
|
| fractionals &= one.f() - 1; // Modulo by one.
|
| @@ -402,10 +417,13 @@
|
| // Output: returns true on success.
|
| // Modifies the generated digits in the buffer to approach (round towards) w.
|
| template<int alpha, int gamma>
|
| -bool Grisu3<alpha, gamma>::RoundWeed(
|
| - char* buffer, int length, uint64_t distance_too_high_w,
|
| - uint64_t unsafe_interval, uint64_t rest, uint64_t ten_kappa,
|
| - uint64_t unit) {
|
| +bool Grisu3<alpha, gamma>::RoundWeed(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- = too_high - big_distance, and
|
| @@ -456,8 +474,7 @@
|
| }
|
|
|
|
|
| -bool grisu3(double v,
|
| - char* buffer, int* sign, int* length, int* decimal_point) {
|
| +bool grisu3(double v, char* buffer, int* sign, int* length, int* point) {
|
| ASSERT(v != 0);
|
| ASSERT(!Double(v).IsSpecial());
|
|
|
| @@ -469,7 +486,7 @@
|
| }
|
| int decimal_exponent;
|
| bool result = Grisu3<-60, -32>::grisu3(v, buffer, length, &decimal_exponent);
|
| - *decimal_point = *length + decimal_exponent;
|
| + *point = *length + decimal_exponent;
|
| buffer[*length] = '\0';
|
| return result;
|
| }
|
|
|