diff options
Diffstat (limited to 'deps/v8/test/cctest/test-fast-dtoa.cc')
-rw-r--r-- | deps/v8/test/cctest/test-fast-dtoa.cc | 183 |
1 files changed, 172 insertions, 11 deletions
diff --git a/deps/v8/test/cctest/test-fast-dtoa.cc b/deps/v8/test/cctest/test-fast-dtoa.cc index 19f5cffb52..30d247658c 100644 --- a/deps/v8/test/cctest/test-fast-dtoa.cc +++ b/deps/v8/test/cctest/test-fast-dtoa.cc @@ -9,13 +9,26 @@ #include "diy-fp.h" #include "double.h" #include "fast-dtoa.h" +#include "gay-precision.h" #include "gay-shortest.h" using namespace v8::internal; static const int kBufferSize = 100; -TEST(FastDtoaVariousDoubles) { + +// Removes trailing '0' digits. +static void TrimRepresentation(Vector<char> representation) { + int len = strlen(representation.start()); + int i; + for (i = len - 1; i >= 0; --i) { + if (representation[i] != '0') break; + } + representation[i + 1] = '\0'; +} + + +TEST(FastDtoaShortestVariousDoubles) { char buffer_container[kBufferSize]; Vector<char> buffer(buffer_container, kBufferSize); int length; @@ -23,38 +36,45 @@ TEST(FastDtoaVariousDoubles) { int status; double min_double = 5e-324; - status = FastDtoa(min_double, buffer, &length, &point); + status = FastDtoa(min_double, FAST_DTOA_SHORTEST, 0, + buffer, &length, &point); CHECK(status); CHECK_EQ("5", buffer.start()); CHECK_EQ(-323, point); double max_double = 1.7976931348623157e308; - status = FastDtoa(max_double, buffer, &length, &point); + status = FastDtoa(max_double, FAST_DTOA_SHORTEST, 0, + buffer, &length, &point); CHECK(status); CHECK_EQ("17976931348623157", buffer.start()); CHECK_EQ(309, point); - status = FastDtoa(4294967272.0, buffer, &length, &point); + status = FastDtoa(4294967272.0, FAST_DTOA_SHORTEST, 0, + buffer, &length, &point); CHECK(status); CHECK_EQ("4294967272", buffer.start()); CHECK_EQ(10, point); - status = FastDtoa(4.1855804968213567e298, buffer, &length, &point); + status = FastDtoa(4.1855804968213567e298, FAST_DTOA_SHORTEST, 0, + buffer, &length, &point); CHECK(status); CHECK_EQ("4185580496821357", buffer.start()); CHECK_EQ(299, point); - status = FastDtoa(5.5626846462680035e-309, buffer, &length, &point); + status = FastDtoa(5.5626846462680035e-309, FAST_DTOA_SHORTEST, 0, + buffer, &length, &point); CHECK(status); CHECK_EQ("5562684646268003", buffer.start()); CHECK_EQ(-308, point); - status = FastDtoa(2147483648.0, buffer, &length, &point); + status = FastDtoa(2147483648.0, FAST_DTOA_SHORTEST, 0, + buffer, &length, &point); CHECK(status); CHECK_EQ("2147483648", buffer.start()); CHECK_EQ(10, point); - status = FastDtoa(3.5844466002796428e+298, buffer, &length, &point); + status = FastDtoa(3.5844466002796428e+298, FAST_DTOA_SHORTEST, 0, + buffer, &length, &point); if (status) { // Not all FastDtoa variants manage to compute this number. CHECK_EQ("35844466002796428", buffer.start()); CHECK_EQ(299, point); @@ -62,7 +82,7 @@ TEST(FastDtoaVariousDoubles) { uint64_t smallest_normal64 = V8_2PART_UINT64_C(0x00100000, 00000000); double v = Double(smallest_normal64).value(); - status = FastDtoa(v, buffer, &length, &point); + status = FastDtoa(v, FAST_DTOA_SHORTEST, 0, buffer, &length, &point); if (status) { CHECK_EQ("22250738585072014", buffer.start()); CHECK_EQ(-307, point); @@ -70,7 +90,7 @@ TEST(FastDtoaVariousDoubles) { uint64_t largest_denormal64 = V8_2PART_UINT64_C(0x000FFFFF, FFFFFFFF); v = Double(largest_denormal64).value(); - status = FastDtoa(v, buffer, &length, &point); + status = FastDtoa(v, FAST_DTOA_SHORTEST, 0, buffer, &length, &point); if (status) { CHECK_EQ("2225073858507201", buffer.start()); CHECK_EQ(-307, point); @@ -78,6 +98,107 @@ TEST(FastDtoaVariousDoubles) { } +TEST(FastDtoaPrecisionVariousDoubles) { + char buffer_container[kBufferSize]; + Vector<char> buffer(buffer_container, kBufferSize); + int length; + int point; + int status; + + status = FastDtoa(1.0, FAST_DTOA_PRECISION, 3, buffer, &length, &point); + CHECK(status); + CHECK_GE(3, length); + TrimRepresentation(buffer); + CHECK_EQ("1", buffer.start()); + CHECK_EQ(1, point); + + status = FastDtoa(1.5, FAST_DTOA_PRECISION, 10, buffer, &length, &point); + if (status) { + CHECK_GE(10, length); + TrimRepresentation(buffer); + CHECK_EQ("15", buffer.start()); + CHECK_EQ(1, point); + } + + double min_double = 5e-324; + status = FastDtoa(min_double, FAST_DTOA_PRECISION, 5, + buffer, &length, &point); + CHECK(status); + CHECK_EQ("49407", buffer.start()); + CHECK_EQ(-323, point); + + double max_double = 1.7976931348623157e308; + status = FastDtoa(max_double, FAST_DTOA_PRECISION, 7, + buffer, &length, &point); + CHECK(status); + CHECK_EQ("1797693", buffer.start()); + CHECK_EQ(309, point); + + status = FastDtoa(4294967272.0, FAST_DTOA_PRECISION, 14, + buffer, &length, &point); + if (status) { + CHECK_GE(14, length); + TrimRepresentation(buffer); + CHECK_EQ("4294967272", buffer.start()); + CHECK_EQ(10, point); + } + + status = FastDtoa(4.1855804968213567e298, FAST_DTOA_PRECISION, 17, + buffer, &length, &point); + CHECK(status); + CHECK_EQ("41855804968213567", buffer.start()); + CHECK_EQ(299, point); + + status = FastDtoa(5.5626846462680035e-309, FAST_DTOA_PRECISION, 1, + buffer, &length, &point); + CHECK(status); + CHECK_EQ("6", buffer.start()); + CHECK_EQ(-308, point); + + status = FastDtoa(2147483648.0, FAST_DTOA_PRECISION, 5, + buffer, &length, &point); + CHECK(status); + CHECK_EQ("21475", buffer.start()); + CHECK_EQ(10, point); + + status = FastDtoa(3.5844466002796428e+298, FAST_DTOA_PRECISION, 10, + buffer, &length, &point); + CHECK(status); + CHECK_GE(10, length); + TrimRepresentation(buffer); + CHECK_EQ("35844466", buffer.start()); + CHECK_EQ(299, point); + + uint64_t smallest_normal64 = V8_2PART_UINT64_C(0x00100000, 00000000); + double v = Double(smallest_normal64).value(); + status = FastDtoa(v, FAST_DTOA_PRECISION, 17, buffer, &length, &point); + CHECK(status); + CHECK_EQ("22250738585072014", buffer.start()); + CHECK_EQ(-307, point); + + uint64_t largest_denormal64 = V8_2PART_UINT64_C(0x000FFFFF, FFFFFFFF); + v = Double(largest_denormal64).value(); + status = FastDtoa(v, FAST_DTOA_PRECISION, 17, buffer, &length, &point); + CHECK(status); + CHECK_GE(20, length); + TrimRepresentation(buffer); + CHECK_EQ("22250738585072009", buffer.start()); + CHECK_EQ(-307, point); + + v = 3.3161339052167390562200598e-237; + status = FastDtoa(v, FAST_DTOA_PRECISION, 18, buffer, &length, &point); + CHECK(status); + CHECK_EQ("331613390521673906", buffer.start()); + CHECK_EQ(-236, point); + + v = 7.9885183916008099497815232e+191; + status = FastDtoa(v, FAST_DTOA_PRECISION, 4, buffer, &length, &point); + CHECK(status); + CHECK_EQ("7989", buffer.start()); + CHECK_EQ(192, point); +} + + TEST(FastDtoaGayShortest) { char buffer_container[kBufferSize]; Vector<char> buffer(buffer_container, kBufferSize); @@ -94,7 +215,7 @@ TEST(FastDtoaGayShortest) { const PrecomputedShortest current_test = precomputed[i]; total++; double v = current_test.v; - status = FastDtoa(v, buffer, &length, &point); + status = FastDtoa(v, FAST_DTOA_SHORTEST, 0, buffer, &length, &point); CHECK_GE(kFastDtoaMaximalLength, length); if (!status) continue; if (length == kFastDtoaMaximalLength) needed_max_length = true; @@ -105,3 +226,43 @@ TEST(FastDtoaGayShortest) { CHECK_GT(succeeded*1.0/total, 0.99); CHECK(needed_max_length); } + + +TEST(FastDtoaGayPrecision) { + char buffer_container[kBufferSize]; + Vector<char> buffer(buffer_container, kBufferSize); + bool status; + int length; + int point; + int succeeded = 0; + int total = 0; + // Count separately for entries with less than 15 requested digits. + int succeeded_15 = 0; + int total_15 = 0; + + Vector<const PrecomputedPrecision> precomputed = + PrecomputedPrecisionRepresentations(); + for (int i = 0; i < precomputed.length(); ++i) { + const PrecomputedPrecision current_test = precomputed[i]; + double v = current_test.v; + int number_digits = current_test.number_digits; + total++; + if (number_digits <= 15) total_15++; + status = FastDtoa(v, FAST_DTOA_PRECISION, number_digits, + buffer, &length, &point); + CHECK_GE(number_digits, length); + if (!status) continue; + succeeded++; + if (number_digits <= 15) succeeded_15++; + TrimRepresentation(buffer); + CHECK_EQ(current_test.decimal_point, point); + CHECK_EQ(current_test.representation, buffer.start()); + } + // The precomputed numbers contain many entries with many requested + // digits. These have a high failure rate and we therefore expect a lower + // success rate than for the shortest representation. + CHECK_GT(succeeded*1.0/total, 0.85); + // However with less than 15 digits almost the algorithm should almost always + // succeed. + CHECK_GT(succeeded_15*1.0/total_15, 0.9999); +} |