OLD | NEW |
---|---|
1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
48 uint32_t part = static_cast<uint32_t>(accumulator & kMask32); | 48 uint32_t part = static_cast<uint32_t>(accumulator & kMask32); |
49 accumulator >>= 32; | 49 accumulator >>= 32; |
50 accumulator = accumulator + (low_bits_ >> 32) * multiplicand; | 50 accumulator = accumulator + (low_bits_ >> 32) * multiplicand; |
51 low_bits_ = (accumulator << 32) + part; | 51 low_bits_ = (accumulator << 32) + part; |
52 accumulator >>= 32; | 52 accumulator >>= 32; |
53 accumulator = accumulator + (high_bits_ & kMask32) * multiplicand; | 53 accumulator = accumulator + (high_bits_ & kMask32) * multiplicand; |
54 part = static_cast<uint32_t>(accumulator & kMask32); | 54 part = static_cast<uint32_t>(accumulator & kMask32); |
55 accumulator >>= 32; | 55 accumulator >>= 32; |
56 accumulator = accumulator + (high_bits_ >> 32) * multiplicand; | 56 accumulator = accumulator + (high_bits_ >> 32) * multiplicand; |
57 high_bits_ = (accumulator << 32) + part; | 57 high_bits_ = (accumulator << 32) + part; |
58 ASSERT((accumulator >> 32) == 0); | 58 DCHECK_EQ((accumulator >> 32), 0u); |
59 } | 59 } |
60 | 60 |
61 void Shift(int shift_amount) { | 61 void Shift(int shift_amount) { |
62 ASSERT(-64 <= shift_amount && shift_amount <= 64); | 62 DCHECK_LE(-64, shift_amount); |
63 DCHECK_LE(shift_amount, 64); | |
63 if (shift_amount == 0) { | 64 if (shift_amount == 0) { |
64 return; | 65 return; |
65 } else if (shift_amount == -64) { | 66 } else if (shift_amount == -64) { |
66 high_bits_ = low_bits_; | 67 high_bits_ = low_bits_; |
67 low_bits_ = 0; | 68 low_bits_ = 0; |
68 } else if (shift_amount == 64) { | 69 } else if (shift_amount == 64) { |
69 low_bits_ = high_bits_; | 70 low_bits_ = high_bits_; |
70 high_bits_ = 0; | 71 high_bits_ = 0; |
71 } else if (shift_amount <= 0) { | 72 } else if (shift_amount <= 0) { |
72 high_bits_ <<= -shift_amount; | 73 high_bits_ <<= -shift_amount; |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
225 // 0 <= fractionals * 2^exponent < 1 | 226 // 0 <= fractionals * 2^exponent < 1 |
226 // The buffer holds the result. | 227 // The buffer holds the result. |
227 // The function will round its result. During the rounding-process digits no t | 228 // The function will round its result. During the rounding-process digits no t |
228 // generated by this function might be updated, and the decimal-point variab le | 229 // generated by this function might be updated, and the decimal-point variab le |
229 // might be updated. If this function generates the digits 99 and the buffer | 230 // might be updated. If this function generates the digits 99 and the buffer |
230 // already contained "199" (thus yielding a buffer of "19999") then a | 231 // already contained "199" (thus yielding a buffer of "19999") then a |
231 // rounding-up will change the contents of the buffer to "20000". | 232 // rounding-up will change the contents of the buffer to "20000". |
232 static void FillFractionals(uint64_t fractionals, int exponent, | 233 static void FillFractionals(uint64_t fractionals, int exponent, |
233 int fractional_count, Vector<char> buffer, | 234 int fractional_count, Vector<char> buffer, |
234 int* length, int* decimal_point) { | 235 int* length, int* decimal_point) { |
235 ASSERT(-128 <= exponent && exponent <= 0); | 236 DCHECK_LE(-128, exponent); |
237 DCHECK_LE(exponent, 0); | |
236 // 'fractionals' is a fixed-point number, with binary point at bit | 238 // 'fractionals' is a fixed-point number, with binary point at bit |
237 // (-exponent). Inside the function the non-converted remainder of fract ionals | 239 // (-exponent). Inside the function the non-converted remainder of fract ionals |
238 // is a fixed-point number, with binary point at bit 'point'. | 240 // is a fixed-point number, with binary point at bit 'point'. |
239 if (-exponent <= 64) { | 241 if (-exponent <= 64) { |
240 // One 64 bit number is sufficient. | 242 // One 64 bit number is sufficient. |
241 ASSERT(fractionals >> 56 == 0); | 243 ASSERT(fractionals >> 56 == 0); |
242 int point = -exponent; | 244 int point = -exponent; |
243 for (int i = 0; i < fractional_count; ++i) { | 245 for (int i = 0; i < fractional_count; ++i) { |
244 if (fractionals == 0) break; | 246 if (fractionals == 0) break; |
245 // Instead of multiplying by 10 we multiply by 5 and adjust the point | 247 // Instead of multiplying by 10 we multiply by 5 and adjust the point |
(...skipping 11 matching lines...) Expand all Loading... | |
257 char digit = static_cast<char>(fractionals >> point); | 259 char digit = static_cast<char>(fractionals >> point); |
258 buffer[*length] = '0' + digit; | 260 buffer[*length] = '0' + digit; |
259 (*length)++; | 261 (*length)++; |
260 fractionals -= static_cast<uint64_t>(digit) << point; | 262 fractionals -= static_cast<uint64_t>(digit) << point; |
261 } | 263 } |
262 // If the first bit after the point is set we have to round up. | 264 // If the first bit after the point is set we have to round up. |
263 if (((fractionals >> (point - 1)) & 1) == 1) { | 265 if (((fractionals >> (point - 1)) & 1) == 1) { |
264 RoundUp(buffer, length, decimal_point); | 266 RoundUp(buffer, length, decimal_point); |
265 } | 267 } |
266 } else { // We need 128 bits. | 268 } else { // We need 128 bits. |
267 ASSERT(64 < -exponent && -exponent <= 128); | 269 DCHECK_LT(64, -exponent); |
270 DCHECK_LE(-exponent, 128); | |
268 UInt128 fractionals128 = UInt128(fractionals, 0); | 271 UInt128 fractionals128 = UInt128(fractionals, 0); |
269 fractionals128.Shift(-exponent - 64); | 272 fractionals128.Shift(-exponent - 64); |
270 int point = 128; | 273 int point = 128; |
271 for (int i = 0; i < fractional_count; ++i) { | 274 for (int i = 0; i < fractional_count; ++i) { |
272 if (fractionals128.IsZero()) break; | 275 if (fractionals128.IsZero()) break; |
273 // As before: instead of multiplying by 10 we multiply by 5 and adjust the | 276 // As before: instead of multiplying by 10 we multiply by 5 and adjust the |
274 // point location. | 277 // point location. |
275 // This multiplication will not overflow for the same reasons as before. | 278 // This multiplication will not overflow for the same reasons as before. |
276 fractionals128.Multiply(5); | 279 fractionals128.Multiply(5); |
277 point--; | 280 point--; |
278 char digit = static_cast<char>(fractionals128.DivModPowerOf2(poi nt)); | 281 char digit = static_cast<char>(fractionals128.DivModPowerOf2(poi nt)); |
279 buffer[*length] = '0' + digit; | 282 buffer[*length] = '0' + digit; |
280 (*length)++; | 283 (*length)++; |
284 | |
tkent
2017/05/08 14:31:04
This change is unnecessary.
Hwanseung Lee
2017/05/08 23:31:13
Done.
| |
281 } | 285 } |
282 if (fractionals128.BitAt(point - 1) == 1) { | 286 if (fractionals128.BitAt(point - 1) == 1) { |
283 RoundUp(buffer, length, decimal_point); | 287 RoundUp(buffer, length, decimal_point); |
284 } | 288 } |
285 } | 289 } |
286 } | 290 } |
287 | 291 |
288 | 292 |
289 // Removes leading and trailing zeros. | 293 // Removes leading and trailing zeros. |
290 // If leading zeros are removed then the decimal point position is adjusted. | 294 // If leading zeros are removed then the decimal point position is adjusted. |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
375 FillDigits64(integrals, buffer, length); | 379 FillDigits64(integrals, buffer, length); |
376 } else { | 380 } else { |
377 FillDigits32(static_cast<uint32_t>(integrals), buffer, length); | 381 FillDigits32(static_cast<uint32_t>(integrals), buffer, length); |
378 } | 382 } |
379 *decimal_point = *length; | 383 *decimal_point = *length; |
380 FillFractionals(fractionals, exponent, fractional_count, | 384 FillFractionals(fractionals, exponent, fractional_count, |
381 buffer, length, decimal_point); | 385 buffer, length, decimal_point); |
382 } else if (exponent < -128) { | 386 } else if (exponent < -128) { |
383 // This configuration (with at most 20 digits) means that all digits must be | 387 // This configuration (with at most 20 digits) means that all digits must be |
384 // 0. | 388 // 0. |
385 ASSERT(fractional_count <= 20); | 389 DCHECK_LE(fractional_count, 20); |
386 buffer[0] = '\0'; | 390 buffer[0] = '\0'; |
387 *length = 0; | 391 *length = 0; |
388 *decimal_point = -fractional_count; | 392 *decimal_point = -fractional_count; |
389 } else { | 393 } else { |
390 *decimal_point = 0; | 394 *decimal_point = 0; |
391 FillFractionals(significand, exponent, fractional_count, | 395 FillFractionals(significand, exponent, fractional_count, |
392 buffer, length, decimal_point); | 396 buffer, length, decimal_point); |
393 } | 397 } |
394 TrimZeros(buffer, length, decimal_point); | 398 TrimZeros(buffer, length, decimal_point); |
395 buffer[*length] = '\0'; | 399 buffer[*length] = '\0'; |
396 if ((*length) == 0) { | 400 if ((*length) == 0) { |
397 // The string is empty and the decimal_point thus has no importance. Mimick | 401 // The string is empty and the decimal_point thus has no importance. Mimick |
398 // Gay's dtoa and and set it to -fractional_count. | 402 // Gay's dtoa and and set it to -fractional_count. |
399 *decimal_point = -fractional_count; | 403 *decimal_point = -fractional_count; |
400 } | 404 } |
401 return true; | 405 return true; |
402 } | 406 } |
403 | 407 |
404 } // namespace double_conversion | 408 } // namespace double_conversion |
405 | 409 |
406 } // namespace WTF | 410 } // namespace WTF |
OLD | NEW |