58 1000000000000000000.0,
59 10000000000000000000.0,
60 100000000000000000000.0,
61 1000000000000000000000.0,
63 10000000000000000000000.0
74 for (
int i = 0;
i < buffer.
length();
i++) {
75 if (buffer[
i] !=
'0') {
83 for (
int i = buffer.
length() - 1;
i >= 0; --
i) {
84 if (buffer[
i] !=
'0') {
92 char* significant_buffer,
93 int* significant_exponent) {
95 significant_buffer[
i] = buffer[
i];
103 *significant_exponent =
113 int* number_of_read_digits) {
117 int digit = buffer[
i++] -
'0';
118 DCHECK(0 <= digit && digit <= 9);
121 *number_of_read_digits =
i;
130 int* remaining_decimals) {
132 uint64_t significand =
ReadUint64(buffer, &read_digits);
133 if (buffer.
length() == read_digits) {
135 *remaining_decimals = 0;
138 if (buffer[read_digits] >=
'5') {
144 *remaining_decimals = buffer.
length() - read_digits;
150#if (V8_TARGET_ARCH_IA32 || defined(USE_SIMULATOR)) && !defined(_MSC_VER)
185 int remaining_digits =
187 if ((0 <= exponent) &&
213 return DiyFp(0xA000'0000'0000'0000, -60);
215 return DiyFp(0xC800'0000'0000'0000, -57);
217 return DiyFp(0xFA00'0000'0000'0000, -54);
219 return DiyFp(0x9C40'0000'0000'0000, -50);
221 return DiyFp(0xC350'0000'0000'0000, -47);
223 return DiyFp(0xF424'0000'0000'0000, -44);
225 return DiyFp(0x9896'8000'0000'0000, -40);
237 int remaining_decimals;
238 ReadDiyFp(buffer, &input, &remaining_decimals);
244 const int kDenominatorLog = 3;
245 const int kDenominator = 1 << kDenominatorLog;
247 exponent += remaining_decimals;
248 int64_t error = (remaining_decimals == 0 ? 0 : kDenominator / 2);
250 int old_e = input.e();
252 error <<= old_e - input.e();
260 int cached_decimal_exponent;
262 &cached_decimal_exponent);
264 if (cached_decimal_exponent != exponent) {
265 int adjustment_exponent = exponent - cached_decimal_exponent;
267 input.Multiply(adjustment_power);
274 error += kDenominator / 2;
278 input.Multiply(cached_power);
284 int error_b = kDenominator / 2;
285 int error_ab = (error == 0 ? 0 : 1);
286 int fixed_error = kDenominator / 2;
287 error += error_b + error_ab + fixed_error;
291 error <<= old_e - input.e();
295 int effective_significand_size =
297 int precision_digits_count =
303 int shift_amount = (precision_digits_count + kDenominatorLog) -
305 input.set_f(input.f() >> shift_amount);
306 input.set_e(input.e() + shift_amount);
309 error = (error >> shift_amount) + 1 + kDenominator;
310 precision_digits_count -= shift_amount;
316 uint64_t precision_bits_mask = (one64 << precision_digits_count) - 1;
317 uint64_t precision_bits = input.f() & precision_bits_mask;
318 uint64_t half_way = one64 << (precision_digits_count - 1);
319 precision_bits *= kDenominator;
320 half_way *= kDenominator;
321 DiyFp rounded_input(input.f() >> precision_digits_count,
322 input.e() + precision_digits_count);
323 if (precision_bits >= half_way + error) {
324 rounded_input.
set_f(rounded_input.
f() + 1);
331 if (half_way - error < precision_bits && precision_bits < half_way + error) {
350 if (guess == std::numeric_limits<double>::infinity()) {
369 input.MultiplyByPowerOfTen(exponent);
373 if (upper_boundary.
e() > 0) {
376 input.ShiftLeft(-upper_boundary.
e());
379 if (comparison < 0) {
381 }
else if (comparison > 0) {
383 }
else if ((
Double(guess).Significand() & 1) == 0) {
395 if (trimmed.
empty())
return 0.0;
398 int significant_exponent;
400 &significant_exponent);
403 significant_exponent);
406 return std::numeric_limits<double>::infinity();
void AssignDecimalString(Vector< const char > value)
void AssignUInt64(uint64_t value)
void MultiplyByPowerOfTen(int exponent)
static const int kMaxSignificantBits
void ShiftLeft(int shift_amount)
static int Compare(const Bignum &a, const Bignum &b)
static const int kSignificandSize
constexpr uint64_t f() const
constexpr void set_f(uint64_t new_value)
constexpr double NextDouble() const
static int SignificandSizeForOrderOfMagnitude(int order)
DiyFp UpperBoundary() const
constexpr double value() const
static const int kDecimalExponentDistance
static const int kMaxDecimalExponent
static void GetCachedPowerForDecimalExponent(int requested_exponent, DiyFp *power, int *found_exponent)
static const int kMinDecimalExponent
Vector< T > SubVector(size_t from, size_t to) const
constexpr bool empty() const
constexpr T * begin() const
ZoneVector< RpoNumber > & result
static void TrimToMaxSignificantDigits(Vector< const char > buffer, int exponent, char *significant_buffer, int *significant_exponent)
static const double exact_powers_of_ten[]
static const uint64_t kMaxUint64
static Vector< const char > TrimLeadingZeros(Vector< const char > buffer)
static bool DiyFpStrtod(Vector< const char > buffer, int exponent, double *result)
static const int kMaxSignificantDecimalDigits
static const int kExactPowersOfTenSize
static DiyFp AdjustmentPowerOfTen(int exponent)
static uint64_t ReadUint64(Vector< const char > buffer, int *number_of_read_digits)
double Strtod(Vector< const char > buffer, int exponent)
static double BignumStrtod(Vector< const char > buffer, int exponent, double guess)
static bool DoubleStrtod(Vector< const char > trimmed, int exponent, double *result)
static const int kMaxUint64DecimalDigits
static Vector< const char > TrimTrailingZeros(Vector< const char > buffer)
static const int kMaxExactDoubleIntegerDecimalDigits
static const int kMinDecimalPower
static void ReadDiyFp(Vector< const char > buffer, DiyFp *result, int *remaining_decimals)
static const int kMaxDecimalPower
#define DCHECK_LE(v1, v2)
#define DCHECK_NE(v1, v2)
#define DCHECK(condition)
#define DCHECK_LT(v1, v2)
#define DCHECK_EQ(v1, v2)
#define DCHECK_GT(v1, v2)