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