fast-dtoa.h 4.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. // Copyright 2010 the V8 project authors. All rights reserved.
  2. // Redistribution and use in source and binary forms, with or without
  3. // modification, are permitted provided that the following conditions are
  4. // met:
  5. //
  6. // * Redistributions of source code must retain the above copyright
  7. // notice, this list of conditions and the following disclaimer.
  8. // * Redistributions in binary form must reproduce the above
  9. // copyright notice, this list of conditions and the following
  10. // disclaimer in the documentation and/or other materials provided
  11. // with the distribution.
  12. // * Neither the name of Google Inc. nor the names of its
  13. // contributors may be used to endorse or promote products derived
  14. // from this software without specific prior written permission.
  15. //
  16. // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  17. // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  18. // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  19. // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  20. // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  21. // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  22. // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  23. // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  24. // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  25. // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  26. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27. #ifndef DOUBLE_CONVERSION_FAST_DTOA_H_
  28. #define DOUBLE_CONVERSION_FAST_DTOA_H_
  29. #include "utils.h"
  30. namespace double_conversion {
  31. enum FastDtoaMode {
  32. // Computes the shortest representation of the given input. The returned
  33. // result will be the most accurate number of this length. Longer
  34. // representations might be more accurate.
  35. FAST_DTOA_SHORTEST,
  36. // Same as FAST_DTOA_SHORTEST but for single-precision floats.
  37. FAST_DTOA_SHORTEST_SINGLE,
  38. // Computes a representation where the precision (number of digits) is
  39. // given as input. The precision is independent of the decimal point.
  40. FAST_DTOA_PRECISION
  41. };
  42. // FastDtoa will produce at most kFastDtoaMaximalLength digits. This does not
  43. // include the terminating '\0' character.
  44. static const int kFastDtoaMaximalLength = 17;
  45. // Same for single-precision numbers.
  46. static const int kFastDtoaMaximalSingleLength = 9;
  47. // Provides a decimal representation of v.
  48. // The result should be interpreted as buffer * 10^(point - length).
  49. //
  50. // Precondition:
  51. // * v must be a strictly positive finite double.
  52. //
  53. // Returns true if it succeeds, otherwise the result can not be trusted.
  54. // There will be *length digits inside the buffer followed by a null terminator.
  55. // If the function returns true and mode equals
  56. // - FAST_DTOA_SHORTEST, then
  57. // the parameter requested_digits is ignored.
  58. // The result satisfies
  59. // v == (double) (buffer * 10^(point - length)).
  60. // The digits in the buffer are the shortest representation possible. E.g.
  61. // if 0.099999999999 and 0.1 represent the same double then "1" is returned
  62. // with point = 0.
  63. // The last digit will be closest to the actual v. That is, even if several
  64. // digits might correctly yield 'v' when read again, the buffer will contain
  65. // the one closest to v.
  66. // - FAST_DTOA_PRECISION, then
  67. // the buffer contains requested_digits digits.
  68. // the difference v - (buffer * 10^(point-length)) is closest to zero for
  69. // all possible representations of requested_digits digits.
  70. // If there are two values that are equally close, then FastDtoa returns
  71. // false.
  72. // For both modes the buffer must be large enough to hold the result.
  73. bool FastDtoa(double d,
  74. FastDtoaMode mode,
  75. int requested_digits,
  76. Vector<char> buffer,
  77. int* length,
  78. int* decimal_point);
  79. } // namespace double_conversion
  80. #endif // DOUBLE_CONVERSION_FAST_DTOA_H_