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