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