40 significand = significand << 1;
41 exponent = exponent - 1;
54 bool lower_boundary_is_closer,
56 bool need_boundary_deltas,
68 Bignum* numerator, Bignum* denominator,
69 Bignum* delta_minus, Bignum* delta_plus);
73 Bignum* delta_minus, Bignum* delta_plus,
77static void BignumToFixed(
int requested_digits,
int* decimal_point,
78 Bignum* numerator, Bignum* denominator,
85 Bignum* numerator, Bignum* denominator,
95 bool lower_boundary_is_closer;
97 float f =
static_cast<float>(v);
107 bool need_boundary_deltas =
110 bool is_even = (significand & 1) == 0;
125 *decimal_point = -requested_digits;
139 estimated_power, need_boundary_deltas,
140 &numerator, &denominator,
141 &delta_minus, &delta_plus);
144 &numerator, &denominator,
145 &delta_minus, &delta_plus);
152 &delta_minus, &delta_plus,
157 &numerator, &denominator,
162 &numerator, &denominator,
192 delta_plus = delta_minus;
201 buffer[(*length)++] =
static_cast<char>(digit +
'0');
208 bool in_delta_room_minus;
209 bool in_delta_room_plus;
213 in_delta_room_minus =
Bignum::Less(*numerator, *delta_minus);
222 if (!in_delta_room_minus && !in_delta_room_plus) {
229 if (delta_minus != delta_plus) {
232 }
else if (in_delta_room_minus && in_delta_room_plus) {
260 }
else if (in_delta_room_minus) {
287 for (
int i = 0; i <
count - 1; ++i) {
293 buffer[i] =
static_cast<char>(digit +
'0');
304 buffer[
count - 1] =
static_cast<char>(digit +
'0');
307 for (
int i =
count - 1; i > 0; --i) {
308 if (
buffer[i] !=
'0' + 10)
break;
312 if (
buffer[0] ==
'0' + 10) {
332 if (-(*decimal_point) > requested_digits) {
338 *decimal_point = -requested_digits;
341 }
else if (-(*decimal_point) == requested_digits) {
362 int needed_digits = (*decimal_point) + requested_digits;
364 numerator, denominator,
407 const double k1Log10 = 0.30102999566398114;
411 double estimate = ceil((exponent + kSignificandSize - 1) * k1Log10 - 1e-10);
412 return static_cast<int>(estimate);
418 uint64_t significand,
int exponent,
419 int estimated_power,
bool need_boundary_deltas,
433 if (need_boundary_deltas) {
451 uint64_t significand,
int exponent,
452 int estimated_power,
bool need_boundary_deltas,
467 if (need_boundary_deltas) {
485 uint64_t significand,
int exponent,
486 int estimated_power,
bool need_boundary_deltas,
493 Bignum* power_ten = numerator;
496 if (need_boundary_deltas) {
516 if (need_boundary_deltas) {
570 bool lower_boundary_is_closer,
572 bool need_boundary_deltas,
579 significand, exponent, estimated_power, need_boundary_deltas,
580 numerator, denominator, delta_minus, delta_plus);
581 }
else if (estimated_power >= 0) {
583 significand, exponent, estimated_power, need_boundary_deltas,
584 numerator, denominator, delta_minus, delta_plus);
587 significand, exponent, estimated_power, need_boundary_deltas,
588 numerator, denominator, delta_minus, delta_plus);
591 if (need_boundary_deltas && lower_boundary_is_closer) {
627 *decimal_point = estimated_power + 1;
629 *decimal_point = estimated_power;
static bool compare(const SkBitmap &ref, const SkIRect &iref, const SkBitmap &test, const SkIRect &itest)
static int is_even(int x)
static const int kMaxSignificantBits
void AssignBignum(const Bignum &other)
void ShiftLeft(const int shift_amount)
static bool Equal(const Bignum &a, const Bignum &b)
void AssignUInt64(uint64_t value)
uint16_t DivideModuloIntBignum(const Bignum &other)
static bool LessEqual(const Bignum &a, const Bignum &b)
static bool Less(const Bignum &a, const Bignum &b)
void AssignPowerUInt16(uint16_t base, const int exponent)
void AssignUInt16(const uint16_t value)
void MultiplyByUInt64(const uint64_t factor)
static int PlusCompare(const Bignum &a, const Bignum &b, const Bignum &c)
bool LowerBoundaryIsCloser() const
uint64_t Significand() const
static const uint64_t kHiddenBit
static const int kSignificandSize
uint32_t Significand() const
bool LowerBoundaryIsCloser() const
static const uint8_t buffer[]
void BignumDtoa(double v, BignumDtoaMode mode, int requested_digits, Vector< char > buffer, int *length, int *decimal_point)
static void InitialScaledStartValuesNegativeExponentPositivePower(uint64_t significand, int exponent, int estimated_power, bool need_boundary_deltas, Bignum *numerator, Bignum *denominator, Bignum *delta_minus, Bignum *delta_plus)
@ BIGNUM_DTOA_SHORTEST_SINGLE
static int EstimatePower(int exponent)
static void GenerateShortestDigits(Bignum *numerator, Bignum *denominator, Bignum *delta_minus, Bignum *delta_plus, bool is_even, Vector< char > buffer, int *length)
static void BignumToFixed(int requested_digits, int *decimal_point, Bignum *numerator, Bignum *denominator, Vector< char > buffer, int *length)
static void InitialScaledStartValues(uint64_t significand, int exponent, bool lower_boundary_is_closer, int estimated_power, bool need_boundary_deltas, Bignum *numerator, Bignum *denominator, Bignum *delta_minus, Bignum *delta_plus)
static void InitialScaledStartValuesPositiveExponent(uint64_t significand, int exponent, int estimated_power, bool need_boundary_deltas, Bignum *numerator, Bignum *denominator, Bignum *delta_minus, Bignum *delta_plus)
static void FixupMultiply10(int estimated_power, bool is_even, int *decimal_point, Bignum *numerator, Bignum *denominator, Bignum *delta_minus, Bignum *delta_plus)
static int NormalizedExponent(uint64_t significand, int exponent)
static void GenerateCountedDigits(int count, int *decimal_point, Bignum *numerator, Bignum *denominator, Vector< char > buffer, int *length)
static void InitialScaledStartValuesNegativeExponentNegativePower(uint64_t significand, int exponent, int estimated_power, bool need_boundary_deltas, Bignum *numerator, Bignum *denominator, Bignum *delta_minus, Bignum *delta_plus)
#define DOUBLE_CONVERSION_ASSERT(condition)
#define DOUBLE_CONVERSION_UNREACHABLE()