11e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Copyright 2011 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 "bignum-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) Wangusing namespace v8::internal;
428a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
438a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
448a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Removes trailing '0' digits.
458a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Can return the empty string if all digits are 0.
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(BignumDtoaVariousDoubles) {
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
658a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  BignumDtoa(1.0, BIGNUM_DTOA_SHORTEST, 0, buffer, &length, &point);
668a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("1", buffer.start());
678a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(1, point);
688a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
698a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  BignumDtoa(1.0, BIGNUM_DTOA_FIXED, 3, buffer, &length, &point);
708a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_GE(3, length - point);
718a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  TrimRepresentation(buffer);
728a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("1", buffer.start());
738a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(1, point);
748a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
758a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  BignumDtoa(1.0, BIGNUM_DTOA_PRECISION, 3, buffer, &length, &point);
768a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_GE(3, length);
778a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  TrimRepresentation(buffer);
788a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("1", buffer.start());
798a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(1, point);
808a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
818a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  BignumDtoa(1.5, BIGNUM_DTOA_SHORTEST, 0, buffer, &length, &point);
828a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("15", buffer.start());
838a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(1, point);
848a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
858a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  BignumDtoa(1.5, BIGNUM_DTOA_FIXED, 10, buffer, &length, &point);
868a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_GE(10, length - point);
878a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  TrimRepresentation(buffer);
888a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("15", buffer.start());
898a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(1, point);
908a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
918a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  BignumDtoa(1.5, BIGNUM_DTOA_PRECISION, 10, buffer, &length, &point);
928a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_GE(10, length);
938a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  TrimRepresentation(buffer);
948a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("15", buffer.start());
958a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(1, point);
968a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
978a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  double min_double = 5e-324;
988a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  BignumDtoa(min_double, BIGNUM_DTOA_SHORTEST, 0, buffer, &length, &point);
998a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("5", buffer.start());
1008a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(-323, point);
1018a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1028a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  BignumDtoa(min_double, BIGNUM_DTOA_FIXED, 5, buffer, &length, &point);
1038a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_GE(5, length - point);
1048a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  TrimRepresentation(buffer);
1058a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("", buffer.start());
1068a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1078a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  BignumDtoa(min_double, BIGNUM_DTOA_PRECISION, 5, buffer, &length, &point);
1088a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_GE(5, length);
1098a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  TrimRepresentation(buffer);
1108a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("49407", buffer.start());
1118a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(-323, point);
1128a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1138a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  double max_double = 1.7976931348623157e308;
1148a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  BignumDtoa(max_double, BIGNUM_DTOA_SHORTEST, 0, buffer, &length, &point);
1158a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("17976931348623157", buffer.start());
1168a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(309, point);
1178a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1188a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  BignumDtoa(max_double, BIGNUM_DTOA_PRECISION, 7, buffer, &length, &point);
1198a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_GE(7, length);
1208a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  TrimRepresentation(buffer);
1218a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("1797693", buffer.start());
1228a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(309, point);
1238a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1248a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  BignumDtoa(4294967272.0, BIGNUM_DTOA_SHORTEST, 0, buffer, &length, &point);
1258a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("4294967272", buffer.start());
1268a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(10, point);
1278a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1288a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  BignumDtoa(4294967272.0, BIGNUM_DTOA_FIXED, 5, buffer, &length, &point);
1298a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("429496727200000", buffer.start());
1308a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(10, point);
1318a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1328a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1338a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  BignumDtoa(4294967272.0, BIGNUM_DTOA_PRECISION, 14, buffer, &length, &point);
1348a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_GE(14, length);
1358a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  TrimRepresentation(buffer);
1368a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("4294967272", buffer.start());
1378a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(10, point);
1388a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1398a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  BignumDtoa(4.1855804968213567e298, BIGNUM_DTOA_SHORTEST, 0,
1408a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang             buffer, &length, &point);
1418a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("4185580496821357", buffer.start());
1428a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(299, point);
1438a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1448a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  BignumDtoa(4.1855804968213567e298, BIGNUM_DTOA_PRECISION, 20,
1458a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang             buffer, &length, &point);
1468a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_GE(20, length);
1478a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  TrimRepresentation(buffer);
1488a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("41855804968213567225", buffer.start());
1498a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(299, point);
1508a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1518a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  BignumDtoa(5.5626846462680035e-309, BIGNUM_DTOA_SHORTEST, 0,
1528a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang             buffer, &length, &point);
1538a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("5562684646268003", buffer.start());
1548a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(-308, point);
1558a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1568a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  BignumDtoa(5.5626846462680035e-309, BIGNUM_DTOA_PRECISION, 1,
1578a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang             buffer, &length, &point);
1588a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_GE(1, length);
1598a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  TrimRepresentation(buffer);
1608a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("6", buffer.start());
1618a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(-308, point);
1628a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1638a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  BignumDtoa(2147483648.0, BIGNUM_DTOA_SHORTEST, 0,
1648a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang             buffer, &length, &point);
1658a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("2147483648", buffer.start());
1668a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(10, point);
1678a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1688a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1698a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  BignumDtoa(2147483648.0, BIGNUM_DTOA_FIXED, 2,
1708a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang             buffer, &length, &point);
1718a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_GE(2, length - point);
1728a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  TrimRepresentation(buffer);
1738a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("2147483648", buffer.start());
1748a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(10, point);
1758a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1768a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  BignumDtoa(2147483648.0, BIGNUM_DTOA_PRECISION, 5,
1778a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang             buffer, &length, &point);
1788a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_GE(5, length);
1798a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  TrimRepresentation(buffer);
1808a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("21475", buffer.start());
1818a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(10, point);
1828a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1838a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  BignumDtoa(3.5844466002796428e+298, BIGNUM_DTOA_SHORTEST, 0,
1848a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang             buffer, &length, &point);
1858a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("35844466002796428", buffer.start());
1868a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(299, point);
1878a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1888a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  BignumDtoa(3.5844466002796428e+298, BIGNUM_DTOA_PRECISION, 10,
1898a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang             buffer, &length, &point);
1908a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_GE(10, length);
1918a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  TrimRepresentation(buffer);
1928a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("35844466", buffer.start());
1938a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(299, point);
1948a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1958a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  uint64_t smallest_normal64 = V8_2PART_UINT64_C(0x00100000, 00000000);
1968a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  double v = Double(smallest_normal64).value();
1978a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  BignumDtoa(v, BIGNUM_DTOA_SHORTEST, 0, buffer, &length, &point);
1988a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("22250738585072014", buffer.start());
1998a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(-307, point);
2008a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2018a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  BignumDtoa(v, BIGNUM_DTOA_PRECISION, 20, buffer, &length, &point);
2028a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_GE(20, length);
2038a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  TrimRepresentation(buffer);
2048a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("22250738585072013831", buffer.start());
2058a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(-307, point);
2068a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2078a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  uint64_t largest_denormal64 = V8_2PART_UINT64_C(0x000FFFFF, FFFFFFFF);
2088a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  v = Double(largest_denormal64).value();
2098a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  BignumDtoa(v, BIGNUM_DTOA_SHORTEST, 0, buffer, &length, &point);
2108a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("2225073858507201", buffer.start());
2118a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(-307, point);
2128a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2138a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  BignumDtoa(v, BIGNUM_DTOA_PRECISION, 20, buffer, &length, &point);
2148a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_GE(20, length);
2158a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  TrimRepresentation(buffer);
2168a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("2225073858507200889", buffer.start());
2178a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(-307, point);
2188a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2198a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  BignumDtoa(4128420500802942e-24, BIGNUM_DTOA_SHORTEST, 0,
2208a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang             buffer, &length, &point);
2218a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("4128420500802942", buffer.start());
2228a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(-8, point);
2238a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2248a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  v = 3.9292015898194142585311918e-10;
2258a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  BignumDtoa(v, BIGNUM_DTOA_SHORTEST, 0, buffer, &length, &point);
2268a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("39292015898194143", buffer.start());
2278a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2288a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  v = 4194304.0;
2298a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  BignumDtoa(v, BIGNUM_DTOA_FIXED, 5, buffer, &length, &point);
2308a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_GE(5, length - point);
2318a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  TrimRepresentation(buffer);
2328a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("4194304", buffer.start());
2338a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2348a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  v = 3.3161339052167390562200598e-237;
2358a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  BignumDtoa(v, BIGNUM_DTOA_PRECISION, 19, buffer, &length, &point);
2368a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_GE(19, length);
2378a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  TrimRepresentation(buffer);
2388a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("3316133905216739056", buffer.start());
2398a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(-236, point);
2408a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2418a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  v = 7.9885183916008099497815232e+191;
2428a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  BignumDtoa(v, BIGNUM_DTOA_PRECISION, 4, buffer, &length, &point);
2438a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_GE(4, length);
2448a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  TrimRepresentation(buffer);
2458a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("7989", buffer.start());
2468a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(192, point);
2478a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2488a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  v = 1.0000000000000012800000000e+17;
2498a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  BignumDtoa(v, BIGNUM_DTOA_FIXED, 1, buffer, &length, &point);
2508a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_GE(1, length - point);
2518a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  TrimRepresentation(buffer);
2528a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ("100000000000000128", buffer.start());
2538a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CHECK_EQ(18, point);
2548a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang}
2558a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2568a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2578a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) WangTEST(BignumDtoaGayShortest) {
2588a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  char buffer_container[kBufferSize];
2598a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  Vector<char> buffer(buffer_container, kBufferSize);
2608a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  int length;
2618a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  int point;
2628a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2638a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  Vector<const PrecomputedShortest> precomputed =
2648a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang      PrecomputedShortestRepresentations();
2658a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  for (int i = 0; i < precomputed.length(); ++i) {
2668a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    const PrecomputedShortest current_test = precomputed[i];
2678a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    double v = current_test.v;
2688a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    BignumDtoa(v, BIGNUM_DTOA_SHORTEST, 0, buffer, &length, &point);
2698a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    CHECK_EQ(current_test.decimal_point, point);
2708a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    CHECK_EQ(current_test.representation, buffer.start());
2718a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  }
2728a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang}
2738a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2748a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2758a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) WangTEST(BignumDtoaGayFixed) {
2768a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  char buffer_container[kBufferSize];
2778a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  Vector<char> buffer(buffer_container, kBufferSize);
2788a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  int length;
2798a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  int point;
2808a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2818a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  Vector<const PrecomputedFixed> precomputed =
2828a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang      PrecomputedFixedRepresentations();
2838a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  for (int i = 0; i < precomputed.length(); ++i) {
2848a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    const PrecomputedFixed current_test = precomputed[i];
2858a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    double v = current_test.v;
2868a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    int number_digits = current_test.number_digits;
2878a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    BignumDtoa(v, BIGNUM_DTOA_FIXED, number_digits, buffer, &length, &point);
2888a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    CHECK_EQ(current_test.decimal_point, point);
2898a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    CHECK_GE(number_digits, length - point);
2908a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    TrimRepresentation(buffer);
2918a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    CHECK_EQ(current_test.representation, buffer.start());
2928a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  }
2938a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang}
2948a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2958a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2968a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) WangTEST(BignumDtoaGayPrecision) {
2978a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  char buffer_container[kBufferSize];
2988a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  Vector<char> buffer(buffer_container, kBufferSize);
2998a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  int length;
3008a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  int point;
3018a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
3028a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  Vector<const PrecomputedPrecision> precomputed =
3038a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang      PrecomputedPrecisionRepresentations();
3048a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  for (int i = 0; i < precomputed.length(); ++i) {
3058a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    const PrecomputedPrecision current_test = precomputed[i];
3068a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    double v = current_test.v;
3078a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    int number_digits = current_test.number_digits;
3088a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    BignumDtoa(v, BIGNUM_DTOA_PRECISION, number_digits,
3098a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang               buffer, &length, &point);
3108a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    CHECK_EQ(current_test.decimal_point, point);
3118a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    CHECK_GE(number_digits, length);
3128a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    TrimRepresentation(buffer);
3138a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    CHECK_EQ(current_test.representation, buffer.start());
3148a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  }
3158a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang}
316