1cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project// Copyright 2011 the V8 project authors. All rights reserved.
205436638acc7c010349a69c3395f1a57c642dc62Ying Wang// Use of this source code is governed by a BSD-style license that can be
305436638acc7c010349a69c3395f1a57c642dc62Ying Wang// found in the LICENSE file.
4cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
5cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifndef V8_FAST_DTOA_H_
605436638acc7c010349a69c3395f1a57c642dc62Ying Wang#define V8_FAST_DTOA_H_
7cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
805436638acc7c010349a69c3395f1a57c642dc62Ying Wangnamespace v8 {
905436638acc7c010349a69c3395f1a57c642dc62Ying Wangnamespace internal {
10cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
11cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectenum FastDtoaMode {
12cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  // Computes the shortest representation of the given input. The returned
13cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  // result will be the most accurate number of this length. Longer
14cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  // representations might be more accurate.
15cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  FAST_DTOA_SHORTEST,
1605436638acc7c010349a69c3395f1a57c642dc62Ying Wang  // Computes a representation where the precision (number of digits) is
1705436638acc7c010349a69c3395f1a57c642dc62Ying Wang  // given as input. The precision is independent of the decimal point.
18cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project  FAST_DTOA_PRECISION
19cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project};
20cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
21cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project// FastDtoa will produce at most kFastDtoaMaximalLength digits. This does not
2205436638acc7c010349a69c3395f1a57c642dc62Ying Wang// include the terminating '\0' character.
23cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectconst int kFastDtoaMaximalLength = 17;
24cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
25cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project// Provides a decimal representation of v.
26cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project// The result should be interpreted as buffer * 10^(point - length).
27cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project//
28cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project// Precondition:
29cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project//   * v must be a strictly positive finite double.
30cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project//
31cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project// Returns true if it succeeds, otherwise the result can not be trusted.
32cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project// There will be *length digits inside the buffer followed by a null terminator.
33cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project// If the function returns true and mode equals
34cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project//   - FAST_DTOA_SHORTEST, then
3505436638acc7c010349a69c3395f1a57c642dc62Ying Wang//     the parameter requested_digits is ignored.
36cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project//     The result satisfies
37cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project//         v == (double) (buffer * 10^(point - length)).
38cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project//     The digits in the buffer are the shortest representation possible. E.g.
39cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project//     if 0.099999999999 and 0.1 represent the same double then "1" is returned
40cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project//     with point = 0.
4105436638acc7c010349a69c3395f1a57c642dc62Ying Wang//     The last digit will be closest to the actual v. That is, even if several
42cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project//     digits might correctly yield 'v' when read again, the buffer will contain
43cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project//     the one closest to v.
4405436638acc7c010349a69c3395f1a57c642dc62Ying Wang//   - FAST_DTOA_PRECISION, then
45cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project//     the buffer contains requested_digits digits.
46cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project//     the difference v - (buffer * 10^(point-length)) is closest to zero for
47cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project//     all possible representations of requested_digits digits.
48cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project//     If there are two values that are equally close, then FastDtoa returns
4905436638acc7c010349a69c3395f1a57c642dc62Ying Wang//     false.
5005436638acc7c010349a69c3395f1a57c642dc62Ying Wang// For both modes the buffer must be large enough to hold the result.
51cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectbool FastDtoa(double d,
52cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project              FastDtoaMode mode,
5305436638acc7c010349a69c3395f1a57c642dc62Ying Wang              int requested_digits,
54cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project              Vector<char> buffer,
55cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project              int* length,
56cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project              int* decimal_point);
57cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
58cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} }  // namespace v8::internal
59cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project
60cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif  // V8_FAST_DTOA_H_
61cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project