59 1000000000000000000.0,
60 10000000000000000000.0,
61 100000000000000000000.0,
62 1000000000000000000000.0,
64 10000000000000000000000.0
74 for (
int i = 0;
i < buffer.
length();
i++) {
75 if (buffer[
i] !=
'0') {
84 for (
int i = buffer.
length() - 1;
i >= 0; --
i) {
85 if (buffer[
i] !=
'0') {
95 char* significant_buffer,
96 int* significant_exponent) {
98 significant_buffer[
i] = buffer[
i];
106 *significant_exponent =
117 int* number_of_read_digits) {
121 int digit = buffer[
i++] -
'0';
122 DCHECK(0 <= digit && digit <= 9);
123 result = 10 * result + digit;
125 *number_of_read_digits =
i;
136 int* remaining_decimals) {
138 uint64_t significand =
ReadUint64(buffer, &read_digits);
139 if (buffer.
length() == read_digits) {
140 *result =
DiyFp(significand, 0);
141 *remaining_decimals = 0;
144 if (buffer[read_digits] >=
'5') {
149 *result =
DiyFp(significand, exponent);
150 *remaining_decimals = buffer.
length() - read_digits;
158 #if (V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_X87 || defined(USE_SIMULATOR)) && \
179 *result =
static_cast<double>(
ReadUint64(trimmed, &read_digits));
186 *result =
static_cast<double>(
ReadUint64(trimmed, &read_digits));
191 int remaining_digits =
193 if ((0 <= exponent) &&
198 *result =
static_cast<double>(
ReadUint64(trimmed, &read_digits));
239 int remaining_decimals;
240 ReadDiyFp(buffer, &input, &remaining_decimals);
246 const int kDenominatorLog = 3;
247 const int kDenominator = 1 << kDenominatorLog;
249 exponent += remaining_decimals;
250 int64_t error = (remaining_decimals == 0 ? 0 : kDenominator / 2);
252 int old_e = input.
e();
254 error <<= old_e - input.
e();
262 int cached_decimal_exponent;
265 &cached_decimal_exponent);
267 if (cached_decimal_exponent != exponent) {
268 int adjustment_exponent = exponent - cached_decimal_exponent;
277 error += kDenominator / 2;
287 int error_b = kDenominator / 2;
288 int error_ab = (error == 0 ? 0 : 1);
289 int fixed_error = kDenominator / 2;
290 error += error_b + error_ab + fixed_error;
294 error <<= old_e - input.
e();
298 int effective_significand_size =
300 int precision_digits_count =
306 int shift_amount = (precision_digits_count + kDenominatorLog) -
308 input.
set_f(input.
f() >> shift_amount);
309 input.
set_e(input.
e() + shift_amount);
312 error = (error >> shift_amount) + 1 + kDenominator;
313 precision_digits_count -= shift_amount;
317 DCHECK(precision_digits_count < 64);
319 uint64_t precision_bits_mask = (one64 << precision_digits_count) - 1;
320 uint64_t precision_bits = input.
f() & precision_bits_mask;
321 uint64_t half_way = one64 << (precision_digits_count - 1);
322 precision_bits *= kDenominator;
323 half_way *= kDenominator;
324 DiyFp rounded_input(input.
f() >> precision_digits_count,
325 input.
e() + precision_digits_count);
326 if (precision_bits >= half_way + error) {
327 rounded_input.
set_f(rounded_input.
f() + 1);
334 if (half_way - error < precision_bits && precision_bits < half_way + error) {
378 if (upper_boundary.
e() > 0) {
384 if (comparison < 0) {
386 }
else if (comparison > 0) {
388 }
else if ((
Double(guess).Significand() & 1) == 0) {
401 if (trimmed.
length() == 0)
return 0.0;
404 int significant_exponent;
406 significant_buffer, &significant_exponent);
409 significant_exponent);
void ShiftLeft(int shift_amount)
static const int kMaxSignificantBits
void MultiplyByPowerOfTen(int exponent)
void AssignDecimalString(Vector< const char > value)
void AssignUInt64(uint64_t value)
static int Compare(const Bignum &a, const Bignum &b)
void Multiply(const DiyFp &other)
void set_e(int new_value)
static const int kSignificandSize
void set_f(uint64_t new_value)
static int SignificandSizeForOrderOfMagnitude(int order)
DiyFp UpperBoundary() const
double NextDouble() const
static const int kMinDecimalExponent
static const int kDecimalExponentDistance
static const int kMaxDecimalExponent
static void GetCachedPowerForDecimalExponent(int requested_exponent, DiyFp *power, int *found_exponent)
Vector< T > SubVector(int from, int to)
#define DCHECK(condition)
#define V8_2PART_UINT64_C(a, b)
static double BignumStrtod(Vector< const char > buffer, int exponent, double guess)
static void ReadDiyFp(Vector< const char > buffer, DiyFp *result, int *remaining_decimals)
static const int kMaxSignificantDecimalDigits
static bool DoubleStrtod(Vector< const char > trimmed, int exponent, double *result)
static const int kExactPowersOfTenSize
static const int kMaxDecimalPower
static const int kMaxUint64DecimalDigits
double Strtod(Vector< const char > buffer, int exponent)
static const int kMinDecimalPower
static const uint64_t kMaxUint64
static void TrimToMaxSignificantDigits(Vector< const char > buffer, int exponent, char *significant_buffer, int *significant_exponent)
static Vector< const char > TrimLeadingZeros(Vector< const char > buffer)
static bool DiyFpStrtod(Vector< const char > buffer, int exponent, double *result)
static Vector< const char > TrimTrailingZeros(Vector< const char > buffer)
static const double exact_powers_of_ten[]
static DiyFp AdjustmentPowerOfTen(int exponent)
static uint64_t ReadUint64(Vector< const char > buffer, int *number_of_read_digits)
static const int kMaxExactDoubleIntegerDecimalDigits
Debugger support for the V8 JavaScript engine.