18a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Copyright 2010 the V8 project authors. All rights reserved.
28a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Redistribution and use in source and binary forms, with or without
38a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// modification, are permitted provided that the following conditions are
48a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// met:
58a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//
68a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//     * Redistributions of source code must retain the above copyright
78a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//       notice, this list of conditions and the following disclaimer.
88a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//     * Redistributions in binary form must reproduce the above
98a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//       copyright notice, this list of conditions and the following
108a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//       disclaimer in the documentation and/or other materials provided
118a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//       with the distribution.
128a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//     * Neither the name of Google Inc. nor the names of its
138a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//       contributors may be used to endorse or promote products derived
148a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//       from this software without specific prior written permission.
158a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//
168a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
178a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
188a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
198a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
208a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
218a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
228a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
238a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
248a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
258a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
268a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
278a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
288a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#include <stdlib.h>
298a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
308a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#include "v8.h"
318a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
328a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#include "dtoa.h"
338a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
348a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#include "cctest.h"
358a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#include "double.h"
368a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#include "gay-fixed.h"
378a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#include "gay-precision.h"
388a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#include "gay-shortest.h"
398a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#include "platform.h"
408a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
418a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
428a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangusing namespace v8::internal;
438a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
448a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
458a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Removes trailing '0' digits.
468a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangstatic void TrimRepresentation(Vector<char> representation) {
471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  int len = StrLength(representation.start());
488a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  int i;
498a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  for (i = len - 1; i >= 0; --i) {
508a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    if (representation[i] != '0') break;
518a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  }
528a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  representation[i + 1] = '\0';
538a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang}
548a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
558a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
568a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangstatic const int kBufferSize = 100;
578a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
588a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
598a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) WangTEST(DtoaVariousDoubles) {
608a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  char buffer_container[kBufferSize];
618a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  Vector<char> buffer(buffer_container, kBufferSize);
628a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  int length;
638a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  int point;
648a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  int sign;
658a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
668a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  DoubleToAscii(0.0, DTOA_SHORTEST, 0, buffer, &sign, &length, &point);
678a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("0", buffer.start());
688a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(1, point);
698a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
708a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  DoubleToAscii(0.0, DTOA_FIXED, 2, buffer, &sign, &length, &point);
718a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(1, length);
728a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("0", buffer.start());
738a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(1, point);
748a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
758a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  DoubleToAscii(0.0, DTOA_PRECISION, 3, buffer, &sign, &length, &point);
768a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(1, length);
778a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("0", buffer.start());
788a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(1, point);
798a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
808a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  DoubleToAscii(1.0, DTOA_SHORTEST, 0, buffer, &sign, &length, &point);
818a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("1", buffer.start());
828a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(1, point);
838a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
848a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  DoubleToAscii(1.0, DTOA_FIXED, 3, buffer, &sign, &length, &point);
858a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_GE(3, length - point);
868a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  TrimRepresentation(buffer);
878a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("1", buffer.start());
888a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(1, point);
898a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
908a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  DoubleToAscii(1.0, DTOA_PRECISION, 3, buffer, &sign, &length, &point);
918a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_GE(3, length);
928a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  TrimRepresentation(buffer);
938a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("1", buffer.start());
948a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(1, point);
958a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
968a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  DoubleToAscii(1.5, DTOA_SHORTEST, 0, buffer, &sign, &length, &point);
978a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("15", buffer.start());
988a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(1, point);
998a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1008a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  DoubleToAscii(1.5, DTOA_FIXED, 10, buffer, &sign, &length, &point);
1018a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_GE(10, length - point);
1028a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  TrimRepresentation(buffer);
1038a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("15", buffer.start());
1048a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(1, point);
1058a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1068a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  DoubleToAscii(1.5, DTOA_PRECISION, 10, buffer, &sign, &length, &point);
1078a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_GE(10, length);
1088a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  TrimRepresentation(buffer);
1098a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("15", buffer.start());
1108a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(1, point);
1118a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1128a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  double min_double = 5e-324;
1138a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  DoubleToAscii(min_double, DTOA_SHORTEST, 0, buffer, &sign, &length, &point);
1148a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("5", buffer.start());
1158a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(-323, point);
1168a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1178a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  DoubleToAscii(min_double, DTOA_FIXED, 5, buffer, &sign, &length, &point);
1188a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_GE(5, length - point);
1198a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  TrimRepresentation(buffer);
1208a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("", buffer.start());
1218a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_GE(-5, point);
1228a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1238a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  DoubleToAscii(min_double, DTOA_PRECISION, 5, buffer, &sign, &length, &point);
1248a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_GE(5, length);
1258a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  TrimRepresentation(buffer);
1268a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("49407", buffer.start());
1278a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(-323, point);
1288a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1298a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  double max_double = 1.7976931348623157e308;
1308a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  DoubleToAscii(max_double, DTOA_SHORTEST, 0, buffer, &sign, &length, &point);
1318a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("17976931348623157", buffer.start());
1328a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(309, point);
1338a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1348a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  DoubleToAscii(max_double, DTOA_PRECISION, 7, buffer, &sign, &length, &point);
1358a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_GE(7, length);
1368a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  TrimRepresentation(buffer);
1378a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("1797693", buffer.start());
1388a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(309, point);
1398a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1408a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  DoubleToAscii(4294967272.0, DTOA_SHORTEST, 0, buffer, &sign, &length, &point);
1418a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("4294967272", buffer.start());
1428a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(10, point);
1438a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1448a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  DoubleToAscii(4294967272.0, DTOA_FIXED, 5, buffer, &sign, &length, &point);
1458a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_GE(5, length - point);
1468a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  TrimRepresentation(buffer);
1478a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("4294967272", buffer.start());
1488a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(10, point);
1498a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1508a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1518a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  DoubleToAscii(4294967272.0, DTOA_PRECISION, 14,
1528a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang                buffer, &sign, &length, &point);
1538a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_GE(14, length);
1548a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  TrimRepresentation(buffer);
1558a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("4294967272", buffer.start());
1568a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(10, point);
1578a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1588a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  DoubleToAscii(4.1855804968213567e298, DTOA_SHORTEST, 0,
1598a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang                buffer, &sign, &length, &point);
1608a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("4185580496821357", buffer.start());
1618a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(299, point);
1628a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1638a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  DoubleToAscii(4.1855804968213567e298, DTOA_PRECISION, 20,
1648a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang                buffer, &sign, &length, &point);
1658a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_GE(20, length);
1668a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  TrimRepresentation(buffer);
1678a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("41855804968213567225", buffer.start());
1688a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(299, point);
1698a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1708a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  DoubleToAscii(5.5626846462680035e-309, DTOA_SHORTEST, 0,
1718a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang                buffer, &sign, &length, &point);
1728a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("5562684646268003", buffer.start());
1738a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(-308, point);
1748a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1758a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  DoubleToAscii(5.5626846462680035e-309, DTOA_PRECISION, 1,
1768a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang                buffer, &sign, &length, &point);
1778a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_GE(1, length);
1788a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  TrimRepresentation(buffer);
1798a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("6", buffer.start());
1808a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(-308, point);
1818a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1828a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  DoubleToAscii(-2147483648.0, DTOA_SHORTEST, 0,
1838a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang                buffer, &sign, &length, &point);
1848a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(1, sign);
1858a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("2147483648", buffer.start());
1868a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(10, point);
1878a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1888a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1898a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  DoubleToAscii(-2147483648.0, DTOA_FIXED, 2, buffer, &sign, &length, &point);
1908a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_GE(2, length - point);
1918a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  TrimRepresentation(buffer);
1928a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(1, sign);
1938a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("2147483648", buffer.start());
1948a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(10, point);
1958a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1968a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  DoubleToAscii(-2147483648.0, DTOA_PRECISION, 5,
1978a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang                buffer, &sign, &length, &point);
1988a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_GE(5, length);
1998a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  TrimRepresentation(buffer);
2008a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(1, sign);
2018a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("21475", buffer.start());
2028a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(10, point);
2038a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2048a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  DoubleToAscii(-3.5844466002796428e+298, DTOA_SHORTEST, 0,
2058a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang                buffer, &sign, &length, &point);
2068a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(1, sign);
2078a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("35844466002796428", buffer.start());
2088a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(299, point);
2098a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2108a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  DoubleToAscii(-3.5844466002796428e+298, DTOA_PRECISION, 10,
2118a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang                buffer, &sign, &length, &point);
2128a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(1, sign);
2138a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_GE(10, length);
2148a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  TrimRepresentation(buffer);
2158a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("35844466", buffer.start());
2168a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(299, point);
2178a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2188a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  uint64_t smallest_normal64 = V8_2PART_UINT64_C(0x00100000, 00000000);
2198a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  double v = Double(smallest_normal64).value();
2208a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  DoubleToAscii(v, DTOA_SHORTEST, 0, buffer, &sign, &length, &point);
2218a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("22250738585072014", buffer.start());
2228a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(-307, point);
2238a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2248a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  DoubleToAscii(v, DTOA_PRECISION, 20, buffer, &sign, &length, &point);
2258a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_GE(20, length);
2268a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  TrimRepresentation(buffer);
2278a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("22250738585072013831", buffer.start());
2288a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(-307, point);
2298a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2308a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  uint64_t largest_denormal64 = V8_2PART_UINT64_C(0x000FFFFF, FFFFFFFF);
2318a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  v = Double(largest_denormal64).value();
2328a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  DoubleToAscii(v, DTOA_SHORTEST, 0, buffer, &sign, &length, &point);
2338a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("2225073858507201", buffer.start());
2348a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(-307, point);
2358a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2368a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  DoubleToAscii(v, DTOA_PRECISION, 20, buffer, &sign, &length, &point);
2378a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_GE(20, length);
2388a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  TrimRepresentation(buffer);
2398a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("2225073858507200889", buffer.start());
2408a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(-307, point);
2418a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2428a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  DoubleToAscii(4128420500802942e-24, DTOA_SHORTEST, 0,
2438a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang                buffer, &sign, &length, &point);
2448a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(0, sign);
2458a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("4128420500802942", buffer.start());
2468a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(-8, point);
2478a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2488a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  v = -3.9292015898194142585311918e-10;
2498a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  DoubleToAscii(v, DTOA_SHORTEST, 0, buffer, &sign, &length, &point);
2508a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("39292015898194143", buffer.start());
2518a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2528a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  v = 4194304.0;
2538a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  DoubleToAscii(v, DTOA_FIXED, 5, buffer, &sign, &length, &point);
2548a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_GE(5, length - point);
2558a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  TrimRepresentation(buffer);
2568a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("4194304", buffer.start());
2578a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2588a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  v = 3.3161339052167390562200598e-237;
2598a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  DoubleToAscii(v, DTOA_PRECISION, 19, buffer, &sign, &length, &point);
2608a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_GE(19, length);
2618a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  TrimRepresentation(buffer);
2628a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("3316133905216739056", buffer.start());
2638a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(-236, point);
2648a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang}
2658a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2668a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2678a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) WangTEST(DtoaGayShortest) {
2688a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  char buffer_container[kBufferSize];
2698a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  Vector<char> buffer(buffer_container, kBufferSize);
2708a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  int sign;
2718a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  int length;
2728a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  int point;
2738a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2748a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  Vector<const PrecomputedShortest> precomputed =
2758a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang      PrecomputedShortestRepresentations();
2768a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  for (int i = 0; i < precomputed.length(); ++i) {
2778a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    const PrecomputedShortest current_test = precomputed[i];
2788a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    double v = current_test.v;
2798a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    DoubleToAscii(v, DTOA_SHORTEST, 0, buffer, &sign, &length, &point);
2808a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    CHECK_EQ(0, sign);  // All precomputed numbers are positive.
2818a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    CHECK_EQ(current_test.decimal_point, point);
2828a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    CHECK_EQ(current_test.representation, buffer.start());
2838a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  }
2848a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang}
2858a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2868a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2878a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) WangTEST(DtoaGayFixed) {
2888a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  char buffer_container[kBufferSize];
2898a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  Vector<char> buffer(buffer_container, kBufferSize);
2908a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  int sign;
2918a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  int length;
2928a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  int point;
2938a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2948a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  Vector<const PrecomputedFixed> precomputed =
2958a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang      PrecomputedFixedRepresentations();
2968a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  for (int i = 0; i < precomputed.length(); ++i) {
2978a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    const PrecomputedFixed current_test = precomputed[i];
2988a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    double v = current_test.v;
2998a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    int number_digits = current_test.number_digits;
3008a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    DoubleToAscii(v, DTOA_FIXED, number_digits, buffer, &sign, &length, &point);
3018a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    CHECK_EQ(0, sign);  // All precomputed numbers are positive.
3028a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    CHECK_EQ(current_test.decimal_point, point);
3038a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    CHECK_GE(number_digits, length - point);
3048a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    TrimRepresentation(buffer);
3058a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    CHECK_EQ(current_test.representation, buffer.start());
3068a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  }
3078a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang}
3088a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
3098a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
3108a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) WangTEST(DtoaGayPrecision) {
3118a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  char buffer_container[kBufferSize];
3128a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  Vector<char> buffer(buffer_container, kBufferSize);
3138a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  int sign;
3148a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  int length;
3158a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  int point;
3168a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
3178a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  Vector<const PrecomputedPrecision> precomputed =
3188a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang      PrecomputedPrecisionRepresentations();
3198a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  for (int i = 0; i < precomputed.length(); ++i) {
3208a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    const PrecomputedPrecision current_test = precomputed[i];
3218a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    double v = current_test.v;
3228a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    int number_digits = current_test.number_digits;
3238a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    DoubleToAscii(v, DTOA_PRECISION, number_digits,
3248a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang                  buffer, &sign, &length, &point);
3258a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    CHECK_EQ(0, sign);  // All precomputed numbers are positive.
3268a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    CHECK_EQ(current_test.decimal_point, point);
3278a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    CHECK_GE(number_digits, length);
3288a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    TrimRepresentation(buffer);
3298a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    CHECK_EQ(current_test.representation, buffer.start());
3308a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  }
3318a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang}
332