183aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org// Copyright 2011 the V8 project authors. All rights reserved. 24a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com// Redistribution and use in source and binary forms, with or without 34a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com// modification, are permitted provided that the following conditions are 44a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com// met: 54a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com// 64a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com// * Redistributions of source code must retain the above copyright 74a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com// notice, this list of conditions and the following disclaimer. 84a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com// * Redistributions in binary form must reproduce the above 94a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com// copyright notice, this list of conditions and the following 104a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com// disclaimer in the documentation and/or other materials provided 114a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com// with the distribution. 124a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com// * Neither the name of Google Inc. nor the names of its 134a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com// contributors may be used to endorse or promote products derived 144a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com// from this software without specific prior written permission. 154a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com// 164a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 174a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 184a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 194a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 204a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 214a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 224a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 234a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 244a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 254a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 264a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 274a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 284a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com#include <stdlib.h> 294a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 304a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com#include "v8.h" 314a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 324a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com#include "bignum-dtoa.h" 334a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 344a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com#include "cctest.h" 354a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com#include "double.h" 364a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com#include "gay-fixed.h" 374a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com#include "gay-precision.h" 384a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com#include "gay-shortest.h" 394a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com#include "platform.h" 404a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 414a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.comusing namespace v8::internal; 424a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 434a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 444a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com// Removes trailing '0' digits. 454a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com// Can return the empty string if all digits are 0. 464a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.comstatic void TrimRepresentation(Vector<char> representation) { 4783aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org int len = StrLength(representation.start()); 484a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com int i; 494a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com for (i = len - 1; i >= 0; --i) { 504a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com if (representation[i] != '0') break; 514a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com } 524a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com representation[i + 1] = '\0'; 534a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com} 544a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 554a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 564a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.comstatic const int kBufferSize = 100; 574a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 584a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 594a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.comTEST(BignumDtoaVariousDoubles) { 604a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com char buffer_container[kBufferSize]; 614a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com Vector<char> buffer(buffer_container, kBufferSize); 624a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com int length; 634a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com int point; 644a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 654a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com BignumDtoa(1.0, BIGNUM_DTOA_SHORTEST, 0, buffer, &length, &point); 664a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ("1", buffer.start()); 674a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ(1, point); 684a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 694a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com BignumDtoa(1.0, BIGNUM_DTOA_FIXED, 3, buffer, &length, &point); 704a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_GE(3, length - point); 714a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com TrimRepresentation(buffer); 724a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ("1", buffer.start()); 734a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ(1, point); 744a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 754a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com BignumDtoa(1.0, BIGNUM_DTOA_PRECISION, 3, buffer, &length, &point); 764a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_GE(3, length); 774a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com TrimRepresentation(buffer); 784a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ("1", buffer.start()); 794a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ(1, point); 804a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 814a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com BignumDtoa(1.5, BIGNUM_DTOA_SHORTEST, 0, buffer, &length, &point); 824a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ("15", buffer.start()); 834a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ(1, point); 844a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 854a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com BignumDtoa(1.5, BIGNUM_DTOA_FIXED, 10, buffer, &length, &point); 864a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_GE(10, length - point); 874a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com TrimRepresentation(buffer); 884a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ("15", buffer.start()); 894a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ(1, point); 904a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 914a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com BignumDtoa(1.5, BIGNUM_DTOA_PRECISION, 10, buffer, &length, &point); 924a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_GE(10, length); 934a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com TrimRepresentation(buffer); 944a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ("15", buffer.start()); 954a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ(1, point); 964a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 974a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com double min_double = 5e-324; 984a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com BignumDtoa(min_double, BIGNUM_DTOA_SHORTEST, 0, buffer, &length, &point); 994a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ("5", buffer.start()); 1004a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ(-323, point); 1014a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 1024a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com BignumDtoa(min_double, BIGNUM_DTOA_FIXED, 5, buffer, &length, &point); 1034a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_GE(5, length - point); 1044a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com TrimRepresentation(buffer); 1054a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ("", buffer.start()); 1064a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 1074a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com BignumDtoa(min_double, BIGNUM_DTOA_PRECISION, 5, buffer, &length, &point); 1084a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_GE(5, length); 1094a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com TrimRepresentation(buffer); 1104a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ("49407", buffer.start()); 1114a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ(-323, point); 1124a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 1134a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com double max_double = 1.7976931348623157e308; 1144a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com BignumDtoa(max_double, BIGNUM_DTOA_SHORTEST, 0, buffer, &length, &point); 1154a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ("17976931348623157", buffer.start()); 1164a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ(309, point); 1174a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 1184a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com BignumDtoa(max_double, BIGNUM_DTOA_PRECISION, 7, buffer, &length, &point); 1194a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_GE(7, length); 1204a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com TrimRepresentation(buffer); 1214a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ("1797693", buffer.start()); 1224a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ(309, point); 1234a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 1244a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com BignumDtoa(4294967272.0, BIGNUM_DTOA_SHORTEST, 0, buffer, &length, &point); 1254a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ("4294967272", buffer.start()); 1264a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ(10, point); 1274a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 1284a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com BignumDtoa(4294967272.0, BIGNUM_DTOA_FIXED, 5, buffer, &length, &point); 1294a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ("429496727200000", buffer.start()); 1304a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ(10, point); 1314a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 1324a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 1334a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com BignumDtoa(4294967272.0, BIGNUM_DTOA_PRECISION, 14, buffer, &length, &point); 1344a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_GE(14, length); 1354a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com TrimRepresentation(buffer); 1364a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ("4294967272", buffer.start()); 1374a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ(10, point); 1384a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 1394a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com BignumDtoa(4.1855804968213567e298, BIGNUM_DTOA_SHORTEST, 0, 1404a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com buffer, &length, &point); 1414a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ("4185580496821357", buffer.start()); 1424a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ(299, point); 1434a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 1444a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com BignumDtoa(4.1855804968213567e298, BIGNUM_DTOA_PRECISION, 20, 1454a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com buffer, &length, &point); 1464a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_GE(20, length); 1474a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com TrimRepresentation(buffer); 1484a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ("41855804968213567225", buffer.start()); 1494a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ(299, point); 1504a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 1514a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com BignumDtoa(5.5626846462680035e-309, BIGNUM_DTOA_SHORTEST, 0, 1524a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com buffer, &length, &point); 1534a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ("5562684646268003", buffer.start()); 1544a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ(-308, point); 1554a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 1564a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com BignumDtoa(5.5626846462680035e-309, BIGNUM_DTOA_PRECISION, 1, 1574a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com buffer, &length, &point); 1584a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_GE(1, length); 1594a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com TrimRepresentation(buffer); 1604a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ("6", buffer.start()); 1614a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ(-308, point); 1624a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 1634a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com BignumDtoa(2147483648.0, BIGNUM_DTOA_SHORTEST, 0, 1644a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com buffer, &length, &point); 1654a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ("2147483648", buffer.start()); 1664a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ(10, point); 1674a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 1684a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 1694a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com BignumDtoa(2147483648.0, BIGNUM_DTOA_FIXED, 2, 1704a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com buffer, &length, &point); 1714a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_GE(2, length - point); 1724a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com TrimRepresentation(buffer); 1734a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ("2147483648", buffer.start()); 1744a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ(10, point); 1754a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 1764a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com BignumDtoa(2147483648.0, BIGNUM_DTOA_PRECISION, 5, 1774a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com buffer, &length, &point); 1784a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_GE(5, length); 1794a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com TrimRepresentation(buffer); 1804a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ("21475", buffer.start()); 1814a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ(10, point); 1824a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 1834a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com BignumDtoa(3.5844466002796428e+298, BIGNUM_DTOA_SHORTEST, 0, 1844a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com buffer, &length, &point); 1854a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ("35844466002796428", buffer.start()); 1864a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ(299, point); 1874a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 1884a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com BignumDtoa(3.5844466002796428e+298, BIGNUM_DTOA_PRECISION, 10, 1894a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com buffer, &length, &point); 1904a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_GE(10, length); 1914a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com TrimRepresentation(buffer); 1924a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ("35844466", buffer.start()); 1934a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ(299, point); 1944a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 1954a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com uint64_t smallest_normal64 = V8_2PART_UINT64_C(0x00100000, 00000000); 1964a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com double v = Double(smallest_normal64).value(); 1974a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com BignumDtoa(v, BIGNUM_DTOA_SHORTEST, 0, buffer, &length, &point); 1984a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ("22250738585072014", buffer.start()); 1994a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ(-307, point); 2004a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 2014a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com BignumDtoa(v, BIGNUM_DTOA_PRECISION, 20, buffer, &length, &point); 2024a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_GE(20, length); 2034a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com TrimRepresentation(buffer); 2044a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ("22250738585072013831", buffer.start()); 2054a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ(-307, point); 2064a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 2074a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com uint64_t largest_denormal64 = V8_2PART_UINT64_C(0x000FFFFF, FFFFFFFF); 2084a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com v = Double(largest_denormal64).value(); 2094a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com BignumDtoa(v, BIGNUM_DTOA_SHORTEST, 0, buffer, &length, &point); 2104a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ("2225073858507201", buffer.start()); 2114a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ(-307, point); 2124a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 2134a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com BignumDtoa(v, BIGNUM_DTOA_PRECISION, 20, buffer, &length, &point); 2144a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_GE(20, length); 2154a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com TrimRepresentation(buffer); 2164a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ("2225073858507200889", buffer.start()); 2174a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ(-307, point); 2184a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 2194a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com BignumDtoa(4128420500802942e-24, BIGNUM_DTOA_SHORTEST, 0, 2204a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com buffer, &length, &point); 2214a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ("4128420500802942", buffer.start()); 2224a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ(-8, point); 2234a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 2244a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com v = 3.9292015898194142585311918e-10; 2254a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com BignumDtoa(v, BIGNUM_DTOA_SHORTEST, 0, buffer, &length, &point); 2264a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ("39292015898194143", buffer.start()); 2274a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 2284a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com v = 4194304.0; 2294a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com BignumDtoa(v, BIGNUM_DTOA_FIXED, 5, buffer, &length, &point); 2304a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_GE(5, length - point); 2314a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com TrimRepresentation(buffer); 2324a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ("4194304", buffer.start()); 2334a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 2344a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com v = 3.3161339052167390562200598e-237; 2354a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com BignumDtoa(v, BIGNUM_DTOA_PRECISION, 19, buffer, &length, &point); 2364a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_GE(19, length); 2374a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com TrimRepresentation(buffer); 2384a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ("3316133905216739056", buffer.start()); 2394a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ(-236, point); 2404a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 2414a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com v = 7.9885183916008099497815232e+191; 2424a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com BignumDtoa(v, BIGNUM_DTOA_PRECISION, 4, buffer, &length, &point); 2434a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_GE(4, length); 2444a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com TrimRepresentation(buffer); 2454a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ("7989", buffer.start()); 2464a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ(192, point); 2474a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 2484a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com v = 1.0000000000000012800000000e+17; 2494a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com BignumDtoa(v, BIGNUM_DTOA_FIXED, 1, buffer, &length, &point); 2504a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_GE(1, length - point); 2514a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com TrimRepresentation(buffer); 2524a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ("100000000000000128", buffer.start()); 2534a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ(18, point); 2544a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com} 2554a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 2564a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 2574a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.comTEST(BignumDtoaGayShortest) { 2584a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com char buffer_container[kBufferSize]; 2594a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com Vector<char> buffer(buffer_container, kBufferSize); 2604a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com int length; 2614a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com int point; 2624a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 2634a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com Vector<const PrecomputedShortest> precomputed = 2644a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com PrecomputedShortestRepresentations(); 2654a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com for (int i = 0; i < precomputed.length(); ++i) { 2664a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com const PrecomputedShortest current_test = precomputed[i]; 2674a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com double v = current_test.v; 2684a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com BignumDtoa(v, BIGNUM_DTOA_SHORTEST, 0, buffer, &length, &point); 2694a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ(current_test.decimal_point, point); 2704a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ(current_test.representation, buffer.start()); 2714a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com } 2724a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com} 2734a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 2744a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 2754a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.comTEST(BignumDtoaGayFixed) { 2764a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com char buffer_container[kBufferSize]; 2774a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com Vector<char> buffer(buffer_container, kBufferSize); 2784a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com int length; 2794a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com int point; 2804a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 2814a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com Vector<const PrecomputedFixed> precomputed = 2824a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com PrecomputedFixedRepresentations(); 2834a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com for (int i = 0; i < precomputed.length(); ++i) { 2844a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com const PrecomputedFixed current_test = precomputed[i]; 2854a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com double v = current_test.v; 2864a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com int number_digits = current_test.number_digits; 2874a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com BignumDtoa(v, BIGNUM_DTOA_FIXED, number_digits, buffer, &length, &point); 2884a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ(current_test.decimal_point, point); 2894a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_GE(number_digits, length - point); 2904a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com TrimRepresentation(buffer); 2914a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ(current_test.representation, buffer.start()); 2924a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com } 2934a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com} 2944a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 2954a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 2964a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.comTEST(BignumDtoaGayPrecision) { 2974a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com char buffer_container[kBufferSize]; 2984a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com Vector<char> buffer(buffer_container, kBufferSize); 2994a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com int length; 3004a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com int point; 3014a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 3024a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com Vector<const PrecomputedPrecision> precomputed = 3034a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com PrecomputedPrecisionRepresentations(); 3044a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com for (int i = 0; i < precomputed.length(); ++i) { 3054a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com const PrecomputedPrecision current_test = precomputed[i]; 3064a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com double v = current_test.v; 3074a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com int number_digits = current_test.number_digits; 3084a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com BignumDtoa(v, BIGNUM_DTOA_PRECISION, number_digits, 3094a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com buffer, &length, &point); 3104a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ(current_test.decimal_point, point); 3114a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_GE(number_digits, length); 3124a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com TrimRepresentation(buffer); 3134a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ(current_test.representation, buffer.start()); 3144a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com } 3154a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com} 316