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 8namespace v8 { 9namespace internal { 10 11enum 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. 23const 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. 51bool 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