205 int* length,
int* decimal_point) {
206 DCHECK(-128 <= exponent && exponent <= 0);
210 if (-exponent <= 64) {
213 int point = -exponent;
214 for (
int i = 0;
i < fractional_count; ++
i) {
215 if (fractionals == 0)
break;
228 int digit =
static_cast<int>(fractionals >> point);
229 buffer[*
length] =
'0' + digit;
231 fractionals -=
static_cast<uint64_t
>(digit) << point;
234 if (point > 0 && ((fractionals >> (point - 1)) & 1) == 1) {
238 DCHECK(64 < -exponent && -exponent <= 128);
240 fractionals128.
Shift(-exponent - 64);
242 for (
int i = 0;
i < fractional_count; ++
i) {
243 if (fractionals128.
IsZero())
break;
250 buffer[*
length] =
'0' + digit;
253 if (fractionals128.
BitAt(point - 1) == 1) {
262 while (*length > 0 && buffer[(*length) - 1] ==
'0') {
265 int first_non_zero = 0;
266 while (first_non_zero < *length && buffer[first_non_zero] ==
'0') {
269 if (first_non_zero != 0) {
270 for (
int i = first_non_zero;
i < *
length; ++
i) {
271 buffer[
i - first_non_zero] = buffer[
i];
273 *length -= first_non_zero;
274 *decimal_point -= first_non_zero;
279 int* length,
int* decimal_point) {
280 const uint32_t kMaxUInt32 = 0xFFFFFFFF;
288 if (exponent > 20)
return false;
289 if (fractional_count > 20)
return false;
303 const uint64_t kFive17 = 0xB1'A2BC'2EC5;
304 uint64_t divisor = kFive17;
305 int divisor_power = 17;
306 uint64_t dividend = significand;
318 if (exponent > divisor_power) {
320 dividend <<= exponent - divisor_power;
321 quotient =
static_cast<uint32_t
>(dividend / divisor);
322 remainder = (dividend % divisor) << divisor_power;
324 divisor <<= divisor_power - exponent;
325 quotient =
static_cast<uint32_t
>(dividend / divisor);
326 remainder = (dividend % divisor) << exponent;
331 }
else if (exponent >= 0) {
333 significand <<= exponent;
338 uint64_t integrals = significand >> -exponent;
339 uint64_t fractionals = significand - (integrals << -exponent);
340 if (integrals > kMaxUInt32) {
343 FillDigits32(
static_cast<uint32_t
>(integrals), buffer, length);
346 FillFractionals(fractionals, exponent, fractional_count, buffer, length,
348 }
else if (exponent < -128) {
354 *decimal_point = -fractional_count;
357 FillFractionals(significand, exponent, fractional_count, buffer, length,
360 TrimZeros(buffer, length, decimal_point);
362 if ((*length) == 0) {
365 *decimal_point = -fractional_count;
static void FillFractionals(uint64_t fractionals, int exponent, int fractional_count, Vector< char > buffer, int *length, int *decimal_point)