16ded16be15dd865a9b21ea304d5273c8be299c87Steve Block// Copyright 2006-2008 the V8 project authors. All rights reserved.
26ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
36ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#include <stdlib.h>
46ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
56ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#include "v8.h"
66ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
76ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#include "platform.h"
86ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#include "cctest.h"
96ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#include "diy-fp.h"
106ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#include "double.h"
116ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#include "fast-dtoa.h"
120d5e116f6aee03185f237311a943491bb079a768Kristian Monsen#include "gay-precision.h"
136ded16be15dd865a9b21ea304d5273c8be299c87Steve Block#include "gay-shortest.h"
146ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
156ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockusing namespace v8::internal;
166ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
176ded16be15dd865a9b21ea304d5273c8be299c87Steve Blockstatic const int kBufferSize = 100;
186ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
190d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
200d5e116f6aee03185f237311a943491bb079a768Kristian Monsen// Removes trailing '0' digits.
210d5e116f6aee03185f237311a943491bb079a768Kristian Monsenstatic void TrimRepresentation(Vector<char> representation) {
221e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  int len = StrLength(representation.start());
230d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  int i;
240d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  for (i = len - 1; i >= 0; --i) {
250d5e116f6aee03185f237311a943491bb079a768Kristian Monsen    if (representation[i] != '0') break;
260d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  }
270d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  representation[i + 1] = '\0';
280d5e116f6aee03185f237311a943491bb079a768Kristian Monsen}
290d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
300d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
310d5e116f6aee03185f237311a943491bb079a768Kristian MonsenTEST(FastDtoaShortestVariousDoubles) {
326ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  char buffer_container[kBufferSize];
336ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  Vector<char> buffer(buffer_container, kBufferSize);
346ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  int length;
356ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  int point;
366ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  int status;
376ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
386ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  double min_double = 5e-324;
390d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  status = FastDtoa(min_double, FAST_DTOA_SHORTEST, 0,
400d5e116f6aee03185f237311a943491bb079a768Kristian Monsen                    buffer, &length, &point);
416ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK(status);
426ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK_EQ("5", buffer.start());
436ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK_EQ(-323, point);
446ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
456ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  double max_double = 1.7976931348623157e308;
460d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  status = FastDtoa(max_double, FAST_DTOA_SHORTEST, 0,
470d5e116f6aee03185f237311a943491bb079a768Kristian Monsen                    buffer, &length, &point);
486ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK(status);
496ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK_EQ("17976931348623157", buffer.start());
506ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK_EQ(309, point);
516ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
520d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  status = FastDtoa(4294967272.0, FAST_DTOA_SHORTEST, 0,
530d5e116f6aee03185f237311a943491bb079a768Kristian Monsen                    buffer, &length, &point);
546ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK(status);
556ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK_EQ("4294967272", buffer.start());
566ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK_EQ(10, point);
576ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
580d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  status = FastDtoa(4.1855804968213567e298, FAST_DTOA_SHORTEST, 0,
590d5e116f6aee03185f237311a943491bb079a768Kristian Monsen                    buffer, &length, &point);
606ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK(status);
616ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK_EQ("4185580496821357", buffer.start());
626ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK_EQ(299, point);
636ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
640d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  status = FastDtoa(5.5626846462680035e-309, FAST_DTOA_SHORTEST, 0,
650d5e116f6aee03185f237311a943491bb079a768Kristian Monsen                    buffer, &length, &point);
666ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK(status);
676ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK_EQ("5562684646268003", buffer.start());
686ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK_EQ(-308, point);
696ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
700d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  status = FastDtoa(2147483648.0, FAST_DTOA_SHORTEST, 0,
710d5e116f6aee03185f237311a943491bb079a768Kristian Monsen                    buffer, &length, &point);
726ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK(status);
736ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK_EQ("2147483648", buffer.start());
746ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK_EQ(10, point);
756ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
760d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  status = FastDtoa(3.5844466002796428e+298, FAST_DTOA_SHORTEST, 0,
770d5e116f6aee03185f237311a943491bb079a768Kristian Monsen                    buffer, &length, &point);
786ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  if (status) {  // Not all FastDtoa variants manage to compute this number.
796ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    CHECK_EQ("35844466002796428", buffer.start());
806ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    CHECK_EQ(299, point);
816ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  }
826ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
836ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  uint64_t smallest_normal64 = V8_2PART_UINT64_C(0x00100000, 00000000);
846ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  double v = Double(smallest_normal64).value();
850d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  status = FastDtoa(v, FAST_DTOA_SHORTEST, 0, buffer, &length, &point);
866ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  if (status) {
876ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    CHECK_EQ("22250738585072014", buffer.start());
886ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    CHECK_EQ(-307, point);
896ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  }
906ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
916ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  uint64_t largest_denormal64 = V8_2PART_UINT64_C(0x000FFFFF, FFFFFFFF);
926ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  v = Double(largest_denormal64).value();
930d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  status = FastDtoa(v, FAST_DTOA_SHORTEST, 0, buffer, &length, &point);
946ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  if (status) {
956ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    CHECK_EQ("2225073858507201", buffer.start());
966ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    CHECK_EQ(-307, point);
976ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  }
986ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
996ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1006ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
1010d5e116f6aee03185f237311a943491bb079a768Kristian MonsenTEST(FastDtoaPrecisionVariousDoubles) {
1020d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  char buffer_container[kBufferSize];
1030d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  Vector<char> buffer(buffer_container, kBufferSize);
1040d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  int length;
1050d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  int point;
1060d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  int status;
1070d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
1080d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  status = FastDtoa(1.0, FAST_DTOA_PRECISION, 3, buffer, &length, &point);
1090d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  CHECK(status);
1100d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  CHECK_GE(3, length);
1110d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  TrimRepresentation(buffer);
1120d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  CHECK_EQ("1", buffer.start());
1130d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  CHECK_EQ(1, point);
1140d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
1150d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  status = FastDtoa(1.5, FAST_DTOA_PRECISION, 10, buffer, &length, &point);
1160d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  if (status) {
1170d5e116f6aee03185f237311a943491bb079a768Kristian Monsen    CHECK_GE(10, length);
1180d5e116f6aee03185f237311a943491bb079a768Kristian Monsen    TrimRepresentation(buffer);
1190d5e116f6aee03185f237311a943491bb079a768Kristian Monsen    CHECK_EQ("15", buffer.start());
1200d5e116f6aee03185f237311a943491bb079a768Kristian Monsen    CHECK_EQ(1, point);
1210d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  }
1220d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
1230d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  double min_double = 5e-324;
1240d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  status = FastDtoa(min_double, FAST_DTOA_PRECISION, 5,
1250d5e116f6aee03185f237311a943491bb079a768Kristian Monsen                    buffer, &length, &point);
1260d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  CHECK(status);
1270d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  CHECK_EQ("49407", buffer.start());
1280d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  CHECK_EQ(-323, point);
1290d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
1300d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  double max_double = 1.7976931348623157e308;
1310d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  status = FastDtoa(max_double, FAST_DTOA_PRECISION, 7,
1320d5e116f6aee03185f237311a943491bb079a768Kristian Monsen                    buffer, &length, &point);
1330d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  CHECK(status);
1340d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  CHECK_EQ("1797693", buffer.start());
1350d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  CHECK_EQ(309, point);
1360d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
1370d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  status = FastDtoa(4294967272.0, FAST_DTOA_PRECISION, 14,
1380d5e116f6aee03185f237311a943491bb079a768Kristian Monsen                    buffer, &length, &point);
1390d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  if (status) {
1400d5e116f6aee03185f237311a943491bb079a768Kristian Monsen    CHECK_GE(14, length);
1410d5e116f6aee03185f237311a943491bb079a768Kristian Monsen    TrimRepresentation(buffer);
1420d5e116f6aee03185f237311a943491bb079a768Kristian Monsen    CHECK_EQ("4294967272", buffer.start());
1430d5e116f6aee03185f237311a943491bb079a768Kristian Monsen    CHECK_EQ(10, point);
1440d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  }
1450d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
1460d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  status = FastDtoa(4.1855804968213567e298, FAST_DTOA_PRECISION, 17,
1470d5e116f6aee03185f237311a943491bb079a768Kristian Monsen                    buffer, &length, &point);
1480d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  CHECK(status);
1490d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  CHECK_EQ("41855804968213567", buffer.start());
1500d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  CHECK_EQ(299, point);
1510d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
1520d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  status = FastDtoa(5.5626846462680035e-309, FAST_DTOA_PRECISION, 1,
1530d5e116f6aee03185f237311a943491bb079a768Kristian Monsen                    buffer, &length, &point);
1540d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  CHECK(status);
1550d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  CHECK_EQ("6", buffer.start());
1560d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  CHECK_EQ(-308, point);
1570d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
1580d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  status = FastDtoa(2147483648.0, FAST_DTOA_PRECISION, 5,
1590d5e116f6aee03185f237311a943491bb079a768Kristian Monsen                    buffer, &length, &point);
1600d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  CHECK(status);
1610d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  CHECK_EQ("21475", buffer.start());
1620d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  CHECK_EQ(10, point);
1630d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
1640d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  status = FastDtoa(3.5844466002796428e+298, FAST_DTOA_PRECISION, 10,
1650d5e116f6aee03185f237311a943491bb079a768Kristian Monsen                    buffer, &length, &point);
1660d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  CHECK(status);
1670d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  CHECK_GE(10, length);
1680d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  TrimRepresentation(buffer);
1690d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  CHECK_EQ("35844466", buffer.start());
1700d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  CHECK_EQ(299, point);
1710d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
1720d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  uint64_t smallest_normal64 = V8_2PART_UINT64_C(0x00100000, 00000000);
1730d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  double v = Double(smallest_normal64).value();
1740d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  status = FastDtoa(v, FAST_DTOA_PRECISION, 17, buffer, &length, &point);
1750d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  CHECK(status);
1760d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  CHECK_EQ("22250738585072014", buffer.start());
1770d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  CHECK_EQ(-307, point);
1780d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
1790d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  uint64_t largest_denormal64 = V8_2PART_UINT64_C(0x000FFFFF, FFFFFFFF);
1800d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  v = Double(largest_denormal64).value();
1810d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  status = FastDtoa(v, FAST_DTOA_PRECISION, 17, buffer, &length, &point);
1820d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  CHECK(status);
1830d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  CHECK_GE(20, length);
1840d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  TrimRepresentation(buffer);
1850d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  CHECK_EQ("22250738585072009", buffer.start());
1860d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  CHECK_EQ(-307, point);
1870d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
1880d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  v = 3.3161339052167390562200598e-237;
1890d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  status = FastDtoa(v, FAST_DTOA_PRECISION, 18, buffer, &length, &point);
1900d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  CHECK(status);
1910d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  CHECK_EQ("331613390521673906", buffer.start());
1920d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  CHECK_EQ(-236, point);
1930d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
1940d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  v = 7.9885183916008099497815232e+191;
1950d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  status = FastDtoa(v, FAST_DTOA_PRECISION, 4, buffer, &length, &point);
1960d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  CHECK(status);
1970d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  CHECK_EQ("7989", buffer.start());
1980d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  CHECK_EQ(192, point);
1990d5e116f6aee03185f237311a943491bb079a768Kristian Monsen}
2000d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
2010d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
2026ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockTEST(FastDtoaGayShortest) {
2036ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  char buffer_container[kBufferSize];
2046ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  Vector<char> buffer(buffer_container, kBufferSize);
2056ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  bool status;
2066ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  int length;
2076ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  int point;
2086ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  int succeeded = 0;
2096ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  int total = 0;
2106ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  bool needed_max_length = false;
2116ded16be15dd865a9b21ea304d5273c8be299c87Steve Block
21225f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen  Vector<const PrecomputedShortest> precomputed =
21325f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen      PrecomputedShortestRepresentations();
2146ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  for (int i = 0; i < precomputed.length(); ++i) {
21525f6136652d8341ed047e7fc1a450af5bd218ea9Kristian Monsen    const PrecomputedShortest current_test = precomputed[i];
2166ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    total++;
2176ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    double v = current_test.v;
2180d5e116f6aee03185f237311a943491bb079a768Kristian Monsen    status = FastDtoa(v, FAST_DTOA_SHORTEST, 0, buffer, &length, &point);
2196ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    CHECK_GE(kFastDtoaMaximalLength, length);
2206ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    if (!status) continue;
2216ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    if (length == kFastDtoaMaximalLength) needed_max_length = true;
2226ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    succeeded++;
2236ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    CHECK_EQ(current_test.decimal_point, point);
2246ded16be15dd865a9b21ea304d5273c8be299c87Steve Block    CHECK_EQ(current_test.representation, buffer.start());
2256ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  }
2266ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK_GT(succeeded*1.0/total, 0.99);
2276ded16be15dd865a9b21ea304d5273c8be299c87Steve Block  CHECK(needed_max_length);
2286ded16be15dd865a9b21ea304d5273c8be299c87Steve Block}
2290d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
2300d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
2310d5e116f6aee03185f237311a943491bb079a768Kristian MonsenTEST(FastDtoaGayPrecision) {
2320d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  char buffer_container[kBufferSize];
2330d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  Vector<char> buffer(buffer_container, kBufferSize);
2340d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  bool status;
2350d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  int length;
2360d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  int point;
2370d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  int succeeded = 0;
2380d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  int total = 0;
2390d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  // Count separately for entries with less than 15 requested digits.
2400d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  int succeeded_15 = 0;
2410d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  int total_15 = 0;
2420d5e116f6aee03185f237311a943491bb079a768Kristian Monsen
2430d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  Vector<const PrecomputedPrecision> precomputed =
2440d5e116f6aee03185f237311a943491bb079a768Kristian Monsen      PrecomputedPrecisionRepresentations();
2450d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  for (int i = 0; i < precomputed.length(); ++i) {
2460d5e116f6aee03185f237311a943491bb079a768Kristian Monsen    const PrecomputedPrecision current_test = precomputed[i];
2470d5e116f6aee03185f237311a943491bb079a768Kristian Monsen    double v = current_test.v;
2480d5e116f6aee03185f237311a943491bb079a768Kristian Monsen    int number_digits = current_test.number_digits;
2490d5e116f6aee03185f237311a943491bb079a768Kristian Monsen    total++;
2500d5e116f6aee03185f237311a943491bb079a768Kristian Monsen    if (number_digits <= 15) total_15++;
2510d5e116f6aee03185f237311a943491bb079a768Kristian Monsen    status = FastDtoa(v, FAST_DTOA_PRECISION, number_digits,
2520d5e116f6aee03185f237311a943491bb079a768Kristian Monsen                      buffer, &length, &point);
2530d5e116f6aee03185f237311a943491bb079a768Kristian Monsen    CHECK_GE(number_digits, length);
2540d5e116f6aee03185f237311a943491bb079a768Kristian Monsen    if (!status) continue;
2550d5e116f6aee03185f237311a943491bb079a768Kristian Monsen    succeeded++;
2560d5e116f6aee03185f237311a943491bb079a768Kristian Monsen    if (number_digits <= 15) succeeded_15++;
2570d5e116f6aee03185f237311a943491bb079a768Kristian Monsen    TrimRepresentation(buffer);
2580d5e116f6aee03185f237311a943491bb079a768Kristian Monsen    CHECK_EQ(current_test.decimal_point, point);
2590d5e116f6aee03185f237311a943491bb079a768Kristian Monsen    CHECK_EQ(current_test.representation, buffer.start());
2600d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  }
2610d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  // The precomputed numbers contain many entries with many requested
2620d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  // digits. These have a high failure rate and we therefore expect a lower
2630d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  // success rate than for the shortest representation.
2640d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  CHECK_GT(succeeded*1.0/total, 0.85);
2650d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  // However with less than 15 digits almost the algorithm should almost always
2660d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  // succeed.
2670d5e116f6aee03185f237311a943491bb079a768Kristian Monsen  CHECK_GT(succeeded_15*1.0/total_15, 0.9999);
2680d5e116f6aee03185f237311a943491bb079a768Kristian Monsen}
269