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