22 namespace strings_internal {
35 constexpr
int kLargePowerOfFiveStep = 27;
40 constexpr
int kLargestPowerOfFiveIndex = 20;
48 const uint32_t kLargePowersOfFive[] = {
50 0xfa10079dU, 0x6765c793U,
52 0x97d9f649U, 0x6664242dU, 0x29939b14U, 0x29c30f10U,
54 0xc4f809c5U, 0x7bf3f22aU, 0x67bdae34U, 0xad340517U, 0x369d1b5fU, 0x10de1593U,
56 0x92b260d1U, 0x9efff7c7U, 0x81de0ec6U, 0xaeba5d56U, 0x410664a4U, 0x4f40737aU,
57 0x20d3846fU, 0x06d00f73U,
59 0xff1b172dU, 0x13a1d71cU, 0xefa07617U, 0x7f682d3dU, 0xff8c90c0U, 0x3f0131e7U,
60 0x3fdcb9feU, 0x917b0177U, 0x16c407a7U, 0x02c06b9dU,
62 0x960f7199U, 0x056667ecU, 0xe07aefd8U, 0x80f2b9ccU, 0x8273f5e3U, 0xeb9a214aU,
63 0x40b38005U, 0x0e477ad4U, 0x277d08e6U, 0xfa28b11eU, 0xd3f7d784U, 0x011c835bU,
65 0xf723d9d5U, 0x3282d3f3U, 0xe00857d1U, 0x69659d25U, 0x2cf117cfU, 0x24da6d07U,
66 0x954d1417U, 0x3e5d8cedU, 0x7a8bb766U, 0xfd785ae6U, 0x645436d2U, 0x40c78b34U,
67 0x94151217U, 0x0072e9f7U,
69 0x2b416aa1U, 0x7893c5a7U, 0xe37dc6d4U, 0x2bad2beaU, 0xf0fc846cU, 0x7575ae4bU,
70 0x62587b14U, 0x83b67a34U, 0x02110cdbU, 0xf7992f55U, 0x00deb022U, 0xa4a23becU,
71 0x8af5c5cdU, 0xb85b654fU, 0x818df38bU, 0x002e69d2U,
73 0x3518cbbdU, 0x20b0c15fU, 0x38756c2fU, 0xfb5dc3ddU, 0x22ad2d94U, 0xbf35a952U,
74 0xa699192aU, 0x9a613326U, 0xad2a9cedU, 0xd7f48968U, 0xe87dfb54U, 0xc8f05db6U,
75 0x5ef67531U, 0x31c1ab49U, 0xe202ac9fU, 0x9b2957b5U, 0xa143f6d3U, 0x0012bf07U,
77 0x8b971de9U, 0x21aba2e1U, 0x63944362U, 0x57172336U, 0xd9544225U, 0xfb534166U,
78 0x08c563eeU, 0x14640ee2U, 0x24e40d31U, 0x02b06537U, 0x03887f14U, 0x0285e533U,
79 0xb744ef26U, 0x8be3a6c4U, 0x266979b4U, 0x6761ece2U, 0xd9cb39e4U, 0xe67de319U,
80 0x0d39e796U, 0x00079250U,
82 0x260eb6e5U, 0xf414a796U, 0xee1a7491U, 0xdb9368ebU, 0xf50c105bU, 0x59157750U,
83 0x9ed2fb5cU, 0xf6e56d8bU, 0xeaee8d23U, 0x0f319f75U, 0x2aa134d6U, 0xac2908e9U,
84 0xd4413298U, 0x02f02a55U, 0x989d5a7aU, 0x70dde184U, 0xba8040a7U, 0x03200981U,
85 0xbe03b11cU, 0x3c1c2a18U, 0xd60427a1U, 0x00030ee0U,
87 0xce566d71U, 0xf1c4aa25U, 0x4e93ca53U, 0xa72283d0U, 0x551a73eaU, 0x3d0538e2U,
88 0x8da4303fU, 0x6a58de60U, 0x0e660221U, 0x49cf61a6U, 0x8d058fc1U, 0xb9d1a14cU,
89 0x4bab157dU, 0xc85c6932U, 0x518c8b9eU, 0x9b92b8d0U, 0x0d8a0e21U, 0xbd855df9U,
90 0xb3ea59a1U, 0x8da29289U, 0x4584d506U, 0x3752d80fU, 0xb72569c6U, 0x00013c33U,
92 0x190f354dU, 0x83695cfeU, 0xe5a4d0c7U, 0xb60fb7e8U, 0xee5bbcc4U, 0xb922054cU,
93 0xbb4f0d85U, 0x48394028U, 0x1d8957dbU, 0x0d7edb14U, 0x4ecc7587U, 0x505e9e02U,
94 0x4c87f36bU, 0x99e66bd6U, 0x44b9ed35U, 0x753037d4U, 0xe5fe5f27U, 0x2742c203U,
95 0x13b2ed2bU, 0xdc525d2cU, 0xe6fde59aU, 0x77ffb18fU, 0x13c5752cU, 0x08a84bccU,
96 0x859a4940U, 0x00007fb6U,
98 0x4f98cb39U, 0xa60edbbcU, 0x83b5872eU, 0xa501acffU, 0x9cc76f78U, 0xbadd4c73U,
99 0x43e989faU, 0xca7acf80U, 0x2e0c824fU, 0xb19f4ffcU, 0x092fd81cU, 0xe4eb645bU,
100 0xa1ff84c2U, 0x8a5a83baU, 0xa8a1fae9U, 0x1db43609U, 0xb0fed50bU, 0x0dd7d2bdU,
101 0x7d7accd8U, 0x91fa640fU, 0x37dcc6c5U, 0x1c417fd5U, 0xe4d462adU, 0xe8a43399U,
102 0x131bf9a5U, 0x8df54d29U, 0x36547dc1U, 0x00003395U,
104 0x5bd330f5U, 0x77d21967U, 0x1ac481b7U, 0x6be2f7ceU, 0x7f4792a9U, 0xe84c2c52U,
105 0x84592228U, 0x9dcaf829U, 0xdab44ce1U, 0x3d0c311bU, 0x532e297dU, 0x4704e8b4U,
106 0x9cdc32beU, 0x41e64d9dU, 0x7717bea1U, 0xa824c00dU, 0x08f50b27U, 0x0f198d77U,
107 0x49bbfdf0U, 0x025c6c69U, 0xd4e55cd3U, 0xf083602bU, 0xb9f0fecdU, 0xc0864aeaU,
108 0x9cb98681U, 0xaaf620e9U, 0xacb6df30U, 0x4faafe66U, 0x8af13c3bU, 0x000014d5U,
110 0x682bb941U, 0x89a9f297U, 0xcba75d7bU, 0x404217b1U, 0xb4e519e9U, 0xa1bc162bU,
111 0xf7f5910aU, 0x98715af5U, 0x2ff53e57U, 0xe3ef118cU, 0x490c4543U, 0xbc9b1734U,
112 0x2affbe4dU, 0x4cedcb4cU, 0xfb14e99eU, 0x35e34212U, 0xece39c24U, 0x07673ab3U,
113 0xe73115ddU, 0xd15d38e7U, 0x093eed3bU, 0xf8e7eac5U, 0x78a8cc80U, 0x25227aacU,
114 0x3f590551U, 0x413da1cbU, 0xdf643a55U, 0xab65ad44U, 0xd70b23d7U, 0xc672cd76U,
115 0x3364ea62U, 0x0000086aU,
117 0x22f163ddU, 0x23cf07acU, 0xbe2af6c2U, 0xf412f6f6U, 0xc3ff541eU, 0x6eeaf7deU,
118 0xa47047e0U, 0x408cda92U, 0x0f0eeb08U, 0x56deba9dU, 0xcfc6b090U, 0x8bbbdf04U,
119 0x3933cdb3U, 0x9e7bb67dU, 0x9f297035U, 0x38946244U, 0xee1d37bbU, 0xde898174U,
120 0x63f3559dU, 0x705b72fbU, 0x138d27d9U, 0xf8603a78U, 0x735eec44U, 0xe30987d5U,
121 0xc6d38070U, 0x9cfe548eU, 0x9ff01422U, 0x7c564aa8U, 0x91cc60baU, 0xcbc3565dU,
122 0x7550a50bU, 0x6909aeadU, 0x13234c45U, 0x00000366U,
124 0x17954989U, 0x3a7d7709U, 0x98042de5U, 0xa9011443U, 0x45e723c2U, 0x269ffd6fU,
125 0x58852a46U, 0xaaa1042aU, 0x2eee8153U, 0xb2b6c39eU, 0xaf845b65U, 0xf6c365d7U,
126 0xe4cffb2bU, 0xc840e90cU, 0xabea8abbU, 0x5c58f8d2U, 0x5c19fa3aU, 0x4670910aU,
127 0x4449f21cU, 0xefa645b3U, 0xcc427decU, 0x083c3d73U, 0x467cb413U, 0x6fe10ae4U,
128 0x3caffc72U, 0x9f8da55eU, 0x5e5c8ea7U, 0x490594bbU, 0xf0871b0bU, 0xdd89816cU,
129 0x8e931df8U, 0xe85ce1c9U, 0xcca090a5U, 0x575fa16bU, 0x6b9f106cU, 0x0000015fU,
131 0xee20d805U, 0x57bc3c07U, 0xcdea624eU, 0xd3f0f52dU, 0x9924b4f4U, 0xcf968640U,
132 0x61d41962U, 0xe87fb464U, 0xeaaf51c7U, 0x564c8b60U, 0xccda4028U, 0x529428bbU,
133 0x313a1fa8U, 0x96bd0f94U, 0x7a82ebaaU, 0xad99e7e9U, 0xf2668cd4U, 0xbe33a45eU,
134 0xfd0db669U, 0x87ee369fU, 0xd3ec20edU, 0x9c4d7db7U, 0xdedcf0d8U, 0x7cd2ca64U,
135 0xe25a6577U, 0x61003fd4U, 0xe56f54ccU, 0x10b7c748U, 0x40526e5eU, 0x7300ae87U,
136 0x5c439261U, 0x2c0ff469U, 0xbf723f12U, 0xb2379b61U, 0xbf59b4f5U, 0xc91b1c3fU,
137 0xf0046d27U, 0x0000008dU,
139 0x525c9e11U, 0xf4e0eb41U, 0xebb2895dU, 0x5da512f9U, 0x7d9b29d4U, 0x452f4edcU,
140 0x0b90bc37U, 0x341777cbU, 0x63d269afU, 0x1da77929U, 0x0a5c1826U, 0x77991898U,
141 0x5aeddf86U, 0xf853a877U, 0x538c31ccU, 0xe84896daU, 0xb7a0010bU, 0x17ef4de5U,
142 0xa52a2adeU, 0x029fd81cU, 0x987ce701U, 0x27fefd77U, 0xdb46c66fU, 0x5d301900U,
143 0x496998c0U, 0xbb6598b9U, 0x5eebb607U, 0xe547354aU, 0xdf4a2f7eU, 0xf06c4955U,
144 0x96242ffaU, 0x1775fb27U, 0xbecc58ceU, 0xebf2a53bU, 0x3eaad82aU, 0xf41137baU,
145 0x573e6fbaU, 0xfb4866b8U, 0x54002148U, 0x00000039U,
151 const uint32_t* LargePowerOfFiveData(
int i) {
152 return kLargePowersOfFive + i * (i - 1);
157 int LargePowerOfFiveSize(
int i) {
return 2 *
i; }
161 1, 5, 25, 125, 625, 3125, 15625,
162 78125, 390625, 1953125, 9765625, 48828125, 244140625, 1220703125,
166 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000,
169 template <
int max_words>
171 int significant_digits) {
177 words_[0] = fp.
mantissa & 0xffffffffu;
181 }
else if (words_[0]) {
186 int exponent_adjust =
191 template <
int max_words>
193 int significant_digits) {
194 assert(significant_digits <= Digits10() + 1);
197 bool after_decimal_point =
false;
199 while (begin < end && *begin ==
'0') {
202 int dropped_digits = 0;
205 while (begin < end && *std::prev(end) ==
'0') {
209 if (begin < end && *std::prev(end) ==
'.') {
214 while (begin < end && *std::prev(end) ==
'0') {
218 }
else if (dropped_digits) {
221 const char* dp = std::find(begin, end,
'.');
230 int exponent_adjust = dropped_digits;
233 int digits_queued = 0;
234 for (; begin != end && significant_digits > 0; ++
begin) {
236 after_decimal_point =
true;
239 if (after_decimal_point) {
244 int digit = (*begin -
'0');
245 --significant_digits;
246 if (significant_digits == 0 &&
std::next(begin) != end &&
247 (digit == 0 || digit == 5)) {
257 queued = 10 * queued + digit;
261 AddWithCarry(0, queued);
262 queued = digits_queued = 0;
267 MultiplyBy(kTenToNth[digits_queued]);
268 AddWithCarry(0, queued);
274 if (begin < end && !after_decimal_point) {
280 const char* decimal_point = std::find(begin, end,
'.');
281 exponent_adjust += (decimal_point -
begin);
283 return exponent_adjust;
286 template <
int max_words>
292 bool first_pass =
true;
293 while (n >= kLargePowerOfFiveStep) {
295 std::min(n / kLargePowerOfFiveStep, kLargestPowerOfFiveIndex);
299 LargePowerOfFiveData(big_power),
300 LargePowerOfFiveData(big_power) + LargePowerOfFiveSize(big_power),
302 answer.
size_ = LargePowerOfFiveSize(big_power);
305 answer.
MultiplyBy(LargePowerOfFiveSize(big_power),
306 LargePowerOfFiveData(big_power));
308 n -= kLargePowerOfFiveStep * big_power;
314 template <
int max_words>
316 const uint32_t* other_words,
317 int other_size,
int step) {
318 int this_i = std::min(original_size - 1, step);
319 int other_i = step - this_i;
321 uint64_t this_word = 0;
323 for (; this_i >= 0 && other_i < other_size; --this_i, ++other_i) {
324 uint64_t product = words_[this_i];
325 product *= other_words[other_i];
326 this_word += product;
327 carry += (this_word >> 32);
328 this_word &= 0xffffffff;
330 AddWithCarry(step + 1, carry);
331 words_[
step] = this_word & 0xffffffff;
332 if (this_word > 0 &&
size_ <= step) {
337 template <
int max_words>
342 while (copy.
size() > 0) {
343 int next_digit = copy.
DivMod<10>();
344 result.push_back(
'0' + next_digit);
346 if (result.empty()) {
347 result.push_back(
'0');
349 std::reverse(result.begin(), result.end());
const char * subrange_begin
std::string ToString() const
const uint32_t kTenToNth[10]
CONSTEXPR_F fields step(second_tag, fields f, diff_t n) noexcept
int ReadDigits(const char *begin, const char *end, int significant_digits)
uint32_t words_[max_words]
constexpr int kMaxSmallPowerOfTen
void MultiplyStep(int original_size, const uint32_t *other_words, int other_size, int step)
const char * subrange_end
const uint32_t kFiveToNth[14]
AllocList * next[kMaxLevel]
static BigUnsigned FiveToTheNth(int n)
int ReadFloatMantissa(const ParsedFloat &fp, int significant_digits)
void MultiplyBy(uint32_t v)
void MultiplyByFiveToTheNth(int n)