41static bool RoundWeed(
char* last_digit, uint64_t distance_too_high_w,
42 uint64_t unsafe_interval, uint64_t rest,
43 uint64_t ten_kappa, uint64_t
unit) {
44 uint64_t small_distance = distance_too_high_w -
unit;
45 uint64_t big_distance = distance_too_high_w +
unit;
117 DCHECK(rest <= unsafe_interval);
118 while (rest < small_distance &&
119 unsafe_interval - rest >= ten_kappa &&
120 (rest + ten_kappa < small_distance ||
121 small_distance - rest >= rest + ten_kappa - small_distance)) {
129 if (rest < big_distance && unsafe_interval - rest >= ten_kappa &&
130 (rest + ten_kappa < big_distance ||
131 big_distance - rest > rest + ten_kappa - big_distance)) {
140 return (2 *
unit <= rest) && (rest <= unsafe_interval - 4 *
unit);
156 uint64_t ten_kappa, uint64_t
unit,
int* kappa) {
164 if (
unit >= ten_kappa)
return false;
168 if (ten_kappa -
unit <=
unit)
return false;
170 if ((ten_kappa - rest > rest) && (ten_kappa - 2 * rest >= 2 *
unit)) {
174 if ((rest >
unit) && (ten_kappa - (rest -
unit) <= (rest -
unit))) {
176 buffer[length - 1]++;
177 for (
int i = length - 1;
i > 0; --
i) {
178 if (buffer[
i] !=
'0' + 10)
break;
186 if (buffer[0] ==
'0' + 10) {
196static const uint32_t
kTen5 = 100000;
197static const uint32_t
kTen6 = 1000000;
198static const uint32_t
kTen7 = 10000000;
199static const uint32_t
kTen8 = 100000000;
200static const uint32_t
kTen9 = 1000000000;
236static inline uint32_t
fast_divmod(uint32_t* val, uint32_t divisor,
239 uint32_t digit = *val;
243 uint32_t q = (
static_cast<uint64_t
>(*val) * d.mul) >> 32;
244 uint32_t t = ((*val - q) >> 1) + q;
245 uint32_t digit = t >> d.shift;
246 *val -= digit * divisor;
257 uint32_t* power,
unsigned* exponent) {
258 switch (number_bits) {
262 if (
kTen9 <= number) {
271 if (
kTen8 <= number) {
280 if (
kTen7 <= number) {
290 if (
kTen6 <= number) {
299 if (
kTen5 <= number) {
308 if (
kTen4 <= number) {
318 if (1000 <= number) {
407 DCHECK(low.e() == w.
e() && w.
e() == high.
e());
408 DCHECK(low.f() + 1 <= high.
f() - 1);
436 uint32_t integrals =
static_cast<uint32_t
>(too_high.
f() >> -
one.e());
438 uint64_t fractionals = too_high.
f() & (
one.f() - 1);
440 unsigned divisor_exponent;
443 *kappa = divisor_exponent + 1;
449 uint32_t digit =
fast_divmod(&integrals, divisor,
div[divisor_exponent]);
450 **outptr =
'0' + digit;
456 (
static_cast<uint64_t
>(integrals) << -
one.e()) + fractionals;
459 if (rest < unsafe_interval.
f()) {
463 unsafe_interval.
f(), rest,
464 static_cast<uint64_t
>(divisor) << -
one.e(),
unit);
483 DCHECK(0xFFFF'FFFF'FFFF'FFFF / 10 >=
one.f());
487 unsafe_interval.
set_f(unsafe_interval.
f() * 10);
489 int digit =
static_cast<int>(fractionals >> -
one.e());
490 **outptr =
'0' + digit;
492 fractionals &=
one.f() - 1;
494 if (fractionals < unsafe_interval.
f()) {
496 unsafe_interval.
f(), fractionals,
one.f(),
unit);
530 int* length,
int* kappa) {
536 uint64_t w_error = 1;
543 uint32_t integrals =
static_cast<uint32_t
>(w.
f() >> -
one.e());
545 uint64_t fractionals = w.
f() & (
one.f() - 1);
547 unsigned divisor_exponent;
550 *kappa = divisor_exponent + 1;
558 uint32_t digit =
fast_divmod(&integrals, divisor,
div[divisor_exponent]);
559 buffer[*
length] =
'0' + digit;
565 if (requested_digits == 0)
break;
570 if (requested_digits == 0) {
572 (
static_cast<uint64_t
>(integrals) << -
one.e()) + fractionals;
574 static_cast<uint64_t
>(divisor) << -
one.e(), w_error,
586 DCHECK(0xFFFF'FFFF'FFFF'FFFF / 10 >=
one.f());
587 while (requested_digits > 0 && fractionals > w_error) {
591 int digit =
static_cast<int>(fractionals >> -
one.e());
592 buffer[*
length] =
'0' + digit;
595 fractionals &=
one.f() - 1;
598 if (requested_digits != 0)
return false;
614static bool Grisu3(
double v,
char** outptr,
int* decimal_exponent) {
620 DiyFp boundary_minus, boundary_plus;
625 int ten_mk_minimal_binary_exponent =
627 int ten_mk_maximal_binary_exponent =
630 ten_mk_minimal_binary_exponent, ten_mk_maximal_binary_exponent, &ten_mk,
663 bool result =
DigitGen(scaled_boundary_minus, scaled_w, scaled_boundary_plus,
665 *decimal_exponent = -mk + kappa;
675 int* length,
int* decimal_exponent) {
679 int ten_mk_minimal_binary_exponent =
681 int ten_mk_maximal_binary_exponent =
684 ten_mk_minimal_binary_exponent, ten_mk_maximal_binary_exponent, &ten_mk,
709 *decimal_exponent = -mk + kappa;
719 char* outptr = buffer.
data();
720 int decimal_exponent = 0;
724 *length =
static_cast<int>(outptr - buffer.
data());
727 int local_length = 0;
730 *length = local_length;
737 *decimal_point = *length + decimal_exponent;
static DiyFp Minus(const DiyFp &a, const DiyFp &b)
static const int kSignificandSize
static DiyFp Times(const DiyFp &a, const DiyFp &b)
constexpr uint64_t f() const
constexpr void set_f(uint64_t new_value)
DiyFp AsNormalizedDiyFp() const
void NormalizedBoundaries(DiyFp *out_m_minus, DiyFp *out_m_plus) const
static void GetCachedPowerForBinaryExponentRange(int min_exponent, int max_exponent, DiyFp *power, int *decimal_exponent)
constexpr T * data() const
ZoneVector< RpoNumber > & result
static void BiggestPowerTen(uint32_t number, int number_bits, uint32_t *power, unsigned *exponent)
static bool Grisu3(double v, char **outptr, int *decimal_exponent)
static bool DigitGen(DiyFp low, DiyFp w, DiyFp high, char **outptr, int *kappa)
static const uint32_t kTen8
static const int kMaximalTargetExponent
static bool DigitGenCounted(DiyFp w, int requested_digits, Vector< char > buffer, int *length, int *kappa)
static bool RoundWeed(char *last_digit, uint64_t distance_too_high_w, uint64_t unsafe_interval, uint64_t rest, uint64_t ten_kappa, uint64_t unit)
static bool Grisu3Counted(double v, int requested_digits, Vector< char > buffer, int *length, int *decimal_exponent)
static bool RoundWeedCounted(Vector< char > buffer, int length, uint64_t rest, uint64_t ten_kappa, uint64_t unit, int *kappa)
static const int kMinimalTargetExponent
static const uint32_t kTen7
static const uint32_t kTen6
static const uint32_t kTen5
static uint32_t fast_divmod(uint32_t *val, uint32_t divisor, const DivMagic &d)
static const uint32_t kTen4
bool FastDtoa(double v, FastDtoaMode mode, int requested_digits, Vector< char > buffer, int *length, int *decimal_point)
static const uint32_t kTen9
static const DivMagic div[]
#define DCHECK_LE(v1, v2)
#define DCHECK_GE(v1, v2)
#define DCHECK(condition)
#define DCHECK_GT(v1, v2)