12e5b6d6dSopenharmony_ci// Copyright 2006-2008 the V8 project authors. All rights reserved. 22e5b6d6dSopenharmony_ci// Redistribution and use in source and binary forms, with or without 32e5b6d6dSopenharmony_ci// modification, are permitted provided that the following conditions are 42e5b6d6dSopenharmony_ci// met: 52e5b6d6dSopenharmony_ci// 62e5b6d6dSopenharmony_ci// * Redistributions of source code must retain the above copyright 72e5b6d6dSopenharmony_ci// notice, this list of conditions and the following disclaimer. 82e5b6d6dSopenharmony_ci// * Redistributions in binary form must reproduce the above 92e5b6d6dSopenharmony_ci// copyright notice, this list of conditions and the following 102e5b6d6dSopenharmony_ci// disclaimer in the documentation and/or other materials provided 112e5b6d6dSopenharmony_ci// with the distribution. 122e5b6d6dSopenharmony_ci// * Neither the name of Google Inc. nor the names of its 132e5b6d6dSopenharmony_ci// contributors may be used to endorse or promote products derived 142e5b6d6dSopenharmony_ci// from this software without specific prior written permission. 152e5b6d6dSopenharmony_ci// 162e5b6d6dSopenharmony_ci// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 172e5b6d6dSopenharmony_ci// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 182e5b6d6dSopenharmony_ci// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 192e5b6d6dSopenharmony_ci// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 202e5b6d6dSopenharmony_ci// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 212e5b6d6dSopenharmony_ci// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 222e5b6d6dSopenharmony_ci// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 232e5b6d6dSopenharmony_ci// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 242e5b6d6dSopenharmony_ci// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 252e5b6d6dSopenharmony_ci// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 262e5b6d6dSopenharmony_ci// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 272e5b6d6dSopenharmony_ci 282e5b6d6dSopenharmony_ci#include <stdlib.h> 292e5b6d6dSopenharmony_ci 302e5b6d6dSopenharmony_ci#include "double-conversion/bignum.h" 312e5b6d6dSopenharmony_ci#include "cctest.h" 322e5b6d6dSopenharmony_ci#include "double-conversion/diy-fp.h" 332e5b6d6dSopenharmony_ci#include "double-conversion/ieee.h" 342e5b6d6dSopenharmony_ci#include "double-conversion/strtod.h" 352e5b6d6dSopenharmony_ci#include "double-conversion/utils.h" 362e5b6d6dSopenharmony_ci 372e5b6d6dSopenharmony_ciusing namespace double_conversion; 382e5b6d6dSopenharmony_ci 392e5b6d6dSopenharmony_cistatic Vector<const char> StringToVector(const char* str) { 402e5b6d6dSopenharmony_ci int len = static_cast<int>(strlen(str)); 412e5b6d6dSopenharmony_ci return Vector<const char>(str, len); 422e5b6d6dSopenharmony_ci} 432e5b6d6dSopenharmony_ci 442e5b6d6dSopenharmony_ci 452e5b6d6dSopenharmony_cistatic double StrtodChar(const char* str, int exponent) { 462e5b6d6dSopenharmony_ci return Strtod(StringToVector(str), exponent); 472e5b6d6dSopenharmony_ci} 482e5b6d6dSopenharmony_ci 492e5b6d6dSopenharmony_ci 502e5b6d6dSopenharmony_cistatic double StrtodTrimmedChar(const char* str, int exponent) { 512e5b6d6dSopenharmony_ci return StrtodTrimmed(StringToVector(str), exponent); 522e5b6d6dSopenharmony_ci} 532e5b6d6dSopenharmony_ci 542e5b6d6dSopenharmony_ci 552e5b6d6dSopenharmony_cistatic float StrtofChar(const char* str, int exponent) { 562e5b6d6dSopenharmony_ci return Strtof(StringToVector(str), exponent); 572e5b6d6dSopenharmony_ci} 582e5b6d6dSopenharmony_ci 592e5b6d6dSopenharmony_cistatic float StrtofTrimmedChar(const char* str, int exponent) { 602e5b6d6dSopenharmony_ci return StrtofTrimmed(StringToVector(str), exponent); 612e5b6d6dSopenharmony_ci} 622e5b6d6dSopenharmony_ci 632e5b6d6dSopenharmony_ci 642e5b6d6dSopenharmony_ciTEST(Strtod) { 652e5b6d6dSopenharmony_ci Vector<const char> vector; 662e5b6d6dSopenharmony_ci 672e5b6d6dSopenharmony_ci vector = StringToVector("0"); 682e5b6d6dSopenharmony_ci CHECK_EQ(0.0, Strtod(vector, 1)); 692e5b6d6dSopenharmony_ci CHECK_EQ(0.0, Strtod(vector, 2)); 702e5b6d6dSopenharmony_ci CHECK_EQ(0.0, Strtod(vector, -2)); 712e5b6d6dSopenharmony_ci CHECK_EQ(0.0, Strtod(vector, -999)); 722e5b6d6dSopenharmony_ci CHECK_EQ(0.0, Strtod(vector, +999)); 732e5b6d6dSopenharmony_ci 742e5b6d6dSopenharmony_ci vector = StringToVector("1"); 752e5b6d6dSopenharmony_ci CHECK_EQ(1.0, Strtod(vector, 0)); 762e5b6d6dSopenharmony_ci CHECK_EQ(10.0, Strtod(vector, 1)); 772e5b6d6dSopenharmony_ci CHECK_EQ(100.0, Strtod(vector, 2)); 782e5b6d6dSopenharmony_ci CHECK_EQ(1e20, Strtod(vector, 20)); 792e5b6d6dSopenharmony_ci CHECK_EQ(1e22, Strtod(vector, 22)); 802e5b6d6dSopenharmony_ci CHECK_EQ(1e23, Strtod(vector, 23)); 812e5b6d6dSopenharmony_ci CHECK_EQ(1e35, Strtod(vector, 35)); 822e5b6d6dSopenharmony_ci CHECK_EQ(1e36, Strtod(vector, 36)); 832e5b6d6dSopenharmony_ci CHECK_EQ(1e37, Strtod(vector, 37)); 842e5b6d6dSopenharmony_ci CHECK_EQ(1e-1, Strtod(vector, -1)); 852e5b6d6dSopenharmony_ci CHECK_EQ(1e-2, Strtod(vector, -2)); 862e5b6d6dSopenharmony_ci CHECK_EQ(1e-5, Strtod(vector, -5)); 872e5b6d6dSopenharmony_ci CHECK_EQ(1e-20, Strtod(vector, -20)); 882e5b6d6dSopenharmony_ci CHECK_EQ(1e-22, Strtod(vector, -22)); 892e5b6d6dSopenharmony_ci CHECK_EQ(1e-23, Strtod(vector, -23)); 902e5b6d6dSopenharmony_ci CHECK_EQ(1e-25, Strtod(vector, -25)); 912e5b6d6dSopenharmony_ci CHECK_EQ(1e-39, Strtod(vector, -39)); 922e5b6d6dSopenharmony_ci 932e5b6d6dSopenharmony_ci vector = StringToVector("2"); 942e5b6d6dSopenharmony_ci CHECK_EQ(2.0, Strtod(vector, 0)); 952e5b6d6dSopenharmony_ci CHECK_EQ(20.0, Strtod(vector, 1)); 962e5b6d6dSopenharmony_ci CHECK_EQ(200.0, Strtod(vector, 2)); 972e5b6d6dSopenharmony_ci CHECK_EQ(2e20, Strtod(vector, 20)); 982e5b6d6dSopenharmony_ci CHECK_EQ(2e22, Strtod(vector, 22)); 992e5b6d6dSopenharmony_ci CHECK_EQ(2e23, Strtod(vector, 23)); 1002e5b6d6dSopenharmony_ci CHECK_EQ(2e35, Strtod(vector, 35)); 1012e5b6d6dSopenharmony_ci CHECK_EQ(2e36, Strtod(vector, 36)); 1022e5b6d6dSopenharmony_ci CHECK_EQ(2e37, Strtod(vector, 37)); 1032e5b6d6dSopenharmony_ci CHECK_EQ(2e-1, Strtod(vector, -1)); 1042e5b6d6dSopenharmony_ci CHECK_EQ(2e-2, Strtod(vector, -2)); 1052e5b6d6dSopenharmony_ci CHECK_EQ(2e-5, Strtod(vector, -5)); 1062e5b6d6dSopenharmony_ci CHECK_EQ(2e-20, Strtod(vector, -20)); 1072e5b6d6dSopenharmony_ci CHECK_EQ(2e-22, Strtod(vector, -22)); 1082e5b6d6dSopenharmony_ci CHECK_EQ(2e-23, Strtod(vector, -23)); 1092e5b6d6dSopenharmony_ci CHECK_EQ(2e-25, Strtod(vector, -25)); 1102e5b6d6dSopenharmony_ci CHECK_EQ(2e-39, Strtod(vector, -39)); 1112e5b6d6dSopenharmony_ci 1122e5b6d6dSopenharmony_ci vector = StringToVector("9"); 1132e5b6d6dSopenharmony_ci CHECK_EQ(9.0, Strtod(vector, 0)); 1142e5b6d6dSopenharmony_ci CHECK_EQ(90.0, Strtod(vector, 1)); 1152e5b6d6dSopenharmony_ci CHECK_EQ(900.0, Strtod(vector, 2)); 1162e5b6d6dSopenharmony_ci CHECK_EQ(9e20, Strtod(vector, 20)); 1172e5b6d6dSopenharmony_ci CHECK_EQ(9e22, Strtod(vector, 22)); 1182e5b6d6dSopenharmony_ci CHECK_EQ(9e23, Strtod(vector, 23)); 1192e5b6d6dSopenharmony_ci CHECK_EQ(9e35, Strtod(vector, 35)); 1202e5b6d6dSopenharmony_ci CHECK_EQ(9e36, Strtod(vector, 36)); 1212e5b6d6dSopenharmony_ci CHECK_EQ(9e37, Strtod(vector, 37)); 1222e5b6d6dSopenharmony_ci CHECK_EQ(9e-1, Strtod(vector, -1)); 1232e5b6d6dSopenharmony_ci CHECK_EQ(9e-2, Strtod(vector, -2)); 1242e5b6d6dSopenharmony_ci CHECK_EQ(9e-5, Strtod(vector, -5)); 1252e5b6d6dSopenharmony_ci CHECK_EQ(9e-20, Strtod(vector, -20)); 1262e5b6d6dSopenharmony_ci CHECK_EQ(9e-22, Strtod(vector, -22)); 1272e5b6d6dSopenharmony_ci CHECK_EQ(9e-23, Strtod(vector, -23)); 1282e5b6d6dSopenharmony_ci CHECK_EQ(9e-25, Strtod(vector, -25)); 1292e5b6d6dSopenharmony_ci CHECK_EQ(9e-39, Strtod(vector, -39)); 1302e5b6d6dSopenharmony_ci 1312e5b6d6dSopenharmony_ci vector = StringToVector("12345"); 1322e5b6d6dSopenharmony_ci CHECK_EQ(12345.0, Strtod(vector, 0)); 1332e5b6d6dSopenharmony_ci CHECK_EQ(123450.0, Strtod(vector, 1)); 1342e5b6d6dSopenharmony_ci CHECK_EQ(1234500.0, Strtod(vector, 2)); 1352e5b6d6dSopenharmony_ci CHECK_EQ(12345e20, Strtod(vector, 20)); 1362e5b6d6dSopenharmony_ci CHECK_EQ(12345e22, Strtod(vector, 22)); 1372e5b6d6dSopenharmony_ci CHECK_EQ(12345e23, Strtod(vector, 23)); 1382e5b6d6dSopenharmony_ci CHECK_EQ(12345e30, Strtod(vector, 30)); 1392e5b6d6dSopenharmony_ci CHECK_EQ(12345e31, Strtod(vector, 31)); 1402e5b6d6dSopenharmony_ci CHECK_EQ(12345e32, Strtod(vector, 32)); 1412e5b6d6dSopenharmony_ci CHECK_EQ(12345e35, Strtod(vector, 35)); 1422e5b6d6dSopenharmony_ci CHECK_EQ(12345e36, Strtod(vector, 36)); 1432e5b6d6dSopenharmony_ci CHECK_EQ(12345e37, Strtod(vector, 37)); 1442e5b6d6dSopenharmony_ci CHECK_EQ(12345e-1, Strtod(vector, -1)); 1452e5b6d6dSopenharmony_ci CHECK_EQ(12345e-2, Strtod(vector, -2)); 1462e5b6d6dSopenharmony_ci CHECK_EQ(12345e-5, Strtod(vector, -5)); 1472e5b6d6dSopenharmony_ci CHECK_EQ(12345e-20, Strtod(vector, -20)); 1482e5b6d6dSopenharmony_ci CHECK_EQ(12345e-22, Strtod(vector, -22)); 1492e5b6d6dSopenharmony_ci CHECK_EQ(12345e-23, Strtod(vector, -23)); 1502e5b6d6dSopenharmony_ci CHECK_EQ(12345e-25, Strtod(vector, -25)); 1512e5b6d6dSopenharmony_ci CHECK_EQ(12345e-39, Strtod(vector, -39)); 1522e5b6d6dSopenharmony_ci 1532e5b6d6dSopenharmony_ci vector = StringToVector("12345678901234"); 1542e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234.0, Strtod(vector, 0)); 1552e5b6d6dSopenharmony_ci CHECK_EQ(123456789012340.0, Strtod(vector, 1)); 1562e5b6d6dSopenharmony_ci CHECK_EQ(1234567890123400.0, Strtod(vector, 2)); 1572e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e20, Strtod(vector, 20)); 1582e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e22, Strtod(vector, 22)); 1592e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e23, Strtod(vector, 23)); 1602e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e30, Strtod(vector, 30)); 1612e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e31, Strtod(vector, 31)); 1622e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e32, Strtod(vector, 32)); 1632e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e35, Strtod(vector, 35)); 1642e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e36, Strtod(vector, 36)); 1652e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e37, Strtod(vector, 37)); 1662e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e-1, Strtod(vector, -1)); 1672e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e-2, Strtod(vector, -2)); 1682e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e-5, Strtod(vector, -5)); 1692e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e-20, Strtod(vector, -20)); 1702e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e-22, Strtod(vector, -22)); 1712e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e-23, Strtod(vector, -23)); 1722e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e-25, Strtod(vector, -25)); 1732e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e-39, Strtod(vector, -39)); 1742e5b6d6dSopenharmony_ci 1752e5b6d6dSopenharmony_ci vector = StringToVector("123456789012345"); 1762e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345.0, Strtod(vector, 0)); 1772e5b6d6dSopenharmony_ci CHECK_EQ(1234567890123450.0, Strtod(vector, 1)); 1782e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234500.0, Strtod(vector, 2)); 1792e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345e20, Strtod(vector, 20)); 1802e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345e22, Strtod(vector, 22)); 1812e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345e23, Strtod(vector, 23)); 1822e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345e35, Strtod(vector, 35)); 1832e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345e36, Strtod(vector, 36)); 1842e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345e37, Strtod(vector, 37)); 1852e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345e39, Strtod(vector, 39)); 1862e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345e-1, Strtod(vector, -1)); 1872e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345e-2, Strtod(vector, -2)); 1882e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345e-5, Strtod(vector, -5)); 1892e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345e-20, Strtod(vector, -20)); 1902e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345e-22, Strtod(vector, -22)); 1912e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345e-23, Strtod(vector, -23)); 1922e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345e-25, Strtod(vector, -25)); 1932e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345e-39, Strtod(vector, -39)); 1942e5b6d6dSopenharmony_ci 1952e5b6d6dSopenharmony_ci CHECK_EQ(0.0, StrtodChar("0", 12345)); 1962e5b6d6dSopenharmony_ci CHECK_EQ(0.0, StrtodChar("", 1324)); 1972e5b6d6dSopenharmony_ci CHECK_EQ(0.0, StrtodChar("000000000", 123)); 1982e5b6d6dSopenharmony_ci CHECK_EQ(0.0, StrtodChar("2", -324)); 1992e5b6d6dSopenharmony_ci CHECK_EQ(4e-324, StrtodChar("3", -324)); 2002e5b6d6dSopenharmony_ci // It would be more readable to put non-zero literals on the left side (i.e. 2012e5b6d6dSopenharmony_ci // CHECK_EQ(1e-325, StrtodChar("1", -325))), but then Gcc complains that 2022e5b6d6dSopenharmony_ci // they are truncated to zero. 2032e5b6d6dSopenharmony_ci CHECK_EQ(0.0, StrtodChar("1", -325)); 2042e5b6d6dSopenharmony_ci CHECK_EQ(0.0, StrtodChar("1", -325)); 2052e5b6d6dSopenharmony_ci CHECK_EQ(0.0, StrtodChar("20000", -328)); 2062e5b6d6dSopenharmony_ci CHECK_EQ(40000e-328, StrtodChar("30000", -328)); 2072e5b6d6dSopenharmony_ci CHECK_EQ(0.0, StrtodChar("10000", -329)); 2082e5b6d6dSopenharmony_ci CHECK_EQ(0.0, StrtodChar("90000", -329)); 2092e5b6d6dSopenharmony_ci CHECK_EQ(0.0, StrtodChar("000000001", -325)); 2102e5b6d6dSopenharmony_ci CHECK_EQ(0.0, StrtodChar("000000001", -325)); 2112e5b6d6dSopenharmony_ci CHECK_EQ(0.0, StrtodChar("0000000020000", -328)); 2122e5b6d6dSopenharmony_ci CHECK_EQ(40000e-328, StrtodChar("00000030000", -328)); 2132e5b6d6dSopenharmony_ci CHECK_EQ(0.0, StrtodChar("0000000010000", -329)); 2142e5b6d6dSopenharmony_ci CHECK_EQ(0.0, StrtodChar("0000000090000", -329)); 2152e5b6d6dSopenharmony_ci 2162e5b6d6dSopenharmony_ci // It would be more readable to put the literals (and not Double::Infinity()) 2172e5b6d6dSopenharmony_ci // on the left side (i.e. CHECK_EQ(1e309, StrtodChar("1", 309))), but then Gcc 2182e5b6d6dSopenharmony_ci // complains that the floating constant exceeds range of 'double'. 2192e5b6d6dSopenharmony_ci CHECK_EQ(Double::Infinity(), StrtodChar("1", 309)); 2202e5b6d6dSopenharmony_ci CHECK_EQ(1e308, StrtodChar("1", 308)); 2212e5b6d6dSopenharmony_ci CHECK_EQ(1234e305, StrtodChar("1234", 305)); 2222e5b6d6dSopenharmony_ci CHECK_EQ(1234e304, StrtodChar("1234", 304)); 2232e5b6d6dSopenharmony_ci CHECK_EQ(Double::Infinity(), StrtodChar("18", 307)); 2242e5b6d6dSopenharmony_ci CHECK_EQ(17e307, StrtodChar("17", 307)); 2252e5b6d6dSopenharmony_ci CHECK_EQ(Double::Infinity(), StrtodChar("0000001", 309)); 2262e5b6d6dSopenharmony_ci CHECK_EQ(1e308, StrtodChar("00000001", 308)); 2272e5b6d6dSopenharmony_ci CHECK_EQ(1234e305, StrtodChar("00000001234", 305)); 2282e5b6d6dSopenharmony_ci CHECK_EQ(1234e304, StrtodChar("000000001234", 304)); 2292e5b6d6dSopenharmony_ci CHECK_EQ(Double::Infinity(), StrtodChar("0000000018", 307)); 2302e5b6d6dSopenharmony_ci CHECK_EQ(17e307, StrtodChar("0000000017", 307)); 2312e5b6d6dSopenharmony_ci CHECK_EQ(Double::Infinity(), StrtodChar("1000000", 303)); 2322e5b6d6dSopenharmony_ci CHECK_EQ(1e308, StrtodChar("100000", 303)); 2332e5b6d6dSopenharmony_ci CHECK_EQ(1234e305, StrtodChar("123400000", 300)); 2342e5b6d6dSopenharmony_ci CHECK_EQ(1234e304, StrtodChar("123400000", 299)); 2352e5b6d6dSopenharmony_ci CHECK_EQ(Double::Infinity(), StrtodChar("180000000", 300)); 2362e5b6d6dSopenharmony_ci CHECK_EQ(17e307, StrtodChar("170000000", 300)); 2372e5b6d6dSopenharmony_ci CHECK_EQ(Double::Infinity(), StrtodChar("00000001000000", 303)); 2382e5b6d6dSopenharmony_ci CHECK_EQ(1e308, StrtodChar("000000000000100000", 303)); 2392e5b6d6dSopenharmony_ci CHECK_EQ(1234e305, StrtodChar("00000000123400000", 300)); 2402e5b6d6dSopenharmony_ci CHECK_EQ(1234e304, StrtodChar("0000000123400000", 299)); 2412e5b6d6dSopenharmony_ci CHECK_EQ(Double::Infinity(), StrtodChar("00000000180000000", 300)); 2422e5b6d6dSopenharmony_ci CHECK_EQ(17e307, StrtodChar("00000000170000000", 300)); 2432e5b6d6dSopenharmony_ci CHECK_EQ(1.7976931348623157E+308, StrtodChar("17976931348623157", 292)); 2442e5b6d6dSopenharmony_ci CHECK_EQ(1.7976931348623158E+308, StrtodChar("17976931348623158", 292)); 2452e5b6d6dSopenharmony_ci CHECK_EQ(Double::Infinity(), StrtodChar("17976931348623159", 292)); 2462e5b6d6dSopenharmony_ci 2472e5b6d6dSopenharmony_ci // The following number is the result of 89255.0/1e-22. Both floating-point 2482e5b6d6dSopenharmony_ci // numbers can be accurately represented with doubles. However on Linux,x86 2492e5b6d6dSopenharmony_ci // the floating-point stack is set to 80bits and the double-rounding 2502e5b6d6dSopenharmony_ci // introduces an error. 2512e5b6d6dSopenharmony_ci CHECK_EQ(89255e-22, StrtodChar("89255", -22)); 2522e5b6d6dSopenharmony_ci 2532e5b6d6dSopenharmony_ci // Some random values. 2542e5b6d6dSopenharmony_ci CHECK_EQ(358416272e-33, StrtodChar("358416272", -33)); 2552e5b6d6dSopenharmony_ci CHECK_EQ(104110013277974872254e-225, 2562e5b6d6dSopenharmony_ci StrtodChar("104110013277974872254", -225)); 2572e5b6d6dSopenharmony_ci 2582e5b6d6dSopenharmony_ci CHECK_EQ(123456789e108, StrtodChar("123456789", 108)); 2592e5b6d6dSopenharmony_ci CHECK_EQ(123456789e109, StrtodChar("123456789", 109)); 2602e5b6d6dSopenharmony_ci CHECK_EQ(123456789e110, StrtodChar("123456789", 110)); 2612e5b6d6dSopenharmony_ci CHECK_EQ(123456789e111, StrtodChar("123456789", 111)); 2622e5b6d6dSopenharmony_ci CHECK_EQ(123456789e112, StrtodChar("123456789", 112)); 2632e5b6d6dSopenharmony_ci CHECK_EQ(123456789e113, StrtodChar("123456789", 113)); 2642e5b6d6dSopenharmony_ci CHECK_EQ(123456789e114, StrtodChar("123456789", 114)); 2652e5b6d6dSopenharmony_ci CHECK_EQ(123456789e115, StrtodChar("123456789", 115)); 2662e5b6d6dSopenharmony_ci 2672e5b6d6dSopenharmony_ci CHECK_EQ(1234567890123456789012345e108, 2682e5b6d6dSopenharmony_ci StrtodChar("1234567890123456789012345", 108)); 2692e5b6d6dSopenharmony_ci CHECK_EQ(1234567890123456789012345e109, 2702e5b6d6dSopenharmony_ci StrtodChar("1234567890123456789012345", 109)); 2712e5b6d6dSopenharmony_ci CHECK_EQ(1234567890123456789012345e110, 2722e5b6d6dSopenharmony_ci StrtodChar("1234567890123456789012345", 110)); 2732e5b6d6dSopenharmony_ci CHECK_EQ(1234567890123456789012345e111, 2742e5b6d6dSopenharmony_ci StrtodChar("1234567890123456789012345", 111)); 2752e5b6d6dSopenharmony_ci CHECK_EQ(1234567890123456789012345e112, 2762e5b6d6dSopenharmony_ci StrtodChar("1234567890123456789012345", 112)); 2772e5b6d6dSopenharmony_ci CHECK_EQ(1234567890123456789012345e113, 2782e5b6d6dSopenharmony_ci StrtodChar("1234567890123456789012345", 113)); 2792e5b6d6dSopenharmony_ci CHECK_EQ(1234567890123456789012345e114, 2802e5b6d6dSopenharmony_ci StrtodChar("1234567890123456789012345", 114)); 2812e5b6d6dSopenharmony_ci CHECK_EQ(1234567890123456789012345e115, 2822e5b6d6dSopenharmony_ci StrtodChar("1234567890123456789012345", 115)); 2832e5b6d6dSopenharmony_ci 2842e5b6d6dSopenharmony_ci CHECK_EQ(1234567890123456789052345e108, 2852e5b6d6dSopenharmony_ci StrtodChar("1234567890123456789052345", 108)); 2862e5b6d6dSopenharmony_ci CHECK_EQ(1234567890123456789052345e109, 2872e5b6d6dSopenharmony_ci StrtodChar("1234567890123456789052345", 109)); 2882e5b6d6dSopenharmony_ci CHECK_EQ(1234567890123456789052345e110, 2892e5b6d6dSopenharmony_ci StrtodChar("1234567890123456789052345", 110)); 2902e5b6d6dSopenharmony_ci CHECK_EQ(1234567890123456789052345e111, 2912e5b6d6dSopenharmony_ci StrtodChar("1234567890123456789052345", 111)); 2922e5b6d6dSopenharmony_ci CHECK_EQ(1234567890123456789052345e112, 2932e5b6d6dSopenharmony_ci StrtodChar("1234567890123456789052345", 112)); 2942e5b6d6dSopenharmony_ci CHECK_EQ(1234567890123456789052345e113, 2952e5b6d6dSopenharmony_ci StrtodChar("1234567890123456789052345", 113)); 2962e5b6d6dSopenharmony_ci CHECK_EQ(1234567890123456789052345e114, 2972e5b6d6dSopenharmony_ci StrtodChar("1234567890123456789052345", 114)); 2982e5b6d6dSopenharmony_ci CHECK_EQ(1234567890123456789052345e115, 2992e5b6d6dSopenharmony_ci StrtodChar("1234567890123456789052345", 115)); 3002e5b6d6dSopenharmony_ci 3012e5b6d6dSopenharmony_ci CHECK_EQ(5.445618932859895e-255, 3022e5b6d6dSopenharmony_ci StrtodChar("5445618932859895362967233318697132813618813095743952975" 3032e5b6d6dSopenharmony_ci "4392982234069699615600475529427176366709107287468930197" 3042e5b6d6dSopenharmony_ci "8628345413991790019316974825934906752493984055268219809" 3052e5b6d6dSopenharmony_ci "5012176093045431437495773903922425632551857520884625114" 3062e5b6d6dSopenharmony_ci "6241265881735209066709685420744388526014389929047617597" 3072e5b6d6dSopenharmony_ci "0302268848374508109029268898695825171158085457567481507" 3082e5b6d6dSopenharmony_ci "4162979705098246243690189880319928315307816832576838178" 3092e5b6d6dSopenharmony_ci "2563074014542859888710209237525873301724479666744537857" 3102e5b6d6dSopenharmony_ci "9026553346649664045621387124193095870305991178772256504" 3112e5b6d6dSopenharmony_ci "4368663670643970181259143319016472430928902201239474588" 3122e5b6d6dSopenharmony_ci "1392338901353291306607057623202353588698746085415097902" 3132e5b6d6dSopenharmony_ci "6640064319118728664842287477491068264828851624402189317" 3142e5b6d6dSopenharmony_ci "2769161449825765517353755844373640588822904791244190695" 3152e5b6d6dSopenharmony_ci "2998382932630754670573838138825217065450843010498555058" 3162e5b6d6dSopenharmony_ci "88186560731", -1035)); 3172e5b6d6dSopenharmony_ci 3182e5b6d6dSopenharmony_ci // Boundary cases. Boundaries themselves should round to even. 3192e5b6d6dSopenharmony_ci // 3202e5b6d6dSopenharmony_ci // 0x1FFFFFFFFFFFF * 2^3 = 72057594037927928 3212e5b6d6dSopenharmony_ci // next: 72057594037927936 3222e5b6d6dSopenharmony_ci // boundary: 72057594037927932 should round up. 3232e5b6d6dSopenharmony_ci CHECK_EQ(72057594037927928.0, StrtodChar("72057594037927928", 0)); 3242e5b6d6dSopenharmony_ci CHECK_EQ(72057594037927936.0, StrtodChar("72057594037927936", 0)); 3252e5b6d6dSopenharmony_ci CHECK_EQ(72057594037927936.0, StrtodChar("72057594037927932", 0)); 3262e5b6d6dSopenharmony_ci CHECK_EQ(72057594037927928.0, StrtodChar("7205759403792793199999", -5)); 3272e5b6d6dSopenharmony_ci CHECK_EQ(72057594037927936.0, StrtodChar("7205759403792793200001", -5)); 3282e5b6d6dSopenharmony_ci 3292e5b6d6dSopenharmony_ci // 0x1FFFFFFFFFFFF * 2^10 = 9223372036854774784 3302e5b6d6dSopenharmony_ci // next: 9223372036854775808 3312e5b6d6dSopenharmony_ci // boundary: 9223372036854775296 should round up. 3322e5b6d6dSopenharmony_ci CHECK_EQ(9223372036854774784.0, StrtodChar("9223372036854774784", 0)); 3332e5b6d6dSopenharmony_ci CHECK_EQ(9223372036854775808.0, StrtodChar("9223372036854775808", 0)); 3342e5b6d6dSopenharmony_ci CHECK_EQ(9223372036854775808.0, StrtodChar("9223372036854775296", 0)); 3352e5b6d6dSopenharmony_ci CHECK_EQ(9223372036854774784.0, StrtodChar("922337203685477529599999", -5)); 3362e5b6d6dSopenharmony_ci CHECK_EQ(9223372036854775808.0, StrtodChar("922337203685477529600001", -5)); 3372e5b6d6dSopenharmony_ci 3382e5b6d6dSopenharmony_ci // 0x1FFFFFFFFFFFF * 2^50 = 10141204801825834086073718800384 3392e5b6d6dSopenharmony_ci // next: 10141204801825835211973625643008 3402e5b6d6dSopenharmony_ci // boundary: 10141204801825834649023672221696 should round up. 3412e5b6d6dSopenharmony_ci CHECK_EQ(10141204801825834086073718800384.0, 3422e5b6d6dSopenharmony_ci StrtodChar("10141204801825834086073718800384", 0)); 3432e5b6d6dSopenharmony_ci CHECK_EQ(10141204801825835211973625643008.0, 3442e5b6d6dSopenharmony_ci StrtodChar("10141204801825835211973625643008", 0)); 3452e5b6d6dSopenharmony_ci CHECK_EQ(10141204801825835211973625643008.0, 3462e5b6d6dSopenharmony_ci StrtodChar("10141204801825834649023672221696", 0)); 3472e5b6d6dSopenharmony_ci CHECK_EQ(10141204801825834086073718800384.0, 3482e5b6d6dSopenharmony_ci StrtodChar("1014120480182583464902367222169599999", -5)); 3492e5b6d6dSopenharmony_ci CHECK_EQ(10141204801825835211973625643008.0, 3502e5b6d6dSopenharmony_ci StrtodChar("1014120480182583464902367222169600001", -5)); 3512e5b6d6dSopenharmony_ci 3522e5b6d6dSopenharmony_ci // 0x1FFFFFFFFFFFF * 2^99 = 5708990770823838890407843763683279797179383808 3532e5b6d6dSopenharmony_ci // next: 5708990770823839524233143877797980545530986496 3542e5b6d6dSopenharmony_ci // boundary: 5708990770823839207320493820740630171355185152 3552e5b6d6dSopenharmony_ci // The boundary should round up. 3562e5b6d6dSopenharmony_ci CHECK_EQ(5708990770823838890407843763683279797179383808.0, 3572e5b6d6dSopenharmony_ci StrtodChar("5708990770823838890407843763683279797179383808", 0)); 3582e5b6d6dSopenharmony_ci CHECK_EQ(5708990770823839524233143877797980545530986496.0, 3592e5b6d6dSopenharmony_ci StrtodChar("5708990770823839524233143877797980545530986496", 0)); 3602e5b6d6dSopenharmony_ci CHECK_EQ(5708990770823839524233143877797980545530986496.0, 3612e5b6d6dSopenharmony_ci StrtodChar("5708990770823839207320493820740630171355185152", 0)); 3622e5b6d6dSopenharmony_ci CHECK_EQ(5708990770823838890407843763683279797179383808.0, 3632e5b6d6dSopenharmony_ci StrtodChar("5708990770823839207320493820740630171355185151999", -3)); 3642e5b6d6dSopenharmony_ci CHECK_EQ(5708990770823839524233143877797980545530986496.0, 3652e5b6d6dSopenharmony_ci StrtodChar("5708990770823839207320493820740630171355185152001", -3)); 3662e5b6d6dSopenharmony_ci 3672e5b6d6dSopenharmony_ci // The following test-cases got some public attention in early 2011 when they 3682e5b6d6dSopenharmony_ci // sent Java and PHP into an infinite loop. 3692e5b6d6dSopenharmony_ci CHECK_EQ(2.225073858507201e-308, StrtodChar("22250738585072011", -324)); 3702e5b6d6dSopenharmony_ci CHECK_EQ(2.22507385850720138309e-308, 3712e5b6d6dSopenharmony_ci StrtodChar("22250738585072011360574097967091319759348195463516456480" 3722e5b6d6dSopenharmony_ci "23426109724822222021076945516529523908135087914149158913" 3732e5b6d6dSopenharmony_ci "03962110687008643869459464552765720740782062174337998814" 3742e5b6d6dSopenharmony_ci "10632673292535522868813721490129811224514518898490572223" 3752e5b6d6dSopenharmony_ci "07285255133155755015914397476397983411801999323962548289" 3762e5b6d6dSopenharmony_ci "01710708185069063066665599493827577257201576306269066333" 3772e5b6d6dSopenharmony_ci "26475653000092458883164330377797918696120494973903778297" 3782e5b6d6dSopenharmony_ci "04905051080609940730262937128958950003583799967207254304" 3792e5b6d6dSopenharmony_ci "36028407889577179615094551674824347103070260914462157228" 3802e5b6d6dSopenharmony_ci "98802581825451803257070188608721131280795122334262883686" 3812e5b6d6dSopenharmony_ci "22321503775666622503982534335974568884423900265498198385" 3822e5b6d6dSopenharmony_ci "48794829220689472168983109969836584681402285424333066033" 3832e5b6d6dSopenharmony_ci "98508864458040010349339704275671864433837704860378616227" 3842e5b6d6dSopenharmony_ci "71738545623065874679014086723327636718751", -1076)); 3852e5b6d6dSopenharmony_ci} 3862e5b6d6dSopenharmony_ci 3872e5b6d6dSopenharmony_ci 3882e5b6d6dSopenharmony_ciTEST(StrtodTrimmed) { 3892e5b6d6dSopenharmony_ci Vector<const char> vector; 3902e5b6d6dSopenharmony_ci 3912e5b6d6dSopenharmony_ci vector = StringToVector("1"); 3922e5b6d6dSopenharmony_ci CHECK_EQ(1.0, StrtodTrimmed(vector, 0)); 3932e5b6d6dSopenharmony_ci CHECK_EQ(10.0, StrtodTrimmed(vector, 1)); 3942e5b6d6dSopenharmony_ci CHECK_EQ(100.0, StrtodTrimmed(vector, 2)); 3952e5b6d6dSopenharmony_ci CHECK_EQ(1e20, StrtodTrimmed(vector, 20)); 3962e5b6d6dSopenharmony_ci CHECK_EQ(1e22, StrtodTrimmed(vector, 22)); 3972e5b6d6dSopenharmony_ci CHECK_EQ(1e23, StrtodTrimmed(vector, 23)); 3982e5b6d6dSopenharmony_ci CHECK_EQ(1e35, StrtodTrimmed(vector, 35)); 3992e5b6d6dSopenharmony_ci CHECK_EQ(1e36, StrtodTrimmed(vector, 36)); 4002e5b6d6dSopenharmony_ci CHECK_EQ(1e37, StrtodTrimmed(vector, 37)); 4012e5b6d6dSopenharmony_ci CHECK_EQ(1e-1, StrtodTrimmed(vector, -1)); 4022e5b6d6dSopenharmony_ci CHECK_EQ(1e-2, StrtodTrimmed(vector, -2)); 4032e5b6d6dSopenharmony_ci CHECK_EQ(1e-5, StrtodTrimmed(vector, -5)); 4042e5b6d6dSopenharmony_ci CHECK_EQ(1e-20, StrtodTrimmed(vector, -20)); 4052e5b6d6dSopenharmony_ci CHECK_EQ(1e-22, StrtodTrimmed(vector, -22)); 4062e5b6d6dSopenharmony_ci CHECK_EQ(1e-23, StrtodTrimmed(vector, -23)); 4072e5b6d6dSopenharmony_ci CHECK_EQ(1e-25, StrtodTrimmed(vector, -25)); 4082e5b6d6dSopenharmony_ci CHECK_EQ(1e-39, StrtodTrimmed(vector, -39)); 4092e5b6d6dSopenharmony_ci 4102e5b6d6dSopenharmony_ci vector = StringToVector("2"); 4112e5b6d6dSopenharmony_ci CHECK_EQ(2.0, StrtodTrimmed(vector, 0)); 4122e5b6d6dSopenharmony_ci CHECK_EQ(20.0, StrtodTrimmed(vector, 1)); 4132e5b6d6dSopenharmony_ci CHECK_EQ(200.0, StrtodTrimmed(vector, 2)); 4142e5b6d6dSopenharmony_ci CHECK_EQ(2e20, StrtodTrimmed(vector, 20)); 4152e5b6d6dSopenharmony_ci CHECK_EQ(2e22, StrtodTrimmed(vector, 22)); 4162e5b6d6dSopenharmony_ci CHECK_EQ(2e23, StrtodTrimmed(vector, 23)); 4172e5b6d6dSopenharmony_ci CHECK_EQ(2e35, StrtodTrimmed(vector, 35)); 4182e5b6d6dSopenharmony_ci CHECK_EQ(2e36, StrtodTrimmed(vector, 36)); 4192e5b6d6dSopenharmony_ci CHECK_EQ(2e37, StrtodTrimmed(vector, 37)); 4202e5b6d6dSopenharmony_ci CHECK_EQ(2e-1, StrtodTrimmed(vector, -1)); 4212e5b6d6dSopenharmony_ci CHECK_EQ(2e-2, StrtodTrimmed(vector, -2)); 4222e5b6d6dSopenharmony_ci CHECK_EQ(2e-5, StrtodTrimmed(vector, -5)); 4232e5b6d6dSopenharmony_ci CHECK_EQ(2e-20, StrtodTrimmed(vector, -20)); 4242e5b6d6dSopenharmony_ci CHECK_EQ(2e-22, StrtodTrimmed(vector, -22)); 4252e5b6d6dSopenharmony_ci CHECK_EQ(2e-23, StrtodTrimmed(vector, -23)); 4262e5b6d6dSopenharmony_ci CHECK_EQ(2e-25, StrtodTrimmed(vector, -25)); 4272e5b6d6dSopenharmony_ci CHECK_EQ(2e-39, StrtodTrimmed(vector, -39)); 4282e5b6d6dSopenharmony_ci 4292e5b6d6dSopenharmony_ci vector = StringToVector("9"); 4302e5b6d6dSopenharmony_ci CHECK_EQ(9.0, StrtodTrimmed(vector, 0)); 4312e5b6d6dSopenharmony_ci CHECK_EQ(90.0, StrtodTrimmed(vector, 1)); 4322e5b6d6dSopenharmony_ci CHECK_EQ(900.0, StrtodTrimmed(vector, 2)); 4332e5b6d6dSopenharmony_ci CHECK_EQ(9e20, StrtodTrimmed(vector, 20)); 4342e5b6d6dSopenharmony_ci CHECK_EQ(9e22, StrtodTrimmed(vector, 22)); 4352e5b6d6dSopenharmony_ci CHECK_EQ(9e23, StrtodTrimmed(vector, 23)); 4362e5b6d6dSopenharmony_ci CHECK_EQ(9e35, StrtodTrimmed(vector, 35)); 4372e5b6d6dSopenharmony_ci CHECK_EQ(9e36, StrtodTrimmed(vector, 36)); 4382e5b6d6dSopenharmony_ci CHECK_EQ(9e37, StrtodTrimmed(vector, 37)); 4392e5b6d6dSopenharmony_ci CHECK_EQ(9e-1, StrtodTrimmed(vector, -1)); 4402e5b6d6dSopenharmony_ci CHECK_EQ(9e-2, StrtodTrimmed(vector, -2)); 4412e5b6d6dSopenharmony_ci CHECK_EQ(9e-5, StrtodTrimmed(vector, -5)); 4422e5b6d6dSopenharmony_ci CHECK_EQ(9e-20, StrtodTrimmed(vector, -20)); 4432e5b6d6dSopenharmony_ci CHECK_EQ(9e-22, StrtodTrimmed(vector, -22)); 4442e5b6d6dSopenharmony_ci CHECK_EQ(9e-23, StrtodTrimmed(vector, -23)); 4452e5b6d6dSopenharmony_ci CHECK_EQ(9e-25, StrtodTrimmed(vector, -25)); 4462e5b6d6dSopenharmony_ci CHECK_EQ(9e-39, StrtodTrimmed(vector, -39)); 4472e5b6d6dSopenharmony_ci 4482e5b6d6dSopenharmony_ci vector = StringToVector("12345"); 4492e5b6d6dSopenharmony_ci CHECK_EQ(12345.0, StrtodTrimmed(vector, 0)); 4502e5b6d6dSopenharmony_ci CHECK_EQ(123450.0, StrtodTrimmed(vector, 1)); 4512e5b6d6dSopenharmony_ci CHECK_EQ(1234500.0, StrtodTrimmed(vector, 2)); 4522e5b6d6dSopenharmony_ci CHECK_EQ(12345e20, StrtodTrimmed(vector, 20)); 4532e5b6d6dSopenharmony_ci CHECK_EQ(12345e22, StrtodTrimmed(vector, 22)); 4542e5b6d6dSopenharmony_ci CHECK_EQ(12345e23, StrtodTrimmed(vector, 23)); 4552e5b6d6dSopenharmony_ci CHECK_EQ(12345e30, StrtodTrimmed(vector, 30)); 4562e5b6d6dSopenharmony_ci CHECK_EQ(12345e31, StrtodTrimmed(vector, 31)); 4572e5b6d6dSopenharmony_ci CHECK_EQ(12345e32, StrtodTrimmed(vector, 32)); 4582e5b6d6dSopenharmony_ci CHECK_EQ(12345e35, StrtodTrimmed(vector, 35)); 4592e5b6d6dSopenharmony_ci CHECK_EQ(12345e36, StrtodTrimmed(vector, 36)); 4602e5b6d6dSopenharmony_ci CHECK_EQ(12345e37, StrtodTrimmed(vector, 37)); 4612e5b6d6dSopenharmony_ci CHECK_EQ(12345e-1, StrtodTrimmed(vector, -1)); 4622e5b6d6dSopenharmony_ci CHECK_EQ(12345e-2, StrtodTrimmed(vector, -2)); 4632e5b6d6dSopenharmony_ci CHECK_EQ(12345e-5, StrtodTrimmed(vector, -5)); 4642e5b6d6dSopenharmony_ci CHECK_EQ(12345e-20, StrtodTrimmed(vector, -20)); 4652e5b6d6dSopenharmony_ci CHECK_EQ(12345e-22, StrtodTrimmed(vector, -22)); 4662e5b6d6dSopenharmony_ci CHECK_EQ(12345e-23, StrtodTrimmed(vector, -23)); 4672e5b6d6dSopenharmony_ci CHECK_EQ(12345e-25, StrtodTrimmed(vector, -25)); 4682e5b6d6dSopenharmony_ci CHECK_EQ(12345e-39, StrtodTrimmed(vector, -39)); 4692e5b6d6dSopenharmony_ci 4702e5b6d6dSopenharmony_ci vector = StringToVector("12345678901234"); 4712e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234.0, StrtodTrimmed(vector, 0)); 4722e5b6d6dSopenharmony_ci CHECK_EQ(123456789012340.0, StrtodTrimmed(vector, 1)); 4732e5b6d6dSopenharmony_ci CHECK_EQ(1234567890123400.0, StrtodTrimmed(vector, 2)); 4742e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e20, StrtodTrimmed(vector, 20)); 4752e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e22, StrtodTrimmed(vector, 22)); 4762e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e23, StrtodTrimmed(vector, 23)); 4772e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e30, StrtodTrimmed(vector, 30)); 4782e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e31, StrtodTrimmed(vector, 31)); 4792e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e32, StrtodTrimmed(vector, 32)); 4802e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e35, StrtodTrimmed(vector, 35)); 4812e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e36, StrtodTrimmed(vector, 36)); 4822e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e37, StrtodTrimmed(vector, 37)); 4832e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e-1, StrtodTrimmed(vector, -1)); 4842e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e-2, StrtodTrimmed(vector, -2)); 4852e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e-5, StrtodTrimmed(vector, -5)); 4862e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e-20, StrtodTrimmed(vector, -20)); 4872e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e-22, StrtodTrimmed(vector, -22)); 4882e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e-23, StrtodTrimmed(vector, -23)); 4892e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e-25, StrtodTrimmed(vector, -25)); 4902e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e-39, StrtodTrimmed(vector, -39)); 4912e5b6d6dSopenharmony_ci 4922e5b6d6dSopenharmony_ci vector = StringToVector("123456789012345"); 4932e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345.0, StrtodTrimmed(vector, 0)); 4942e5b6d6dSopenharmony_ci CHECK_EQ(1234567890123450.0, StrtodTrimmed(vector, 1)); 4952e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234500.0, StrtodTrimmed(vector, 2)); 4962e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345e20, StrtodTrimmed(vector, 20)); 4972e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345e22, StrtodTrimmed(vector, 22)); 4982e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345e23, StrtodTrimmed(vector, 23)); 4992e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345e35, StrtodTrimmed(vector, 35)); 5002e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345e36, StrtodTrimmed(vector, 36)); 5012e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345e37, StrtodTrimmed(vector, 37)); 5022e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345e39, StrtodTrimmed(vector, 39)); 5032e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345e-1, StrtodTrimmed(vector, -1)); 5042e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345e-2, StrtodTrimmed(vector, -2)); 5052e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345e-5, StrtodTrimmed(vector, -5)); 5062e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345e-20, StrtodTrimmed(vector, -20)); 5072e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345e-22, StrtodTrimmed(vector, -22)); 5082e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345e-23, StrtodTrimmed(vector, -23)); 5092e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345e-25, StrtodTrimmed(vector, -25)); 5102e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345e-39, StrtodTrimmed(vector, -39)); 5112e5b6d6dSopenharmony_ci 5122e5b6d6dSopenharmony_ci CHECK_EQ(0.0, StrtodTrimmedChar("", 1324)); 5132e5b6d6dSopenharmony_ci CHECK_EQ(0.0, StrtodTrimmedChar("2", -324)); 5142e5b6d6dSopenharmony_ci CHECK_EQ(4e-324, StrtodTrimmedChar("3", -324)); 5152e5b6d6dSopenharmony_ci // It would be more readable to put non-zero literals on the left side (i.e. 5162e5b6d6dSopenharmony_ci // CHECK_EQ(1e-325, StrtodChar("1", -325))), but then Gcc complains that 5172e5b6d6dSopenharmony_ci // they are truncated to zero. 5182e5b6d6dSopenharmony_ci CHECK_EQ(0.0, StrtodTrimmedChar("1", -325)); 5192e5b6d6dSopenharmony_ci CHECK_EQ(0.0, StrtodTrimmedChar("1", -325)); 5202e5b6d6dSopenharmony_ci 5212e5b6d6dSopenharmony_ci // It would be more readable to put the literals (and not Double::Infinity()) 5222e5b6d6dSopenharmony_ci // on the left side (i.e. CHECK_EQ(1e309, StrtodChar("1", 309))), but then Gcc 5232e5b6d6dSopenharmony_ci // complains that the floating constant exceeds range of 'double'. 5242e5b6d6dSopenharmony_ci CHECK_EQ(Double::Infinity(), StrtodTrimmedChar("1", 309)); 5252e5b6d6dSopenharmony_ci CHECK_EQ(1e308, StrtodTrimmedChar("1", 308)); 5262e5b6d6dSopenharmony_ci CHECK_EQ(1234e305, StrtodTrimmedChar("1234", 305)); 5272e5b6d6dSopenharmony_ci CHECK_EQ(1234e304, StrtodTrimmedChar("1234", 304)); 5282e5b6d6dSopenharmony_ci CHECK_EQ(Double::Infinity(), StrtodTrimmedChar("18", 307)); 5292e5b6d6dSopenharmony_ci CHECK_EQ(17e307, StrtodTrimmedChar("17", 307)); 5302e5b6d6dSopenharmony_ci 5312e5b6d6dSopenharmony_ci CHECK_EQ(1.7976931348623157E+308, StrtodTrimmedChar("17976931348623157", 292)); 5322e5b6d6dSopenharmony_ci CHECK_EQ(1.7976931348623158E+308, StrtodTrimmedChar("17976931348623158", 292)); 5332e5b6d6dSopenharmony_ci CHECK_EQ(Double::Infinity(), StrtodTrimmedChar("17976931348623159", 292)); 5342e5b6d6dSopenharmony_ci 5352e5b6d6dSopenharmony_ci // The following number is the result of 89255.0/1e-22. Both floating-point 5362e5b6d6dSopenharmony_ci // numbers can be accurately represented with doubles. However on Linux,x86 5372e5b6d6dSopenharmony_ci // the floating-point stack is set to 80bits and the double-rounding 5382e5b6d6dSopenharmony_ci // introduces an error. 5392e5b6d6dSopenharmony_ci CHECK_EQ(89255e-22, StrtodTrimmedChar("89255", -22)); 5402e5b6d6dSopenharmony_ci 5412e5b6d6dSopenharmony_ci // Some random values. 5422e5b6d6dSopenharmony_ci CHECK_EQ(358416272e-33, StrtodTrimmedChar("358416272", -33)); 5432e5b6d6dSopenharmony_ci CHECK_EQ(104110013277974872254e-225, 5442e5b6d6dSopenharmony_ci StrtodTrimmedChar("104110013277974872254", -225)); 5452e5b6d6dSopenharmony_ci 5462e5b6d6dSopenharmony_ci CHECK_EQ(123456789e108, StrtodTrimmedChar("123456789", 108)); 5472e5b6d6dSopenharmony_ci CHECK_EQ(123456789e109, StrtodTrimmedChar("123456789", 109)); 5482e5b6d6dSopenharmony_ci CHECK_EQ(123456789e110, StrtodTrimmedChar("123456789", 110)); 5492e5b6d6dSopenharmony_ci CHECK_EQ(123456789e111, StrtodTrimmedChar("123456789", 111)); 5502e5b6d6dSopenharmony_ci CHECK_EQ(123456789e112, StrtodTrimmedChar("123456789", 112)); 5512e5b6d6dSopenharmony_ci CHECK_EQ(123456789e113, StrtodTrimmedChar("123456789", 113)); 5522e5b6d6dSopenharmony_ci CHECK_EQ(123456789e114, StrtodTrimmedChar("123456789", 114)); 5532e5b6d6dSopenharmony_ci CHECK_EQ(123456789e115, StrtodTrimmedChar("123456789", 115)); 5542e5b6d6dSopenharmony_ci CHECK_EQ(1234567890123456789012345e108, 5552e5b6d6dSopenharmony_ci StrtodTrimmedChar("1234567890123456789012345", 108)); 5562e5b6d6dSopenharmony_ci CHECK_EQ(1234567890123456789012345e109, 5572e5b6d6dSopenharmony_ci StrtodTrimmedChar("1234567890123456789012345", 109)); 5582e5b6d6dSopenharmony_ci CHECK_EQ(1234567890123456789012345e110, 5592e5b6d6dSopenharmony_ci StrtodTrimmedChar("1234567890123456789012345", 110)); 5602e5b6d6dSopenharmony_ci CHECK_EQ(1234567890123456789012345e111, 5612e5b6d6dSopenharmony_ci StrtodTrimmedChar("1234567890123456789012345", 111)); 5622e5b6d6dSopenharmony_ci CHECK_EQ(1234567890123456789012345e112, 5632e5b6d6dSopenharmony_ci StrtodTrimmedChar("1234567890123456789012345", 112)); 5642e5b6d6dSopenharmony_ci CHECK_EQ(1234567890123456789012345e113, 5652e5b6d6dSopenharmony_ci StrtodTrimmedChar("1234567890123456789012345", 113)); 5662e5b6d6dSopenharmony_ci CHECK_EQ(1234567890123456789012345e114, 5672e5b6d6dSopenharmony_ci StrtodTrimmedChar("1234567890123456789012345", 114)); 5682e5b6d6dSopenharmony_ci CHECK_EQ(1234567890123456789012345e115, 5692e5b6d6dSopenharmony_ci StrtodTrimmedChar("1234567890123456789012345", 115)); 5702e5b6d6dSopenharmony_ci 5712e5b6d6dSopenharmony_ci CHECK_EQ(1234567890123456789052345e108, 5722e5b6d6dSopenharmony_ci StrtodTrimmedChar("1234567890123456789052345", 108)); 5732e5b6d6dSopenharmony_ci CHECK_EQ(1234567890123456789052345e109, 5742e5b6d6dSopenharmony_ci StrtodTrimmedChar("1234567890123456789052345", 109)); 5752e5b6d6dSopenharmony_ci CHECK_EQ(1234567890123456789052345e110, 5762e5b6d6dSopenharmony_ci StrtodTrimmedChar("1234567890123456789052345", 110)); 5772e5b6d6dSopenharmony_ci CHECK_EQ(1234567890123456789052345e111, 5782e5b6d6dSopenharmony_ci StrtodTrimmedChar("1234567890123456789052345", 111)); 5792e5b6d6dSopenharmony_ci CHECK_EQ(1234567890123456789052345e112, 5802e5b6d6dSopenharmony_ci StrtodTrimmedChar("1234567890123456789052345", 112)); 5812e5b6d6dSopenharmony_ci CHECK_EQ(1234567890123456789052345e113, 5822e5b6d6dSopenharmony_ci StrtodTrimmedChar("1234567890123456789052345", 113)); 5832e5b6d6dSopenharmony_ci CHECK_EQ(1234567890123456789052345e114, 5842e5b6d6dSopenharmony_ci StrtodTrimmedChar("1234567890123456789052345", 114)); 5852e5b6d6dSopenharmony_ci CHECK_EQ(1234567890123456789052345e115, 5862e5b6d6dSopenharmony_ci StrtodTrimmedChar("1234567890123456789052345", 115)); 5872e5b6d6dSopenharmony_ci 5882e5b6d6dSopenharmony_ci // Boundary cases. Boundaries themselves should round to even. 5892e5b6d6dSopenharmony_ci // 5902e5b6d6dSopenharmony_ci // 0x1FFFFFFFFFFFF * 2^3 = 72057594037927928 5912e5b6d6dSopenharmony_ci // next: 72057594037927936 5922e5b6d6dSopenharmony_ci // boundary: 72057594037927932 should round up. 5932e5b6d6dSopenharmony_ci CHECK_EQ(72057594037927928.0, StrtodTrimmedChar("72057594037927928", 0)); 5942e5b6d6dSopenharmony_ci CHECK_EQ(72057594037927936.0, StrtodTrimmedChar("72057594037927936", 0)); 5952e5b6d6dSopenharmony_ci CHECK_EQ(72057594037927936.0, StrtodTrimmedChar("72057594037927932", 0)); 5962e5b6d6dSopenharmony_ci CHECK_EQ(72057594037927928.0, StrtodTrimmedChar("7205759403792793199999", -5)); 5972e5b6d6dSopenharmony_ci CHECK_EQ(72057594037927936.0, StrtodTrimmedChar("7205759403792793200001", -5)); 5982e5b6d6dSopenharmony_ci 5992e5b6d6dSopenharmony_ci // 0x1FFFFFFFFFFFF * 2^10 = 9223372036854774784 6002e5b6d6dSopenharmony_ci // next: 9223372036854775808 6012e5b6d6dSopenharmony_ci // boundary: 9223372036854775296 should round up. 6022e5b6d6dSopenharmony_ci CHECK_EQ(9223372036854774784.0, StrtodTrimmedChar("9223372036854774784", 0)); 6032e5b6d6dSopenharmony_ci CHECK_EQ(9223372036854775808.0, StrtodTrimmedChar("9223372036854775808", 0)); 6042e5b6d6dSopenharmony_ci CHECK_EQ(9223372036854775808.0, StrtodTrimmedChar("9223372036854775296", 0)); 6052e5b6d6dSopenharmony_ci CHECK_EQ(9223372036854774784.0, StrtodTrimmedChar("922337203685477529599999", -5)); 6062e5b6d6dSopenharmony_ci CHECK_EQ(9223372036854775808.0, StrtodTrimmedChar("922337203685477529600001", -5)); 6072e5b6d6dSopenharmony_ci 6082e5b6d6dSopenharmony_ci // 0x1FFFFFFFFFFFF * 2^50 = 10141204801825834086073718800384 6092e5b6d6dSopenharmony_ci // next: 10141204801825835211973625643008 6102e5b6d6dSopenharmony_ci // boundary: 10141204801825834649023672221696 should round up. 6112e5b6d6dSopenharmony_ci CHECK_EQ(10141204801825834086073718800384.0, 6122e5b6d6dSopenharmony_ci StrtodTrimmedChar("10141204801825834086073718800384", 0)); 6132e5b6d6dSopenharmony_ci CHECK_EQ(10141204801825835211973625643008.0, 6142e5b6d6dSopenharmony_ci StrtodTrimmedChar("10141204801825835211973625643008", 0)); 6152e5b6d6dSopenharmony_ci CHECK_EQ(10141204801825835211973625643008.0, 6162e5b6d6dSopenharmony_ci StrtodTrimmedChar("10141204801825834649023672221696", 0)); 6172e5b6d6dSopenharmony_ci CHECK_EQ(10141204801825834086073718800384.0, 6182e5b6d6dSopenharmony_ci StrtodTrimmedChar("1014120480182583464902367222169599999", -5)); 6192e5b6d6dSopenharmony_ci CHECK_EQ(10141204801825835211973625643008.0, 6202e5b6d6dSopenharmony_ci StrtodTrimmedChar("1014120480182583464902367222169600001", -5)); 6212e5b6d6dSopenharmony_ci 6222e5b6d6dSopenharmony_ci // 0x1FFFFFFFFFFFF * 2^99 = 5708990770823838890407843763683279797179383808 6232e5b6d6dSopenharmony_ci // next: 5708990770823839524233143877797980545530986496 6242e5b6d6dSopenharmony_ci // boundary: 5708990770823839207320493820740630171355185152 6252e5b6d6dSopenharmony_ci // The boundary should round up. 6262e5b6d6dSopenharmony_ci CHECK_EQ(5708990770823838890407843763683279797179383808.0, 6272e5b6d6dSopenharmony_ci StrtodTrimmedChar("5708990770823838890407843763683279797179383808", 0)); 6282e5b6d6dSopenharmony_ci CHECK_EQ(5708990770823839524233143877797980545530986496.0, 6292e5b6d6dSopenharmony_ci StrtodTrimmedChar("5708990770823839524233143877797980545530986496", 0)); 6302e5b6d6dSopenharmony_ci CHECK_EQ(5708990770823839524233143877797980545530986496.0, 6312e5b6d6dSopenharmony_ci StrtodTrimmedChar("5708990770823839207320493820740630171355185152", 0)); 6322e5b6d6dSopenharmony_ci CHECK_EQ(5708990770823838890407843763683279797179383808.0, 6332e5b6d6dSopenharmony_ci StrtodTrimmedChar("5708990770823839207320493820740630171355185151999", -3)); 6342e5b6d6dSopenharmony_ci CHECK_EQ(5708990770823839524233143877797980545530986496.0, 6352e5b6d6dSopenharmony_ci StrtodTrimmedChar("5708990770823839207320493820740630171355185152001", -3)); 6362e5b6d6dSopenharmony_ci 6372e5b6d6dSopenharmony_ci // The following test-cases got some public attention in early 2011 when they 6382e5b6d6dSopenharmony_ci // sent Java and PHP into an infinite loop. 6392e5b6d6dSopenharmony_ci CHECK_EQ(2.225073858507201e-308, StrtodTrimmedChar("22250738585072011", -324)); 6402e5b6d6dSopenharmony_ci CHECK_EQ(2.22507385850720138309e-308, 6412e5b6d6dSopenharmony_ci StrtodTrimmedChar("22250738585072011360574097967091319759348195463516456480" 6422e5b6d6dSopenharmony_ci "23426109724822222021076945516529523908135087914149158913" 6432e5b6d6dSopenharmony_ci "03962110687008643869459464552765720740782062174337998814" 6442e5b6d6dSopenharmony_ci "10632673292535522868813721490129811224514518898490572223" 6452e5b6d6dSopenharmony_ci "07285255133155755015914397476397983411801999323962548289" 6462e5b6d6dSopenharmony_ci "01710708185069063066665599493827577257201576306269066333" 6472e5b6d6dSopenharmony_ci "26475653000092458883164330377797918696120494973903778297" 6482e5b6d6dSopenharmony_ci "04905051080609940730262937128958950003583799967207254304" 6492e5b6d6dSopenharmony_ci "36028407889577179615094551674824347103070260914462157228" 6502e5b6d6dSopenharmony_ci "98802581825451803257070188608721131280795122334262883686" 6512e5b6d6dSopenharmony_ci "22321503775666622503982534335974568884423900265498198385" 6522e5b6d6dSopenharmony_ci "48794829220689472168983109969836584681402285424333066033" 6532e5b6d6dSopenharmony_ci "98508864458040010349339704275671864433837704860378616227" 6542e5b6d6dSopenharmony_ci "71738545623065874679014086723327636718751", -1076)); 6552e5b6d6dSopenharmony_ci} 6562e5b6d6dSopenharmony_ci 6572e5b6d6dSopenharmony_ci 6582e5b6d6dSopenharmony_ciTEST(Strtof) { 6592e5b6d6dSopenharmony_ci Vector<const char> vector; 6602e5b6d6dSopenharmony_ci 6612e5b6d6dSopenharmony_ci vector = StringToVector("0"); 6622e5b6d6dSopenharmony_ci CHECK_EQ(0.0f, Strtof(vector, 1)); 6632e5b6d6dSopenharmony_ci CHECK_EQ(0.0f, Strtof(vector, 2)); 6642e5b6d6dSopenharmony_ci CHECK_EQ(0.0f, Strtof(vector, -2)); 6652e5b6d6dSopenharmony_ci CHECK_EQ(0.0f, Strtof(vector, -999)); 6662e5b6d6dSopenharmony_ci CHECK_EQ(0.0f, Strtof(vector, +999)); 6672e5b6d6dSopenharmony_ci 6682e5b6d6dSopenharmony_ci vector = StringToVector("1"); 6692e5b6d6dSopenharmony_ci CHECK_EQ(1.0f, Strtof(vector, 0)); 6702e5b6d6dSopenharmony_ci CHECK_EQ(10.0f, Strtof(vector, 1)); 6712e5b6d6dSopenharmony_ci CHECK_EQ(100.0f, Strtof(vector, 2)); 6722e5b6d6dSopenharmony_ci CHECK_EQ(1e20f, Strtof(vector, 20)); 6732e5b6d6dSopenharmony_ci CHECK_EQ(1e22f, Strtof(vector, 22)); 6742e5b6d6dSopenharmony_ci CHECK_EQ(1e23f, Strtof(vector, 23)); 6752e5b6d6dSopenharmony_ci CHECK_EQ(1e35f, Strtof(vector, 35)); 6762e5b6d6dSopenharmony_ci CHECK_EQ(1e36f, Strtof(vector, 36)); 6772e5b6d6dSopenharmony_ci CHECK_EQ(1e37f, Strtof(vector, 37)); 6782e5b6d6dSopenharmony_ci CHECK_EQ(1e-1f, Strtof(vector, -1)); 6792e5b6d6dSopenharmony_ci CHECK_EQ(1e-2f, Strtof(vector, -2)); 6802e5b6d6dSopenharmony_ci CHECK_EQ(1e-5f, Strtof(vector, -5)); 6812e5b6d6dSopenharmony_ci CHECK_EQ(1e-20f, Strtof(vector, -20)); 6822e5b6d6dSopenharmony_ci CHECK_EQ(1e-22f, Strtof(vector, -22)); 6832e5b6d6dSopenharmony_ci CHECK_EQ(1e-23f, Strtof(vector, -23)); 6842e5b6d6dSopenharmony_ci CHECK_EQ(1e-25f, Strtof(vector, -25)); 6852e5b6d6dSopenharmony_ci CHECK_EQ(1e-39f, Strtof(vector, -39)); 6862e5b6d6dSopenharmony_ci 6872e5b6d6dSopenharmony_ci vector = StringToVector("2"); 6882e5b6d6dSopenharmony_ci CHECK_EQ(2.0f, Strtof(vector, 0)); 6892e5b6d6dSopenharmony_ci CHECK_EQ(20.0f, Strtof(vector, 1)); 6902e5b6d6dSopenharmony_ci CHECK_EQ(200.0f, Strtof(vector, 2)); 6912e5b6d6dSopenharmony_ci CHECK_EQ(2e20f, Strtof(vector, 20)); 6922e5b6d6dSopenharmony_ci CHECK_EQ(2e22f, Strtof(vector, 22)); 6932e5b6d6dSopenharmony_ci CHECK_EQ(2e23f, Strtof(vector, 23)); 6942e5b6d6dSopenharmony_ci CHECK_EQ(2e35f, Strtof(vector, 35)); 6952e5b6d6dSopenharmony_ci CHECK_EQ(2e36f, Strtof(vector, 36)); 6962e5b6d6dSopenharmony_ci CHECK_EQ(2e37f, Strtof(vector, 37)); 6972e5b6d6dSopenharmony_ci CHECK_EQ(2e-1f, Strtof(vector, -1)); 6982e5b6d6dSopenharmony_ci CHECK_EQ(2e-2f, Strtof(vector, -2)); 6992e5b6d6dSopenharmony_ci CHECK_EQ(2e-5f, Strtof(vector, -5)); 7002e5b6d6dSopenharmony_ci CHECK_EQ(2e-20f, Strtof(vector, -20)); 7012e5b6d6dSopenharmony_ci CHECK_EQ(2e-22f, Strtof(vector, -22)); 7022e5b6d6dSopenharmony_ci CHECK_EQ(2e-23f, Strtof(vector, -23)); 7032e5b6d6dSopenharmony_ci CHECK_EQ(2e-25f, Strtof(vector, -25)); 7042e5b6d6dSopenharmony_ci CHECK_EQ(2e-39f, Strtof(vector, -39)); 7052e5b6d6dSopenharmony_ci 7062e5b6d6dSopenharmony_ci vector = StringToVector("9"); 7072e5b6d6dSopenharmony_ci CHECK_EQ(9.0f, Strtof(vector, 0)); 7082e5b6d6dSopenharmony_ci CHECK_EQ(90.0f, Strtof(vector, 1)); 7092e5b6d6dSopenharmony_ci CHECK_EQ(900.0f, Strtof(vector, 2)); 7102e5b6d6dSopenharmony_ci CHECK_EQ(9e20f, Strtof(vector, 20)); 7112e5b6d6dSopenharmony_ci CHECK_EQ(9e22f, Strtof(vector, 22)); 7122e5b6d6dSopenharmony_ci CHECK_EQ(9e23f, Strtof(vector, 23)); 7132e5b6d6dSopenharmony_ci CHECK_EQ(9e35f, Strtof(vector, 35)); 7142e5b6d6dSopenharmony_ci CHECK_EQ(9e36f, Strtof(vector, 36)); 7152e5b6d6dSopenharmony_ci CHECK_EQ(9e37f, Strtof(vector, 37)); 7162e5b6d6dSopenharmony_ci CHECK_EQ(9e-1f, Strtof(vector, -1)); 7172e5b6d6dSopenharmony_ci CHECK_EQ(9e-2f, Strtof(vector, -2)); 7182e5b6d6dSopenharmony_ci CHECK_EQ(9e-5f, Strtof(vector, -5)); 7192e5b6d6dSopenharmony_ci CHECK_EQ(9e-20f, Strtof(vector, -20)); 7202e5b6d6dSopenharmony_ci CHECK_EQ(9e-22f, Strtof(vector, -22)); 7212e5b6d6dSopenharmony_ci CHECK_EQ(9e-23f, Strtof(vector, -23)); 7222e5b6d6dSopenharmony_ci CHECK_EQ(9e-25f, Strtof(vector, -25)); 7232e5b6d6dSopenharmony_ci CHECK_EQ(9e-39f, Strtof(vector, -39)); 7242e5b6d6dSopenharmony_ci 7252e5b6d6dSopenharmony_ci vector = StringToVector("12345"); 7262e5b6d6dSopenharmony_ci CHECK_EQ(12345.0f, Strtof(vector, 0)); 7272e5b6d6dSopenharmony_ci CHECK_EQ(123450.0f, Strtof(vector, 1)); 7282e5b6d6dSopenharmony_ci CHECK_EQ(1234500.0f, Strtof(vector, 2)); 7292e5b6d6dSopenharmony_ci CHECK_EQ(12345e20f, Strtof(vector, 20)); 7302e5b6d6dSopenharmony_ci CHECK_EQ(12345e22f, Strtof(vector, 22)); 7312e5b6d6dSopenharmony_ci CHECK_EQ(12345e23f, Strtof(vector, 23)); 7322e5b6d6dSopenharmony_ci CHECK_EQ(12345e30f, Strtof(vector, 30)); 7332e5b6d6dSopenharmony_ci CHECK_EQ(12345e31f, Strtof(vector, 31)); 7342e5b6d6dSopenharmony_ci CHECK_EQ(12345e32f, Strtof(vector, 32)); 7352e5b6d6dSopenharmony_ci CHECK_EQ(12345e-1f, Strtof(vector, -1)); 7362e5b6d6dSopenharmony_ci CHECK_EQ(12345e-2f, Strtof(vector, -2)); 7372e5b6d6dSopenharmony_ci CHECK_EQ(12345e-5f, Strtof(vector, -5)); 7382e5b6d6dSopenharmony_ci CHECK_EQ(12345e-20f, Strtof(vector, -20)); 7392e5b6d6dSopenharmony_ci CHECK_EQ(12345e-22f, Strtof(vector, -22)); 7402e5b6d6dSopenharmony_ci CHECK_EQ(12345e-23f, Strtof(vector, -23)); 7412e5b6d6dSopenharmony_ci CHECK_EQ(12345e-25f, Strtof(vector, -25)); 7422e5b6d6dSopenharmony_ci CHECK_EQ(12345e-39f, Strtof(vector, -39)); 7432e5b6d6dSopenharmony_ci 7442e5b6d6dSopenharmony_ci vector = StringToVector("12345678901234"); 7452e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234.0f, Strtof(vector, 0)); 7462e5b6d6dSopenharmony_ci CHECK_EQ(123456789012340.0f, Strtof(vector, 1)); 7472e5b6d6dSopenharmony_ci CHECK_EQ(1234567890123400.0f, Strtof(vector, 2)); 7482e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e20f, Strtof(vector, 20)); 7492e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e22f, Strtof(vector, 22)); 7502e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e23f, Strtof(vector, 23)); 7512e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e-1f, Strtof(vector, -1)); 7522e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e-2f, Strtof(vector, -2)); 7532e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e-5f, Strtof(vector, -5)); 7542e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e-20f, Strtof(vector, -20)); 7552e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e-22f, Strtof(vector, -22)); 7562e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e-23f, Strtof(vector, -23)); 7572e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e-25f, Strtof(vector, -25)); 7582e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e-39f, Strtof(vector, -39)); 7592e5b6d6dSopenharmony_ci 7602e5b6d6dSopenharmony_ci vector = StringToVector("123456789012345"); 7612e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345.0f, Strtof(vector, 0)); 7622e5b6d6dSopenharmony_ci CHECK_EQ(1234567890123450.0f, Strtof(vector, 1)); 7632e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234500.0f, Strtof(vector, 2)); 7642e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345e20f, Strtof(vector, 20)); 7652e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345e22f, Strtof(vector, 22)); 7662e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345e23f, Strtof(vector, 23)); 7672e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345e-1f, Strtof(vector, -1)); 7682e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345e-2f, Strtof(vector, -2)); 7692e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345e-5f, Strtof(vector, -5)); 7702e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345e-20f, Strtof(vector, -20)); 7712e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345e-22f, Strtof(vector, -22)); 7722e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345e-23f, Strtof(vector, -23)); 7732e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345e-25f, Strtof(vector, -25)); 7742e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345e-39f, Strtof(vector, -39)); 7752e5b6d6dSopenharmony_ci 7762e5b6d6dSopenharmony_ci CHECK_EQ(0.0f, StrtofChar("0", 12345)); 7772e5b6d6dSopenharmony_ci CHECK_EQ(0.0f, StrtofChar("", 1324)); 7782e5b6d6dSopenharmony_ci CHECK_EQ(0.0f, StrtofChar("000000000", 123)); 7792e5b6d6dSopenharmony_ci CHECK_EQ(0.0f, StrtofChar("2", -324)); 7802e5b6d6dSopenharmony_ci CHECK_EQ(1e-45f, StrtofChar("1", -45)); 7812e5b6d6dSopenharmony_ci // It would be more readable to put non-zero literals on the left side (i.e. 7822e5b6d6dSopenharmony_ci // CHECK_EQ(1e-46, StrtofChar("1", -45))), but then Gcc complains that 7832e5b6d6dSopenharmony_ci // they are truncated to zero. 7842e5b6d6dSopenharmony_ci CHECK_EQ(0.0f, StrtofChar("1", -46)); 7852e5b6d6dSopenharmony_ci CHECK_EQ(0.0f, StrtofChar("1", -47)); 7862e5b6d6dSopenharmony_ci CHECK_EQ(1e-45f, StrtofChar("1", -45)); 7872e5b6d6dSopenharmony_ci CHECK_EQ(1e-45f, StrtofChar("8", -46)); 7882e5b6d6dSopenharmony_ci CHECK_EQ(0.0f, StrtofChar("200000", -51)); 7892e5b6d6dSopenharmony_ci CHECK_EQ(100000e-50f, StrtofChar("100000", -50)); 7902e5b6d6dSopenharmony_ci CHECK_EQ(0.0f, StrtofChar("100000", -51)); 7912e5b6d6dSopenharmony_ci CHECK_EQ(0.0f, StrtofChar("900000", -52)); 7922e5b6d6dSopenharmony_ci CHECK_EQ(0.0f, StrtofChar("000000001", -47)); 7932e5b6d6dSopenharmony_ci CHECK_EQ(0.0f, StrtofChar("000000001", -47)); 7942e5b6d6dSopenharmony_ci CHECK_EQ(0.0f, StrtofChar("00000000200000", -51)); 7952e5b6d6dSopenharmony_ci CHECK_EQ(800000e-50f, StrtofChar("000000800000", -50)); 7962e5b6d6dSopenharmony_ci CHECK_EQ(0.0f, StrtofChar("00000000100000", -51)); 7972e5b6d6dSopenharmony_ci CHECK_EQ(1e-45f, StrtofChar("00000000900000", -51)); 7982e5b6d6dSopenharmony_ci 7992e5b6d6dSopenharmony_ci // It would be more readable to put the literals (and not Double::Infinity()) 8002e5b6d6dSopenharmony_ci // on the left side (i.e. CHECK_EQ(3e38, StrtofChar("3", 38))), but then Gcc 8012e5b6d6dSopenharmony_ci // complains that the floating constant exceeds range of 'double'. 8022e5b6d6dSopenharmony_ci CHECK_EQ(Single::Infinity(), StrtofChar("3", 39)); 8032e5b6d6dSopenharmony_ci CHECK_EQ(3e38f, StrtofChar("3", 38)); 8042e5b6d6dSopenharmony_ci CHECK_EQ(3401e35f, StrtofChar("3401", 35)); 8052e5b6d6dSopenharmony_ci CHECK_EQ(3401e34f, StrtofChar("3401", 34)); 8062e5b6d6dSopenharmony_ci CHECK_EQ(Single::Infinity(), StrtofChar("3410", 35)); 8072e5b6d6dSopenharmony_ci CHECK_EQ(34e37f, StrtofChar("34", 37)); 8082e5b6d6dSopenharmony_ci CHECK_EQ(Single::Infinity(), StrtofChar("0000001", 39)); 8092e5b6d6dSopenharmony_ci CHECK_EQ(3401e35f, StrtofChar("0000003401", 35)); 8102e5b6d6dSopenharmony_ci CHECK_EQ(3401e34f, StrtofChar("0000003401", 34)); 8112e5b6d6dSopenharmony_ci CHECK_EQ(Single::Infinity(), StrtofChar("0000003410", 35)); 8122e5b6d6dSopenharmony_ci CHECK_EQ(34e37f, StrtofChar("00000034", 37)); 8132e5b6d6dSopenharmony_ci CHECK_EQ(1e38f, StrtofChar("100000", 33)); 8142e5b6d6dSopenharmony_ci CHECK_EQ(3401e35f, StrtofChar("340100000", 30)); 8152e5b6d6dSopenharmony_ci CHECK_EQ(3401e34f, StrtofChar("340100000", 29)); 8162e5b6d6dSopenharmony_ci CHECK_EQ(Single::Infinity(), StrtofChar("341000000", 30)); 8172e5b6d6dSopenharmony_ci CHECK_EQ(34e37f, StrtofChar("3400000", 32)); 8182e5b6d6dSopenharmony_ci CHECK_EQ(1e38f, StrtofChar("00000100000", 33)); 8192e5b6d6dSopenharmony_ci CHECK_EQ(3401e35f, StrtofChar("00000340100000", 30)); 8202e5b6d6dSopenharmony_ci CHECK_EQ(3401e34f, StrtofChar("00000340100000", 29)); 8212e5b6d6dSopenharmony_ci CHECK_EQ(Single::Infinity(), StrtofChar("00000341000000", 30)); 8222e5b6d6dSopenharmony_ci CHECK_EQ(34e37f, StrtofChar("000003400000", 32)); 8232e5b6d6dSopenharmony_ci CHECK_EQ(3.4028234e+38f, StrtofChar("34028235676", 28)); 8242e5b6d6dSopenharmony_ci CHECK_EQ(3.4028234e+38f, StrtofChar("34028235677", 28)); 8252e5b6d6dSopenharmony_ci CHECK_EQ(Single::Infinity(), StrtofChar("34028235678", 28)); 8262e5b6d6dSopenharmony_ci 8272e5b6d6dSopenharmony_ci // The following number is the result of 89255.0/1e-22. Both floating-point 8282e5b6d6dSopenharmony_ci // numbers can be accurately represented with doubles. However on Linux,x86 8292e5b6d6dSopenharmony_ci // the floating-point stack is set to 80bits and the double-rounding 8302e5b6d6dSopenharmony_ci // introduces an error. 8312e5b6d6dSopenharmony_ci CHECK_EQ(89255e-22f, StrtofChar("89255", -22)); 8322e5b6d6dSopenharmony_ci 8332e5b6d6dSopenharmony_ci // Boundary cases. Boundaries themselves should round to even. 8342e5b6d6dSopenharmony_ci // 8352e5b6d6dSopenharmony_ci // 0x4f012334 = 2166567936 8362e5b6d6dSopenharmony_ci // next: 2166568192 8372e5b6d6dSopenharmony_ci // boundary: 2166568064 should round down. 8382e5b6d6dSopenharmony_ci CHECK_EQ(2166567936.0f, StrtofChar("2166567936", 0)); 8392e5b6d6dSopenharmony_ci CHECK_EQ(2166568192.0f, StrtofChar("2166568192", 0)); 8402e5b6d6dSopenharmony_ci CHECK_EQ(2166567936.0f, StrtofChar("2166568064", 0)); 8412e5b6d6dSopenharmony_ci CHECK_EQ(2166567936.0f, StrtofChar("216656806399999", -5)); 8422e5b6d6dSopenharmony_ci CHECK_EQ(2166568192.0f, StrtofChar("216656806400001", -5)); 8432e5b6d6dSopenharmony_ci // Verify that we don't double round. 8442e5b6d6dSopenharmony_ci // Get the boundary of the boundary. 8452e5b6d6dSopenharmony_ci CHECK_EQ(2.1665680640000002384185791015625e9, 2166568064.0); 8462e5b6d6dSopenharmony_ci // Visual Studio gets this wrong and believes that these two numbers are the 8472e5b6d6dSopenharmony_ci // same doubles. We want to test our conversion and not the compiler. We 8482e5b6d6dSopenharmony_ci // therefore disable the check. 8492e5b6d6dSopenharmony_ci#ifndef _MSC_VER 8502e5b6d6dSopenharmony_ci CHECK(2.16656806400000023841857910156251e9 != 2166568064.0); 8512e5b6d6dSopenharmony_ci#endif 8522e5b6d6dSopenharmony_ci CHECK_EQ(2166568192.0f, StrtofChar("21665680640000002384185791015625", -22)); 8532e5b6d6dSopenharmony_ci 8542e5b6d6dSopenharmony_ci // 0x4fffffff = 8589934080 8552e5b6d6dSopenharmony_ci // next: 8589934592 8562e5b6d6dSopenharmony_ci // boundary: 8589934336 should round up. 8572e5b6d6dSopenharmony_ci CHECK_EQ(8589934080.0f, StrtofChar("8589934080", 0)); 8582e5b6d6dSopenharmony_ci CHECK_EQ(8589934592.0f, StrtofChar("8589934592", 0)); 8592e5b6d6dSopenharmony_ci CHECK_EQ(8589934592.0f, StrtofChar("8589934336", 0)); 8602e5b6d6dSopenharmony_ci CHECK_EQ(8589934080.0f, StrtofChar("858993433599999", -5)); 8612e5b6d6dSopenharmony_ci CHECK_EQ(8589934592.0f, StrtofChar("858993433600001", -5)); 8622e5b6d6dSopenharmony_ci // Verify that we don't double round. 8632e5b6d6dSopenharmony_ci // Get the boundary of the boundary. 8642e5b6d6dSopenharmony_ci // Visual Studio gets this wrong. To avoid failing tests because of a broken 8652e5b6d6dSopenharmony_ci // compiler we disable the following two tests. They were only testing the 8662e5b6d6dSopenharmony_ci // compiler. The real test is still active. 8672e5b6d6dSopenharmony_ci#ifndef _MSC_VER 8682e5b6d6dSopenharmony_ci CHECK_EQ(8.589934335999999523162841796875e+09, 8589934336.0); 8692e5b6d6dSopenharmony_ci CHECK(8.5899343359999995231628417968749e+09 != 8589934336.0); 8702e5b6d6dSopenharmony_ci#endif 8712e5b6d6dSopenharmony_ci CHECK_EQ(8589934080.0f, StrtofChar("8589934335999999523162841796875", -21)); 8722e5b6d6dSopenharmony_ci 8732e5b6d6dSopenharmony_ci // 0x4f000000 = 2147483648 8742e5b6d6dSopenharmony_ci // next: 2147483904 8752e5b6d6dSopenharmony_ci // boundary: 2147483776 should round down. 8762e5b6d6dSopenharmony_ci CHECK_EQ(2147483648.0f, StrtofChar("2147483648", 0)); 8772e5b6d6dSopenharmony_ci CHECK_EQ(2147483904.0f, StrtofChar("2147483904", 0)); 8782e5b6d6dSopenharmony_ci CHECK_EQ(2147483648.0f, StrtofChar("2147483776", 0)); 8792e5b6d6dSopenharmony_ci CHECK_EQ(2147483648.0f, StrtofChar("214748377599999", -5)); 8802e5b6d6dSopenharmony_ci CHECK_EQ(2147483904.0f, StrtofChar("214748377600001", -5)); 8812e5b6d6dSopenharmony_ci 8822e5b6d6dSopenharmony_ci} 8832e5b6d6dSopenharmony_ci 8842e5b6d6dSopenharmony_ciTEST(StrtofTrimmed) { 8852e5b6d6dSopenharmony_ci Vector<const char> vector; 8862e5b6d6dSopenharmony_ci 8872e5b6d6dSopenharmony_ci vector = StringToVector("1"); 8882e5b6d6dSopenharmony_ci CHECK_EQ(1.0f, StrtofTrimmed(vector, 0)); 8892e5b6d6dSopenharmony_ci CHECK_EQ(10.0f, StrtofTrimmed(vector, 1)); 8902e5b6d6dSopenharmony_ci CHECK_EQ(100.0f, StrtofTrimmed(vector, 2)); 8912e5b6d6dSopenharmony_ci CHECK_EQ(1e20f, StrtofTrimmed(vector, 20)); 8922e5b6d6dSopenharmony_ci CHECK_EQ(1e22f, StrtofTrimmed(vector, 22)); 8932e5b6d6dSopenharmony_ci CHECK_EQ(1e23f, StrtofTrimmed(vector, 23)); 8942e5b6d6dSopenharmony_ci CHECK_EQ(1e35f, StrtofTrimmed(vector, 35)); 8952e5b6d6dSopenharmony_ci CHECK_EQ(1e36f, StrtofTrimmed(vector, 36)); 8962e5b6d6dSopenharmony_ci CHECK_EQ(1e37f, StrtofTrimmed(vector, 37)); 8972e5b6d6dSopenharmony_ci CHECK_EQ(1e-1f, StrtofTrimmed(vector, -1)); 8982e5b6d6dSopenharmony_ci CHECK_EQ(1e-2f, StrtofTrimmed(vector, -2)); 8992e5b6d6dSopenharmony_ci CHECK_EQ(1e-5f, StrtofTrimmed(vector, -5)); 9002e5b6d6dSopenharmony_ci CHECK_EQ(1e-20f, StrtofTrimmed(vector, -20)); 9012e5b6d6dSopenharmony_ci CHECK_EQ(1e-22f, StrtofTrimmed(vector, -22)); 9022e5b6d6dSopenharmony_ci CHECK_EQ(1e-23f, StrtofTrimmed(vector, -23)); 9032e5b6d6dSopenharmony_ci CHECK_EQ(1e-25f, StrtofTrimmed(vector, -25)); 9042e5b6d6dSopenharmony_ci CHECK_EQ(1e-39f, StrtofTrimmed(vector, -39)); 9052e5b6d6dSopenharmony_ci 9062e5b6d6dSopenharmony_ci vector = StringToVector("2"); 9072e5b6d6dSopenharmony_ci CHECK_EQ(2.0f, StrtofTrimmed(vector, 0)); 9082e5b6d6dSopenharmony_ci CHECK_EQ(20.0f, StrtofTrimmed(vector, 1)); 9092e5b6d6dSopenharmony_ci CHECK_EQ(200.0f, StrtofTrimmed(vector, 2)); 9102e5b6d6dSopenharmony_ci CHECK_EQ(2e20f, StrtofTrimmed(vector, 20)); 9112e5b6d6dSopenharmony_ci CHECK_EQ(2e22f, StrtofTrimmed(vector, 22)); 9122e5b6d6dSopenharmony_ci CHECK_EQ(2e23f, StrtofTrimmed(vector, 23)); 9132e5b6d6dSopenharmony_ci CHECK_EQ(2e35f, StrtofTrimmed(vector, 35)); 9142e5b6d6dSopenharmony_ci CHECK_EQ(2e36f, StrtofTrimmed(vector, 36)); 9152e5b6d6dSopenharmony_ci CHECK_EQ(2e37f, StrtofTrimmed(vector, 37)); 9162e5b6d6dSopenharmony_ci CHECK_EQ(2e-1f, StrtofTrimmed(vector, -1)); 9172e5b6d6dSopenharmony_ci CHECK_EQ(2e-2f, StrtofTrimmed(vector, -2)); 9182e5b6d6dSopenharmony_ci CHECK_EQ(2e-5f, StrtofTrimmed(vector, -5)); 9192e5b6d6dSopenharmony_ci CHECK_EQ(2e-20f, StrtofTrimmed(vector, -20)); 9202e5b6d6dSopenharmony_ci CHECK_EQ(2e-22f, StrtofTrimmed(vector, -22)); 9212e5b6d6dSopenharmony_ci CHECK_EQ(2e-23f, StrtofTrimmed(vector, -23)); 9222e5b6d6dSopenharmony_ci CHECK_EQ(2e-25f, StrtofTrimmed(vector, -25)); 9232e5b6d6dSopenharmony_ci CHECK_EQ(2e-39f, StrtofTrimmed(vector, -39)); 9242e5b6d6dSopenharmony_ci 9252e5b6d6dSopenharmony_ci vector = StringToVector("9"); 9262e5b6d6dSopenharmony_ci CHECK_EQ(9.0f, StrtofTrimmed(vector, 0)); 9272e5b6d6dSopenharmony_ci CHECK_EQ(90.0f, StrtofTrimmed(vector, 1)); 9282e5b6d6dSopenharmony_ci CHECK_EQ(900.0f, StrtofTrimmed(vector, 2)); 9292e5b6d6dSopenharmony_ci CHECK_EQ(9e20f, StrtofTrimmed(vector, 20)); 9302e5b6d6dSopenharmony_ci CHECK_EQ(9e22f, StrtofTrimmed(vector, 22)); 9312e5b6d6dSopenharmony_ci CHECK_EQ(9e23f, StrtofTrimmed(vector, 23)); 9322e5b6d6dSopenharmony_ci CHECK_EQ(9e35f, StrtofTrimmed(vector, 35)); 9332e5b6d6dSopenharmony_ci CHECK_EQ(9e36f, StrtofTrimmed(vector, 36)); 9342e5b6d6dSopenharmony_ci CHECK_EQ(9e37f, StrtofTrimmed(vector, 37)); 9352e5b6d6dSopenharmony_ci CHECK_EQ(9e-1f, StrtofTrimmed(vector, -1)); 9362e5b6d6dSopenharmony_ci CHECK_EQ(9e-2f, StrtofTrimmed(vector, -2)); 9372e5b6d6dSopenharmony_ci CHECK_EQ(9e-5f, StrtofTrimmed(vector, -5)); 9382e5b6d6dSopenharmony_ci CHECK_EQ(9e-20f, StrtofTrimmed(vector, -20)); 9392e5b6d6dSopenharmony_ci CHECK_EQ(9e-22f, StrtofTrimmed(vector, -22)); 9402e5b6d6dSopenharmony_ci CHECK_EQ(9e-23f, StrtofTrimmed(vector, -23)); 9412e5b6d6dSopenharmony_ci CHECK_EQ(9e-25f, StrtofTrimmed(vector, -25)); 9422e5b6d6dSopenharmony_ci CHECK_EQ(9e-39f, StrtofTrimmed(vector, -39)); 9432e5b6d6dSopenharmony_ci 9442e5b6d6dSopenharmony_ci vector = StringToVector("12345"); 9452e5b6d6dSopenharmony_ci CHECK_EQ(12345.0f, StrtofTrimmed(vector, 0)); 9462e5b6d6dSopenharmony_ci CHECK_EQ(123450.0f, StrtofTrimmed(vector, 1)); 9472e5b6d6dSopenharmony_ci CHECK_EQ(1234500.0f, StrtofTrimmed(vector, 2)); 9482e5b6d6dSopenharmony_ci CHECK_EQ(12345e20f, StrtofTrimmed(vector, 20)); 9492e5b6d6dSopenharmony_ci CHECK_EQ(12345e22f, StrtofTrimmed(vector, 22)); 9502e5b6d6dSopenharmony_ci CHECK_EQ(12345e23f, StrtofTrimmed(vector, 23)); 9512e5b6d6dSopenharmony_ci CHECK_EQ(12345e30f, StrtofTrimmed(vector, 30)); 9522e5b6d6dSopenharmony_ci CHECK_EQ(12345e31f, StrtofTrimmed(vector, 31)); 9532e5b6d6dSopenharmony_ci CHECK_EQ(12345e32f, StrtofTrimmed(vector, 32)); 9542e5b6d6dSopenharmony_ci CHECK_EQ(12345e-1f, StrtofTrimmed(vector, -1)); 9552e5b6d6dSopenharmony_ci CHECK_EQ(12345e-2f, StrtofTrimmed(vector, -2)); 9562e5b6d6dSopenharmony_ci CHECK_EQ(12345e-5f, StrtofTrimmed(vector, -5)); 9572e5b6d6dSopenharmony_ci CHECK_EQ(12345e-20f, StrtofTrimmed(vector, -20)); 9582e5b6d6dSopenharmony_ci CHECK_EQ(12345e-22f, StrtofTrimmed(vector, -22)); 9592e5b6d6dSopenharmony_ci CHECK_EQ(12345e-23f, StrtofTrimmed(vector, -23)); 9602e5b6d6dSopenharmony_ci CHECK_EQ(12345e-25f, StrtofTrimmed(vector, -25)); 9612e5b6d6dSopenharmony_ci CHECK_EQ(12345e-39f, StrtofTrimmed(vector, -39)); 9622e5b6d6dSopenharmony_ci 9632e5b6d6dSopenharmony_ci vector = StringToVector("12345678901234"); 9642e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234.0f, StrtofTrimmed(vector, 0)); 9652e5b6d6dSopenharmony_ci CHECK_EQ(123456789012340.0f, StrtofTrimmed(vector, 1)); 9662e5b6d6dSopenharmony_ci CHECK_EQ(1234567890123400.0f, StrtofTrimmed(vector, 2)); 9672e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e20f, StrtofTrimmed(vector, 20)); 9682e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e22f, StrtofTrimmed(vector, 22)); 9692e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e23f, StrtofTrimmed(vector, 23)); 9702e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e-1f, StrtofTrimmed(vector, -1)); 9712e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e-2f, StrtofTrimmed(vector, -2)); 9722e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e-5f, StrtofTrimmed(vector, -5)); 9732e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e-20f, StrtofTrimmed(vector, -20)); 9742e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e-22f, StrtofTrimmed(vector, -22)); 9752e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e-23f, StrtofTrimmed(vector, -23)); 9762e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e-25f, StrtofTrimmed(vector, -25)); 9772e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234e-39f, StrtofTrimmed(vector, -39)); 9782e5b6d6dSopenharmony_ci 9792e5b6d6dSopenharmony_ci vector = StringToVector("123456789012345"); 9802e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345.0f, StrtofTrimmed(vector, 0)); 9812e5b6d6dSopenharmony_ci CHECK_EQ(1234567890123450.0f, StrtofTrimmed(vector, 1)); 9822e5b6d6dSopenharmony_ci CHECK_EQ(12345678901234500.0f, StrtofTrimmed(vector, 2)); 9832e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345e20f, StrtofTrimmed(vector, 20)); 9842e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345e22f, StrtofTrimmed(vector, 22)); 9852e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345e23f, StrtofTrimmed(vector, 23)); 9862e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345e-1f, StrtofTrimmed(vector, -1)); 9872e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345e-2f, StrtofTrimmed(vector, -2)); 9882e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345e-5f, StrtofTrimmed(vector, -5)); 9892e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345e-20f, StrtofTrimmed(vector, -20)); 9902e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345e-22f, StrtofTrimmed(vector, -22)); 9912e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345e-23f, StrtofTrimmed(vector, -23)); 9922e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345e-25f, StrtofTrimmed(vector, -25)); 9932e5b6d6dSopenharmony_ci CHECK_EQ(123456789012345e-39f, StrtofTrimmed(vector, -39)); 9942e5b6d6dSopenharmony_ci 9952e5b6d6dSopenharmony_ci CHECK_EQ(0.0f, StrtofTrimmedChar("", 1324)); 9962e5b6d6dSopenharmony_ci CHECK_EQ(0.0f, StrtofTrimmedChar("2", -324)); 9972e5b6d6dSopenharmony_ci CHECK_EQ(1e-45f, StrtofTrimmedChar("1", -45)); 9982e5b6d6dSopenharmony_ci // It would be more readable to put non-zero literals on the left side (i.e. 9992e5b6d6dSopenharmony_ci // CHECK_EQ(1e-46, StrtofChar("1", -45))), but then Gcc complains that 10002e5b6d6dSopenharmony_ci // they are truncated to zero. 10012e5b6d6dSopenharmony_ci CHECK_EQ(0.0f, StrtofTrimmedChar("1", -46)); 10022e5b6d6dSopenharmony_ci CHECK_EQ(0.0f, StrtofTrimmedChar("1", -47)); 10032e5b6d6dSopenharmony_ci CHECK_EQ(1e-45f, StrtofTrimmedChar("1", -45)); 10042e5b6d6dSopenharmony_ci CHECK_EQ(1e-45f, StrtofTrimmedChar("8", -46)); 10052e5b6d6dSopenharmony_ci 10062e5b6d6dSopenharmony_ci // It would be more readable to put the literals (and not Double::Infinity()) 10072e5b6d6dSopenharmony_ci // on the left side (i.e. CHECK_EQ(3e38, StrtofChar("3", 38))), but then Gcc 10082e5b6d6dSopenharmony_ci // complains that the floating constant exceeds range of 'double'. 10092e5b6d6dSopenharmony_ci CHECK_EQ(Single::Infinity(), StrtofTrimmedChar("3", 39)); 10102e5b6d6dSopenharmony_ci CHECK_EQ(3e38f, StrtofTrimmedChar("3", 38)); 10112e5b6d6dSopenharmony_ci CHECK_EQ(3401e35f, StrtofTrimmedChar("3401", 35)); 10122e5b6d6dSopenharmony_ci CHECK_EQ(3401e34f, StrtofTrimmedChar("3401", 34)); 10132e5b6d6dSopenharmony_ci CHECK_EQ(34e37f, StrtofTrimmedChar("34", 37)); 10142e5b6d6dSopenharmony_ci CHECK_EQ(3.4028234e+38f, StrtofTrimmedChar("34028235676", 28)); 10152e5b6d6dSopenharmony_ci CHECK_EQ(3.4028234e+38f, StrtofTrimmedChar("34028235677", 28)); 10162e5b6d6dSopenharmony_ci CHECK_EQ(Single::Infinity(), StrtofTrimmedChar("34028235678", 28)); 10172e5b6d6dSopenharmony_ci 10182e5b6d6dSopenharmony_ci // The following number is the result of 89255.0/1e-22. Both floating-point 10192e5b6d6dSopenharmony_ci // numbers can be accurately represented with doubles. However on Linux,x86 10202e5b6d6dSopenharmony_ci // the floating-point stack is set to 80bits and the double-rounding 10212e5b6d6dSopenharmony_ci // introduces an error. 10222e5b6d6dSopenharmony_ci CHECK_EQ(89255e-22f, StrtofTrimmedChar("89255", -22)); 10232e5b6d6dSopenharmony_ci 10242e5b6d6dSopenharmony_ci // Boundary cases. Boundaries themselves should round to even. 10252e5b6d6dSopenharmony_ci // 10262e5b6d6dSopenharmony_ci // 0x4f012334 = 2166567936 10272e5b6d6dSopenharmony_ci // next: 2166568192 10282e5b6d6dSopenharmony_ci // boundary: 2166568064 should round down. 10292e5b6d6dSopenharmony_ci CHECK_EQ(2166567936.0f, StrtofTrimmedChar("2166567936", 0)); 10302e5b6d6dSopenharmony_ci CHECK_EQ(2166568192.0f, StrtofTrimmedChar("2166568192", 0)); 10312e5b6d6dSopenharmony_ci CHECK_EQ(2166567936.0f, StrtofTrimmedChar("2166568064", 0)); 10322e5b6d6dSopenharmony_ci CHECK_EQ(2166567936.0f, StrtofTrimmedChar("216656806399999", -5)); 10332e5b6d6dSopenharmony_ci CHECK_EQ(2166568192.0f, StrtofTrimmedChar("216656806400001", -5)); 10342e5b6d6dSopenharmony_ci // Verify that we don't double round. 10352e5b6d6dSopenharmony_ci // Get the boundary of the boundary. 10362e5b6d6dSopenharmony_ci CHECK_EQ(2.1665680640000002384185791015625e9, 2166568064.0); 10372e5b6d6dSopenharmony_ci // Visual Studio gets this wrong and believes that these two numbers are the 10382e5b6d6dSopenharmony_ci // same doubles. We want to test our conversion and not the compiler. We 10392e5b6d6dSopenharmony_ci // therefore disable the check. 10402e5b6d6dSopenharmony_ci#ifndef _MSC_VER 10412e5b6d6dSopenharmony_ci CHECK(2.16656806400000023841857910156251e9 != 2166568064.0); 10422e5b6d6dSopenharmony_ci#endif 10432e5b6d6dSopenharmony_ci CHECK_EQ(2166568192.0f, StrtofTrimmedChar("21665680640000002384185791015625", -22)); 10442e5b6d6dSopenharmony_ci 10452e5b6d6dSopenharmony_ci // 0x4fffffff = 8589934080 10462e5b6d6dSopenharmony_ci // next: 8589934592 10472e5b6d6dSopenharmony_ci // boundary: 8589934336 should round up. 10482e5b6d6dSopenharmony_ci CHECK_EQ(8589934592.0f, StrtofTrimmedChar("8589934592", 0)); 10492e5b6d6dSopenharmony_ci CHECK_EQ(8589934592.0f, StrtofTrimmedChar("8589934336", 0)); 10502e5b6d6dSopenharmony_ci CHECK_EQ(8589934080.0f, StrtofTrimmedChar("858993433599999", -5)); 10512e5b6d6dSopenharmony_ci CHECK_EQ(8589934592.0f, StrtofTrimmedChar("858993433600001", -5)); 10522e5b6d6dSopenharmony_ci // Verify that we don't double round. 10532e5b6d6dSopenharmony_ci // Get the boundary of the boundary. 10542e5b6d6dSopenharmony_ci // Visual Studio gets this wrong. To avoid failing tests because of a broken 10552e5b6d6dSopenharmony_ci // compiler we disable the following two tests. They were only testing the 10562e5b6d6dSopenharmony_ci // compiler. The real test is still active. 10572e5b6d6dSopenharmony_ci#ifndef _MSC_VER 10582e5b6d6dSopenharmony_ci CHECK_EQ(8.589934335999999523162841796875e+09, 8589934336.0); 10592e5b6d6dSopenharmony_ci CHECK(8.5899343359999995231628417968749e+09 != 8589934336.0); 10602e5b6d6dSopenharmony_ci#endif 10612e5b6d6dSopenharmony_ci CHECK_EQ(8589934080.0f, StrtofTrimmedChar("8589934335999999523162841796875", -21)); 10622e5b6d6dSopenharmony_ci 10632e5b6d6dSopenharmony_ci // 0x4f000000 = 2147483648 10642e5b6d6dSopenharmony_ci // next: 2147483904 10652e5b6d6dSopenharmony_ci // boundary: 2147483776 should round down. 10662e5b6d6dSopenharmony_ci CHECK_EQ(2147483648.0f, StrtofTrimmedChar("2147483648", 0)); 10672e5b6d6dSopenharmony_ci CHECK_EQ(2147483904.0f, StrtofTrimmedChar("2147483904", 0)); 10682e5b6d6dSopenharmony_ci CHECK_EQ(2147483648.0f, StrtofTrimmedChar("2147483776", 0)); 10692e5b6d6dSopenharmony_ci CHECK_EQ(2147483648.0f, StrtofTrimmedChar("214748377599999", -5)); 10702e5b6d6dSopenharmony_ci CHECK_EQ(2147483904.0f, StrtofTrimmedChar("214748377600001", -5)); 10712e5b6d6dSopenharmony_ci} 10722e5b6d6dSopenharmony_ci 10732e5b6d6dSopenharmony_cistatic int CompareBignumToDiyFp(const Bignum& bignum_digits, 10742e5b6d6dSopenharmony_ci int bignum_exponent, 10752e5b6d6dSopenharmony_ci DiyFp diy_fp) { 10762e5b6d6dSopenharmony_ci Bignum bignum; 10772e5b6d6dSopenharmony_ci bignum.AssignBignum(bignum_digits); 10782e5b6d6dSopenharmony_ci Bignum other; 10792e5b6d6dSopenharmony_ci other.AssignUInt64(diy_fp.f()); 10802e5b6d6dSopenharmony_ci if (bignum_exponent >= 0) { 10812e5b6d6dSopenharmony_ci bignum.MultiplyByPowerOfTen(bignum_exponent); 10822e5b6d6dSopenharmony_ci } else { 10832e5b6d6dSopenharmony_ci other.MultiplyByPowerOfTen(-bignum_exponent); 10842e5b6d6dSopenharmony_ci } 10852e5b6d6dSopenharmony_ci if (diy_fp.e() >= 0) { 10862e5b6d6dSopenharmony_ci other.ShiftLeft(diy_fp.e()); 10872e5b6d6dSopenharmony_ci } else { 10882e5b6d6dSopenharmony_ci bignum.ShiftLeft(-diy_fp.e()); 10892e5b6d6dSopenharmony_ci } 10902e5b6d6dSopenharmony_ci return Bignum::Compare(bignum, other); 10912e5b6d6dSopenharmony_ci} 10922e5b6d6dSopenharmony_ci 10932e5b6d6dSopenharmony_ci 10942e5b6d6dSopenharmony_cistatic bool CheckDouble(Vector<const char> buffer, 10952e5b6d6dSopenharmony_ci int exponent, 10962e5b6d6dSopenharmony_ci double to_check) { 10972e5b6d6dSopenharmony_ci DiyFp lower_boundary; 10982e5b6d6dSopenharmony_ci DiyFp upper_boundary; 10992e5b6d6dSopenharmony_ci Bignum input_digits; 11002e5b6d6dSopenharmony_ci input_digits.AssignDecimalString(buffer); 11012e5b6d6dSopenharmony_ci if (to_check == 0.0) { 11022e5b6d6dSopenharmony_ci const double kMinDouble = 4e-324; 11032e5b6d6dSopenharmony_ci // Check that the buffer*10^exponent < (0 + kMinDouble)/2. 11042e5b6d6dSopenharmony_ci Double d(kMinDouble); 11052e5b6d6dSopenharmony_ci d.NormalizedBoundaries(&lower_boundary, &upper_boundary); 11062e5b6d6dSopenharmony_ci return CompareBignumToDiyFp(input_digits, exponent, lower_boundary) <= 0; 11072e5b6d6dSopenharmony_ci } 11082e5b6d6dSopenharmony_ci if (to_check == Double::Infinity()) { 11092e5b6d6dSopenharmony_ci const double kMaxDouble = 1.7976931348623157e308; 11102e5b6d6dSopenharmony_ci // Check that the buffer*10^exponent >= boundary between kMaxDouble and inf. 11112e5b6d6dSopenharmony_ci Double d(kMaxDouble); 11122e5b6d6dSopenharmony_ci d.NormalizedBoundaries(&lower_boundary, &upper_boundary); 11132e5b6d6dSopenharmony_ci return CompareBignumToDiyFp(input_digits, exponent, upper_boundary) >= 0; 11142e5b6d6dSopenharmony_ci } 11152e5b6d6dSopenharmony_ci Double d(to_check); 11162e5b6d6dSopenharmony_ci d.NormalizedBoundaries(&lower_boundary, &upper_boundary); 11172e5b6d6dSopenharmony_ci if ((d.Significand() & 1) == 0) { 11182e5b6d6dSopenharmony_ci return CompareBignumToDiyFp(input_digits, exponent, lower_boundary) >= 0 && 11192e5b6d6dSopenharmony_ci CompareBignumToDiyFp(input_digits, exponent, upper_boundary) <= 0; 11202e5b6d6dSopenharmony_ci } else { 11212e5b6d6dSopenharmony_ci return CompareBignumToDiyFp(input_digits, exponent, lower_boundary) > 0 && 11222e5b6d6dSopenharmony_ci CompareBignumToDiyFp(input_digits, exponent, upper_boundary) < 0; 11232e5b6d6dSopenharmony_ci } 11242e5b6d6dSopenharmony_ci} 11252e5b6d6dSopenharmony_ci 11262e5b6d6dSopenharmony_ci 11272e5b6d6dSopenharmony_ci// Copied from v8.cc and adapted to make the function deterministic. 11282e5b6d6dSopenharmony_cistatic uint32_t DeterministicRandom() { 11292e5b6d6dSopenharmony_ci // Random number generator using George Marsaglia's MWC algorithm. 11302e5b6d6dSopenharmony_ci static uint32_t hi = 0; 11312e5b6d6dSopenharmony_ci static uint32_t lo = 0; 11322e5b6d6dSopenharmony_ci 11332e5b6d6dSopenharmony_ci // Initialization values don't have any special meaning. (They are the result 11342e5b6d6dSopenharmony_ci // of two calls to random().) 11352e5b6d6dSopenharmony_ci if (hi == 0) hi = 0xbfe166e7; 11362e5b6d6dSopenharmony_ci if (lo == 0) lo = 0x64d1c3c9; 11372e5b6d6dSopenharmony_ci 11382e5b6d6dSopenharmony_ci // Mix the bits. 11392e5b6d6dSopenharmony_ci hi = 36969 * (hi & 0xFFFF) + (hi >> 16); 11402e5b6d6dSopenharmony_ci lo = 18273 * (lo & 0xFFFF) + (lo >> 16); 11412e5b6d6dSopenharmony_ci return (hi << 16) + (lo & 0xFFFF); 11422e5b6d6dSopenharmony_ci} 11432e5b6d6dSopenharmony_ci 11442e5b6d6dSopenharmony_ci 11452e5b6d6dSopenharmony_cistatic const int kBufferSize = 1024; 11462e5b6d6dSopenharmony_cistatic const int kShortStrtodRandomCount = 2; 11472e5b6d6dSopenharmony_cistatic const int kLargeStrtodRandomCount = 2; 11482e5b6d6dSopenharmony_ci 11492e5b6d6dSopenharmony_ciTEST(RandomStrtod) { 11502e5b6d6dSopenharmony_ci char buffer[kBufferSize]; 11512e5b6d6dSopenharmony_ci for (int length = 1; length < 15; length++) { 11522e5b6d6dSopenharmony_ci for (int i = 0; i < kShortStrtodRandomCount; ++i) { 11532e5b6d6dSopenharmony_ci int pos = 0; 11542e5b6d6dSopenharmony_ci for (int j = 0; j < length; ++j) { 11552e5b6d6dSopenharmony_ci buffer[pos++] = DeterministicRandom() % 10 + '0'; 11562e5b6d6dSopenharmony_ci } 11572e5b6d6dSopenharmony_ci int exponent = DeterministicRandom() % (25*2 + 1) - 25 - length; 11582e5b6d6dSopenharmony_ci buffer[pos] = '\0'; 11592e5b6d6dSopenharmony_ci Vector<const char> vector(buffer, pos); 11602e5b6d6dSopenharmony_ci double strtod_result = Strtod(vector, exponent); 11612e5b6d6dSopenharmony_ci CHECK(CheckDouble(vector, exponent, strtod_result)); 11622e5b6d6dSopenharmony_ci } 11632e5b6d6dSopenharmony_ci } 11642e5b6d6dSopenharmony_ci for (int length = 15; length < 800; length += 2) { 11652e5b6d6dSopenharmony_ci for (int i = 0; i < kLargeStrtodRandomCount; ++i) { 11662e5b6d6dSopenharmony_ci int pos = 0; 11672e5b6d6dSopenharmony_ci for (int j = 0; j < length; ++j) { 11682e5b6d6dSopenharmony_ci buffer[pos++] = DeterministicRandom() % 10 + '0'; 11692e5b6d6dSopenharmony_ci } 11702e5b6d6dSopenharmony_ci int exponent = DeterministicRandom() % (308*2 + 1) - 308 - length; 11712e5b6d6dSopenharmony_ci buffer[pos] = '\0'; 11722e5b6d6dSopenharmony_ci Vector<const char> vector(buffer, pos); 11732e5b6d6dSopenharmony_ci double strtod_result = Strtod(vector, exponent); 11742e5b6d6dSopenharmony_ci CHECK(CheckDouble(vector, exponent, strtod_result)); 11752e5b6d6dSopenharmony_ci } 11762e5b6d6dSopenharmony_ci } 11772e5b6d6dSopenharmony_ci} 11782e5b6d6dSopenharmony_ci 11792e5b6d6dSopenharmony_ci 11802e5b6d6dSopenharmony_cistatic bool CheckFloat(Vector<const char> buffer, 11812e5b6d6dSopenharmony_ci int exponent, 11822e5b6d6dSopenharmony_ci float to_check) { 11832e5b6d6dSopenharmony_ci DiyFp lower_boundary; 11842e5b6d6dSopenharmony_ci DiyFp upper_boundary; 11852e5b6d6dSopenharmony_ci Bignum input_digits; 11862e5b6d6dSopenharmony_ci input_digits.AssignDecimalString(buffer); 11872e5b6d6dSopenharmony_ci if (to_check == 0.0) { 11882e5b6d6dSopenharmony_ci const float kMinFloat = 1e-45f; 11892e5b6d6dSopenharmony_ci // Check that the buffer*10^exponent < (0 + kMinFloat)/2. 11902e5b6d6dSopenharmony_ci Single s(kMinFloat); 11912e5b6d6dSopenharmony_ci s.NormalizedBoundaries(&lower_boundary, &upper_boundary); 11922e5b6d6dSopenharmony_ci return CompareBignumToDiyFp(input_digits, exponent, lower_boundary) <= 0; 11932e5b6d6dSopenharmony_ci } 11942e5b6d6dSopenharmony_ci if (to_check == static_cast<float>(Double::Infinity())) { 11952e5b6d6dSopenharmony_ci const float kMaxFloat = 3.4028234e38f; 11962e5b6d6dSopenharmony_ci // Check that the buffer*10^exponent >= boundary between kMaxFloat and inf. 11972e5b6d6dSopenharmony_ci Single s(kMaxFloat); 11982e5b6d6dSopenharmony_ci s.NormalizedBoundaries(&lower_boundary, &upper_boundary); 11992e5b6d6dSopenharmony_ci return CompareBignumToDiyFp(input_digits, exponent, upper_boundary) >= 0; 12002e5b6d6dSopenharmony_ci } 12012e5b6d6dSopenharmony_ci Single s(to_check); 12022e5b6d6dSopenharmony_ci s.NormalizedBoundaries(&lower_boundary, &upper_boundary); 12032e5b6d6dSopenharmony_ci if ((s.Significand() & 1) == 0) { 12042e5b6d6dSopenharmony_ci return CompareBignumToDiyFp(input_digits, exponent, lower_boundary) >= 0 && 12052e5b6d6dSopenharmony_ci CompareBignumToDiyFp(input_digits, exponent, upper_boundary) <= 0; 12062e5b6d6dSopenharmony_ci } else { 12072e5b6d6dSopenharmony_ci return CompareBignumToDiyFp(input_digits, exponent, lower_boundary) > 0 && 12082e5b6d6dSopenharmony_ci CompareBignumToDiyFp(input_digits, exponent, upper_boundary) < 0; 12092e5b6d6dSopenharmony_ci } 12102e5b6d6dSopenharmony_ci} 12112e5b6d6dSopenharmony_ci 12122e5b6d6dSopenharmony_ci 12132e5b6d6dSopenharmony_cistatic const int kShortStrtofRandomCount = 2; 12142e5b6d6dSopenharmony_cistatic const int kLargeStrtofRandomCount = 2; 12152e5b6d6dSopenharmony_ci 12162e5b6d6dSopenharmony_ciTEST(RandomStrtof) { 12172e5b6d6dSopenharmony_ci char buffer[kBufferSize]; 12182e5b6d6dSopenharmony_ci for (int length = 1; length < 15; length++) { 12192e5b6d6dSopenharmony_ci for (int i = 0; i < kShortStrtofRandomCount; ++i) { 12202e5b6d6dSopenharmony_ci int pos = 0; 12212e5b6d6dSopenharmony_ci for (int j = 0; j < length; ++j) { 12222e5b6d6dSopenharmony_ci buffer[pos++] = DeterministicRandom() % 10 + '0'; 12232e5b6d6dSopenharmony_ci } 12242e5b6d6dSopenharmony_ci int exponent = DeterministicRandom() % (5*2 + 1) - 5 - length; 12252e5b6d6dSopenharmony_ci buffer[pos] = '\0'; 12262e5b6d6dSopenharmony_ci Vector<const char> vector(buffer, pos); 12272e5b6d6dSopenharmony_ci float strtof_result = Strtof(vector, exponent); 12282e5b6d6dSopenharmony_ci CHECK(CheckFloat(vector, exponent, strtof_result)); 12292e5b6d6dSopenharmony_ci } 12302e5b6d6dSopenharmony_ci } 12312e5b6d6dSopenharmony_ci for (int length = 15; length < 800; length += 2) { 12322e5b6d6dSopenharmony_ci for (int i = 0; i < kLargeStrtofRandomCount; ++i) { 12332e5b6d6dSopenharmony_ci int pos = 0; 12342e5b6d6dSopenharmony_ci for (int j = 0; j < length; ++j) { 12352e5b6d6dSopenharmony_ci buffer[pos++] = DeterministicRandom() % 10 + '0'; 12362e5b6d6dSopenharmony_ci } 12372e5b6d6dSopenharmony_ci int exponent = DeterministicRandom() % (38*2 + 1) - 38 - length; 12382e5b6d6dSopenharmony_ci buffer[pos] = '\0'; 12392e5b6d6dSopenharmony_ci Vector<const char> vector(buffer, pos); 12402e5b6d6dSopenharmony_ci float strtof_result = Strtof(vector, exponent); 12412e5b6d6dSopenharmony_ci CHECK(CheckFloat(vector, exponent, strtof_result)); 12422e5b6d6dSopenharmony_ci } 12432e5b6d6dSopenharmony_ci } 12442e5b6d6dSopenharmony_ci} 1245