19 significand = significand << 1;
20 exponent = exponent - 1;
31 bool need_boundary_deltas,
32 Bignum* numerator, Bignum* denominator,
33 Bignum* delta_minus, Bignum* delta_plus);
40 int* decimal_point, Bignum* numerator,
41 Bignum* denominator, Bignum* delta_minus,
46 Bignum* delta_minus, Bignum* delta_plus,
47 bool is_even, Vector<char> buffer,
50static void BignumToFixed(
int requested_digits,
int* decimal_point,
51 Bignum* numerator, Bignum* denominator,
52 Vector<char>(buffer),
int* length);
58 Bignum* numerator, Bignum* denominator,
59 Vector<char>(buffer),
int* length);
66 bool is_even = (significand & 1) == 0;
82 *decimal_point = -requested_digits;
97 &denominator, &delta_minus, &delta_plus);
100 &denominator, &delta_minus, &delta_plus);
106 &delta_plus, is_even, buffer, length);
109 BignumToFixed(requested_digits, decimal_point, &numerator, &denominator,
114 &denominator, buffer, length);
142 delta_plus = delta_minus;
151 buffer[(*length)++] = digit +
'0';
158 bool in_delta_room_minus;
159 bool in_delta_room_plus;
163 in_delta_room_minus =
Bignum::Less(*numerator, *delta_minus);
172 if (!in_delta_room_minus && !in_delta_room_plus) {
179 if (delta_minus != delta_plus) {
182 }
else if (in_delta_room_minus && in_delta_room_plus) {
195 buffer[(*length) - 1]++;
202 if ((buffer[(*length) - 1] -
'0') % 2 == 0) {
206 buffer[(*length) - 1]++;
210 }
else if (in_delta_room_minus) {
220 buffer[(*length) - 1]++;
236 for (
int i = 0;
i < count - 1; ++
i) {
242 buffer[
i] = digit +
'0';
252 buffer[count - 1] = digit +
'0';
255 for (
int i = count - 1;
i > 0; --
i) {
256 if (buffer[
i] !=
'0' + 10)
break;
260 if (buffer[0] ==
'0' + 10) {
279 if (-(*decimal_point) > requested_digits) {
285 *decimal_point = -requested_digits;
288 }
else if (-(*decimal_point) == requested_digits) {
291 DCHECK(*decimal_point == -requested_digits);
309 int needed_digits = (*decimal_point) + requested_digits;
352 const double k1Log10 = 0.30102999566398114;
355 const int kSignificandSize = 53;
357 std::ceil((exponent + kSignificandSize - 1) * k1Log10 - 1e-10);
358 return static_cast<int>(estimate);
363 double v,
int estimated_power,
bool need_boundary_deltas,
Bignum* numerator,
376 if (need_boundary_deltas) {
407 double v,
int estimated_power,
bool need_boundary_deltas,
Bignum* numerator,
423 if (need_boundary_deltas) {
455 double v,
int estimated_power,
bool need_boundary_deltas,
Bignum* numerator,
457 const uint64_t kMinimalNormalizedExponent = 0x0010'0000'0000'0000;
464 Bignum* power_ten = numerator;
467 if (need_boundary_deltas) {
480 DCHECK(numerator == power_ten);
487 if (need_boundary_deltas) {
548 bool need_boundary_deltas,
551 if (
Double(v).Exponent() >= 0) {
553 v, estimated_power, need_boundary_deltas, numerator, denominator,
554 delta_minus, delta_plus);
555 }
else if (estimated_power >= 0) {
557 v, estimated_power, need_boundary_deltas, numerator, denominator,
558 delta_minus, delta_plus);
561 v, estimated_power, need_boundary_deltas, numerator, denominator,
562 delta_minus, delta_plus);
578 int* decimal_point,
Bignum* numerator,
592 *decimal_point = estimated_power + 1;
594 *decimal_point = estimated_power;
void AssignUInt16(uint16_t value)
static bool LessEqual(const Bignum &a, const Bignum &b)
uint16_t DivideModuloIntBignum(const Bignum &other)
void MultiplyByUInt64(uint64_t factor)
void AssignUInt64(uint64_t value)
static bool Equal(const Bignum &a, const Bignum &b)
static const int kMaxSignificantBits
void AssignBignum(const Bignum &other)
void ShiftLeft(int shift_amount)
static bool Less(const Bignum &a, const Bignum &b)
void AssignPowerUInt16(uint16_t base, int exponent)
static int PlusCompare(const Bignum &a, const Bignum &b, const Bignum &c)
constexpr uint64_t AsUint64() const
static constexpr uint64_t kSignificandMask
static constexpr uint64_t kExponentMask
static constexpr uint64_t kHiddenBit
constexpr int Exponent() const
constexpr uint64_t Significand() const
static void InitialScaledStartValuesPositiveExponent(double v, int estimated_power, bool need_boundary_deltas, Bignum *numerator, Bignum *denominator, Bignum *delta_minus, Bignum *delta_plus)
static void BignumToFixed(int requested_digits, int *decimal_point, Bignum *numerator, Bignum *denominator, Vector< char >(buffer), int *length)
static void GenerateShortestDigits(Bignum *numerator, Bignum *denominator, Bignum *delta_minus, Bignum *delta_plus, bool is_even, Vector< char > buffer, int *length)
void BignumDtoa(double v, BignumDtoaMode mode, int requested_digits, Vector< char > buffer, int *length, int *decimal_point)
static int NormalizedExponent(uint64_t significand, int exponent)
static int EstimatePower(int exponent)
static void GenerateCountedDigits(int count, int *decimal_point, Bignum *numerator, Bignum *denominator, Vector< char >(buffer), int *length)
static void InitialScaledStartValuesNegativeExponentNegativePower(double v, int estimated_power, bool need_boundary_deltas, Bignum *numerator, Bignum *denominator, Bignum *delta_minus, Bignum *delta_plus)
static void InitialScaledStartValues(double v, int estimated_power, bool need_boundary_deltas, Bignum *numerator, Bignum *denominator, Bignum *delta_minus, Bignum *delta_plus)
static void InitialScaledStartValuesNegativeExponentPositivePower(double v, 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)
#define DCHECK_LE(v1, v2)
#define DCHECK_NE(v1, v2)
#define DCHECK_GE(v1, v2)
#define DCHECK(condition)
#define DCHECK_GT(v1, v2)