1*a6021da3SAndroid Build Coastguard Worker // Copyright 2006-2008 the V8 project authors. All rights reserved.
2*a6021da3SAndroid Build Coastguard Worker // Redistribution and use in source and binary forms, with or without
3*a6021da3SAndroid Build Coastguard Worker // modification, are permitted provided that the following conditions are
4*a6021da3SAndroid Build Coastguard Worker // met:
5*a6021da3SAndroid Build Coastguard Worker //
6*a6021da3SAndroid Build Coastguard Worker // * Redistributions of source code must retain the above copyright
7*a6021da3SAndroid Build Coastguard Worker // notice, this list of conditions and the following disclaimer.
8*a6021da3SAndroid Build Coastguard Worker // * Redistributions in binary form must reproduce the above
9*a6021da3SAndroid Build Coastguard Worker // copyright notice, this list of conditions and the following
10*a6021da3SAndroid Build Coastguard Worker // disclaimer in the documentation and/or other materials provided
11*a6021da3SAndroid Build Coastguard Worker // with the distribution.
12*a6021da3SAndroid Build Coastguard Worker // * Neither the name of Google Inc. nor the names of its
13*a6021da3SAndroid Build Coastguard Worker // contributors may be used to endorse or promote products derived
14*a6021da3SAndroid Build Coastguard Worker // from this software without specific prior written permission.
15*a6021da3SAndroid Build Coastguard Worker //
16*a6021da3SAndroid Build Coastguard Worker // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17*a6021da3SAndroid Build Coastguard Worker // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18*a6021da3SAndroid Build Coastguard Worker // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19*a6021da3SAndroid Build Coastguard Worker // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20*a6021da3SAndroid Build Coastguard Worker // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21*a6021da3SAndroid Build Coastguard Worker // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22*a6021da3SAndroid Build Coastguard Worker // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23*a6021da3SAndroid Build Coastguard Worker // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24*a6021da3SAndroid Build Coastguard Worker // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25*a6021da3SAndroid Build Coastguard Worker // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26*a6021da3SAndroid Build Coastguard Worker // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27*a6021da3SAndroid Build Coastguard Worker
28*a6021da3SAndroid Build Coastguard Worker #include <stdlib.h>
29*a6021da3SAndroid Build Coastguard Worker
30*a6021da3SAndroid Build Coastguard Worker #include "double-conversion/bignum.h"
31*a6021da3SAndroid Build Coastguard Worker #include "cctest.h"
32*a6021da3SAndroid Build Coastguard Worker #include "double-conversion/diy-fp.h"
33*a6021da3SAndroid Build Coastguard Worker #include "double-conversion/ieee.h"
34*a6021da3SAndroid Build Coastguard Worker #include "double-conversion/strtod.h"
35*a6021da3SAndroid Build Coastguard Worker #include "double-conversion/utils.h"
36*a6021da3SAndroid Build Coastguard Worker
37*a6021da3SAndroid Build Coastguard Worker using namespace double_conversion;
38*a6021da3SAndroid Build Coastguard Worker
StringToVector(const char * str)39*a6021da3SAndroid Build Coastguard Worker static Vector<const char> StringToVector(const char* str) {
40*a6021da3SAndroid Build Coastguard Worker int len = static_cast<int>(strlen(str));
41*a6021da3SAndroid Build Coastguard Worker return Vector<const char>(str, len);
42*a6021da3SAndroid Build Coastguard Worker }
43*a6021da3SAndroid Build Coastguard Worker
44*a6021da3SAndroid Build Coastguard Worker
StrtodChar(const char * str,int exponent)45*a6021da3SAndroid Build Coastguard Worker static double StrtodChar(const char* str, int exponent) {
46*a6021da3SAndroid Build Coastguard Worker return Strtod(StringToVector(str), exponent);
47*a6021da3SAndroid Build Coastguard Worker }
48*a6021da3SAndroid Build Coastguard Worker
49*a6021da3SAndroid Build Coastguard Worker
StrtodTrimmedChar(const char * str,int exponent)50*a6021da3SAndroid Build Coastguard Worker static double StrtodTrimmedChar(const char* str, int exponent) {
51*a6021da3SAndroid Build Coastguard Worker return StrtodTrimmed(StringToVector(str), exponent);
52*a6021da3SAndroid Build Coastguard Worker }
53*a6021da3SAndroid Build Coastguard Worker
54*a6021da3SAndroid Build Coastguard Worker
StrtofChar(const char * str,int exponent)55*a6021da3SAndroid Build Coastguard Worker static float StrtofChar(const char* str, int exponent) {
56*a6021da3SAndroid Build Coastguard Worker return Strtof(StringToVector(str), exponent);
57*a6021da3SAndroid Build Coastguard Worker }
58*a6021da3SAndroid Build Coastguard Worker
StrtofTrimmedChar(const char * str,int exponent)59*a6021da3SAndroid Build Coastguard Worker static float StrtofTrimmedChar(const char* str, int exponent) {
60*a6021da3SAndroid Build Coastguard Worker return StrtofTrimmed(StringToVector(str), exponent);
61*a6021da3SAndroid Build Coastguard Worker }
62*a6021da3SAndroid Build Coastguard Worker
63*a6021da3SAndroid Build Coastguard Worker
TEST(Strtod)64*a6021da3SAndroid Build Coastguard Worker TEST(Strtod) {
65*a6021da3SAndroid Build Coastguard Worker Vector<const char> vector;
66*a6021da3SAndroid Build Coastguard Worker
67*a6021da3SAndroid Build Coastguard Worker vector = StringToVector("0");
68*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(0.0, Strtod(vector, 1));
69*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(0.0, Strtod(vector, 2));
70*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(0.0, Strtod(vector, -2));
71*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(0.0, Strtod(vector, -999));
72*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(0.0, Strtod(vector, +999));
73*a6021da3SAndroid Build Coastguard Worker
74*a6021da3SAndroid Build Coastguard Worker vector = StringToVector("1");
75*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1.0, Strtod(vector, 0));
76*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(10.0, Strtod(vector, 1));
77*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(100.0, Strtod(vector, 2));
78*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e20, Strtod(vector, 20));
79*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e22, Strtod(vector, 22));
80*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e23, Strtod(vector, 23));
81*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e35, Strtod(vector, 35));
82*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e36, Strtod(vector, 36));
83*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e37, Strtod(vector, 37));
84*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e-1, Strtod(vector, -1));
85*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e-2, Strtod(vector, -2));
86*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e-5, Strtod(vector, -5));
87*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e-20, Strtod(vector, -20));
88*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e-22, Strtod(vector, -22));
89*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e-23, Strtod(vector, -23));
90*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e-25, Strtod(vector, -25));
91*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e-39, Strtod(vector, -39));
92*a6021da3SAndroid Build Coastguard Worker
93*a6021da3SAndroid Build Coastguard Worker vector = StringToVector("2");
94*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2.0, Strtod(vector, 0));
95*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(20.0, Strtod(vector, 1));
96*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(200.0, Strtod(vector, 2));
97*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e20, Strtod(vector, 20));
98*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e22, Strtod(vector, 22));
99*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e23, Strtod(vector, 23));
100*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e35, Strtod(vector, 35));
101*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e36, Strtod(vector, 36));
102*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e37, Strtod(vector, 37));
103*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e-1, Strtod(vector, -1));
104*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e-2, Strtod(vector, -2));
105*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e-5, Strtod(vector, -5));
106*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e-20, Strtod(vector, -20));
107*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e-22, Strtod(vector, -22));
108*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e-23, Strtod(vector, -23));
109*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e-25, Strtod(vector, -25));
110*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e-39, Strtod(vector, -39));
111*a6021da3SAndroid Build Coastguard Worker
112*a6021da3SAndroid Build Coastguard Worker vector = StringToVector("9");
113*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9.0, Strtod(vector, 0));
114*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(90.0, Strtod(vector, 1));
115*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(900.0, Strtod(vector, 2));
116*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e20, Strtod(vector, 20));
117*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e22, Strtod(vector, 22));
118*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e23, Strtod(vector, 23));
119*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e35, Strtod(vector, 35));
120*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e36, Strtod(vector, 36));
121*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e37, Strtod(vector, 37));
122*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e-1, Strtod(vector, -1));
123*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e-2, Strtod(vector, -2));
124*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e-5, Strtod(vector, -5));
125*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e-20, Strtod(vector, -20));
126*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e-22, Strtod(vector, -22));
127*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e-23, Strtod(vector, -23));
128*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e-25, Strtod(vector, -25));
129*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e-39, Strtod(vector, -39));
130*a6021da3SAndroid Build Coastguard Worker
131*a6021da3SAndroid Build Coastguard Worker vector = StringToVector("12345");
132*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345.0, Strtod(vector, 0));
133*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123450.0, Strtod(vector, 1));
134*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234500.0, Strtod(vector, 2));
135*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e20, Strtod(vector, 20));
136*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e22, Strtod(vector, 22));
137*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e23, Strtod(vector, 23));
138*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e30, Strtod(vector, 30));
139*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e31, Strtod(vector, 31));
140*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e32, Strtod(vector, 32));
141*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e35, Strtod(vector, 35));
142*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e36, Strtod(vector, 36));
143*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e37, Strtod(vector, 37));
144*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e-1, Strtod(vector, -1));
145*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e-2, Strtod(vector, -2));
146*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e-5, Strtod(vector, -5));
147*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e-20, Strtod(vector, -20));
148*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e-22, Strtod(vector, -22));
149*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e-23, Strtod(vector, -23));
150*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e-25, Strtod(vector, -25));
151*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e-39, Strtod(vector, -39));
152*a6021da3SAndroid Build Coastguard Worker
153*a6021da3SAndroid Build Coastguard Worker vector = StringToVector("12345678901234");
154*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234.0, Strtod(vector, 0));
155*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012340.0, Strtod(vector, 1));
156*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234567890123400.0, Strtod(vector, 2));
157*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e20, Strtod(vector, 20));
158*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e22, Strtod(vector, 22));
159*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e23, Strtod(vector, 23));
160*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e30, Strtod(vector, 30));
161*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e31, Strtod(vector, 31));
162*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e32, Strtod(vector, 32));
163*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e35, Strtod(vector, 35));
164*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e36, Strtod(vector, 36));
165*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e37, Strtod(vector, 37));
166*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e-1, Strtod(vector, -1));
167*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e-2, Strtod(vector, -2));
168*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e-5, Strtod(vector, -5));
169*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e-20, Strtod(vector, -20));
170*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e-22, Strtod(vector, -22));
171*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e-23, Strtod(vector, -23));
172*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e-25, Strtod(vector, -25));
173*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e-39, Strtod(vector, -39));
174*a6021da3SAndroid Build Coastguard Worker
175*a6021da3SAndroid Build Coastguard Worker vector = StringToVector("123456789012345");
176*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345.0, Strtod(vector, 0));
177*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234567890123450.0, Strtod(vector, 1));
178*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234500.0, Strtod(vector, 2));
179*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345e20, Strtod(vector, 20));
180*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345e22, Strtod(vector, 22));
181*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345e23, Strtod(vector, 23));
182*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345e35, Strtod(vector, 35));
183*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345e36, Strtod(vector, 36));
184*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345e37, Strtod(vector, 37));
185*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345e39, Strtod(vector, 39));
186*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345e-1, Strtod(vector, -1));
187*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345e-2, Strtod(vector, -2));
188*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345e-5, Strtod(vector, -5));
189*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345e-20, Strtod(vector, -20));
190*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345e-22, Strtod(vector, -22));
191*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345e-23, Strtod(vector, -23));
192*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345e-25, Strtod(vector, -25));
193*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345e-39, Strtod(vector, -39));
194*a6021da3SAndroid Build Coastguard Worker
195*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(0.0, StrtodChar("0", 12345));
196*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(0.0, StrtodChar("", 1324));
197*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(0.0, StrtodChar("000000000", 123));
198*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(0.0, StrtodChar("2", -324));
199*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(4e-324, StrtodChar("3", -324));
200*a6021da3SAndroid Build Coastguard Worker // It would be more readable to put non-zero literals on the left side (i.e.
201*a6021da3SAndroid Build Coastguard Worker // CHECK_EQ(1e-325, StrtodChar("1", -325))), but then Gcc complains that
202*a6021da3SAndroid Build Coastguard Worker // they are truncated to zero.
203*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(0.0, StrtodChar("1", -325));
204*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(0.0, StrtodChar("1", -325));
205*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(0.0, StrtodChar("20000", -328));
206*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(40000e-328, StrtodChar("30000", -328));
207*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(0.0, StrtodChar("10000", -329));
208*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(0.0, StrtodChar("90000", -329));
209*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(0.0, StrtodChar("000000001", -325));
210*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(0.0, StrtodChar("000000001", -325));
211*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(0.0, StrtodChar("0000000020000", -328));
212*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(40000e-328, StrtodChar("00000030000", -328));
213*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(0.0, StrtodChar("0000000010000", -329));
214*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(0.0, StrtodChar("0000000090000", -329));
215*a6021da3SAndroid Build Coastguard Worker
216*a6021da3SAndroid Build Coastguard Worker // It would be more readable to put the literals (and not Double::Infinity())
217*a6021da3SAndroid Build Coastguard Worker // on the left side (i.e. CHECK_EQ(1e309, StrtodChar("1", 309))), but then Gcc
218*a6021da3SAndroid Build Coastguard Worker // complains that the floating constant exceeds range of 'double'.
219*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(Double::Infinity(), StrtodChar("1", 309));
220*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e308, StrtodChar("1", 308));
221*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234e305, StrtodChar("1234", 305));
222*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234e304, StrtodChar("1234", 304));
223*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(Double::Infinity(), StrtodChar("18", 307));
224*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(17e307, StrtodChar("17", 307));
225*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(Double::Infinity(), StrtodChar("0000001", 309));
226*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e308, StrtodChar("00000001", 308));
227*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234e305, StrtodChar("00000001234", 305));
228*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234e304, StrtodChar("000000001234", 304));
229*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(Double::Infinity(), StrtodChar("0000000018", 307));
230*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(17e307, StrtodChar("0000000017", 307));
231*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(Double::Infinity(), StrtodChar("1000000", 303));
232*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e308, StrtodChar("100000", 303));
233*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234e305, StrtodChar("123400000", 300));
234*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234e304, StrtodChar("123400000", 299));
235*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(Double::Infinity(), StrtodChar("180000000", 300));
236*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(17e307, StrtodChar("170000000", 300));
237*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(Double::Infinity(), StrtodChar("00000001000000", 303));
238*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e308, StrtodChar("000000000000100000", 303));
239*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234e305, StrtodChar("00000000123400000", 300));
240*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234e304, StrtodChar("0000000123400000", 299));
241*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(Double::Infinity(), StrtodChar("00000000180000000", 300));
242*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(17e307, StrtodChar("00000000170000000", 300));
243*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1.7976931348623157E+308, StrtodChar("17976931348623157", 292));
244*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1.7976931348623158E+308, StrtodChar("17976931348623158", 292));
245*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(Double::Infinity(), StrtodChar("17976931348623159", 292));
246*a6021da3SAndroid Build Coastguard Worker
247*a6021da3SAndroid Build Coastguard Worker // The following number is the result of 89255.0/1e-22. Both floating-point
248*a6021da3SAndroid Build Coastguard Worker // numbers can be accurately represented with doubles. However on Linux,x86
249*a6021da3SAndroid Build Coastguard Worker // the floating-point stack is set to 80bits and the double-rounding
250*a6021da3SAndroid Build Coastguard Worker // introduces an error.
251*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(89255e-22, StrtodChar("89255", -22));
252*a6021da3SAndroid Build Coastguard Worker
253*a6021da3SAndroid Build Coastguard Worker // Some random values.
254*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(358416272e-33, StrtodChar("358416272", -33));
255*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(104110013277974872254e-225,
256*a6021da3SAndroid Build Coastguard Worker StrtodChar("104110013277974872254", -225));
257*a6021da3SAndroid Build Coastguard Worker
258*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789e108, StrtodChar("123456789", 108));
259*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789e109, StrtodChar("123456789", 109));
260*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789e110, StrtodChar("123456789", 110));
261*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789e111, StrtodChar("123456789", 111));
262*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789e112, StrtodChar("123456789", 112));
263*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789e113, StrtodChar("123456789", 113));
264*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789e114, StrtodChar("123456789", 114));
265*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789e115, StrtodChar("123456789", 115));
266*a6021da3SAndroid Build Coastguard Worker
267*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234567890123456789012345e108,
268*a6021da3SAndroid Build Coastguard Worker StrtodChar("1234567890123456789012345", 108));
269*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234567890123456789012345e109,
270*a6021da3SAndroid Build Coastguard Worker StrtodChar("1234567890123456789012345", 109));
271*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234567890123456789012345e110,
272*a6021da3SAndroid Build Coastguard Worker StrtodChar("1234567890123456789012345", 110));
273*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234567890123456789012345e111,
274*a6021da3SAndroid Build Coastguard Worker StrtodChar("1234567890123456789012345", 111));
275*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234567890123456789012345e112,
276*a6021da3SAndroid Build Coastguard Worker StrtodChar("1234567890123456789012345", 112));
277*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234567890123456789012345e113,
278*a6021da3SAndroid Build Coastguard Worker StrtodChar("1234567890123456789012345", 113));
279*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234567890123456789012345e114,
280*a6021da3SAndroid Build Coastguard Worker StrtodChar("1234567890123456789012345", 114));
281*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234567890123456789012345e115,
282*a6021da3SAndroid Build Coastguard Worker StrtodChar("1234567890123456789012345", 115));
283*a6021da3SAndroid Build Coastguard Worker
284*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234567890123456789052345e108,
285*a6021da3SAndroid Build Coastguard Worker StrtodChar("1234567890123456789052345", 108));
286*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234567890123456789052345e109,
287*a6021da3SAndroid Build Coastguard Worker StrtodChar("1234567890123456789052345", 109));
288*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234567890123456789052345e110,
289*a6021da3SAndroid Build Coastguard Worker StrtodChar("1234567890123456789052345", 110));
290*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234567890123456789052345e111,
291*a6021da3SAndroid Build Coastguard Worker StrtodChar("1234567890123456789052345", 111));
292*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234567890123456789052345e112,
293*a6021da3SAndroid Build Coastguard Worker StrtodChar("1234567890123456789052345", 112));
294*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234567890123456789052345e113,
295*a6021da3SAndroid Build Coastguard Worker StrtodChar("1234567890123456789052345", 113));
296*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234567890123456789052345e114,
297*a6021da3SAndroid Build Coastguard Worker StrtodChar("1234567890123456789052345", 114));
298*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234567890123456789052345e115,
299*a6021da3SAndroid Build Coastguard Worker StrtodChar("1234567890123456789052345", 115));
300*a6021da3SAndroid Build Coastguard Worker
301*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(5.445618932859895e-255,
302*a6021da3SAndroid Build Coastguard Worker StrtodChar("5445618932859895362967233318697132813618813095743952975"
303*a6021da3SAndroid Build Coastguard Worker "4392982234069699615600475529427176366709107287468930197"
304*a6021da3SAndroid Build Coastguard Worker "8628345413991790019316974825934906752493984055268219809"
305*a6021da3SAndroid Build Coastguard Worker "5012176093045431437495773903922425632551857520884625114"
306*a6021da3SAndroid Build Coastguard Worker "6241265881735209066709685420744388526014389929047617597"
307*a6021da3SAndroid Build Coastguard Worker "0302268848374508109029268898695825171158085457567481507"
308*a6021da3SAndroid Build Coastguard Worker "4162979705098246243690189880319928315307816832576838178"
309*a6021da3SAndroid Build Coastguard Worker "2563074014542859888710209237525873301724479666744537857"
310*a6021da3SAndroid Build Coastguard Worker "9026553346649664045621387124193095870305991178772256504"
311*a6021da3SAndroid Build Coastguard Worker "4368663670643970181259143319016472430928902201239474588"
312*a6021da3SAndroid Build Coastguard Worker "1392338901353291306607057623202353588698746085415097902"
313*a6021da3SAndroid Build Coastguard Worker "6640064319118728664842287477491068264828851624402189317"
314*a6021da3SAndroid Build Coastguard Worker "2769161449825765517353755844373640588822904791244190695"
315*a6021da3SAndroid Build Coastguard Worker "2998382932630754670573838138825217065450843010498555058"
316*a6021da3SAndroid Build Coastguard Worker "88186560731", -1035));
317*a6021da3SAndroid Build Coastguard Worker
318*a6021da3SAndroid Build Coastguard Worker // Boundary cases. Boundaries themselves should round to even.
319*a6021da3SAndroid Build Coastguard Worker //
320*a6021da3SAndroid Build Coastguard Worker // 0x1FFFFFFFFFFFF * 2^3 = 72057594037927928
321*a6021da3SAndroid Build Coastguard Worker // next: 72057594037927936
322*a6021da3SAndroid Build Coastguard Worker // boundary: 72057594037927932 should round up.
323*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(72057594037927928.0, StrtodChar("72057594037927928", 0));
324*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(72057594037927936.0, StrtodChar("72057594037927936", 0));
325*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(72057594037927936.0, StrtodChar("72057594037927932", 0));
326*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(72057594037927928.0, StrtodChar("7205759403792793199999", -5));
327*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(72057594037927936.0, StrtodChar("7205759403792793200001", -5));
328*a6021da3SAndroid Build Coastguard Worker
329*a6021da3SAndroid Build Coastguard Worker // 0x1FFFFFFFFFFFF * 2^10 = 9223372036854774784
330*a6021da3SAndroid Build Coastguard Worker // next: 9223372036854775808
331*a6021da3SAndroid Build Coastguard Worker // boundary: 9223372036854775296 should round up.
332*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9223372036854774784.0, StrtodChar("9223372036854774784", 0));
333*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9223372036854775808.0, StrtodChar("9223372036854775808", 0));
334*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9223372036854775808.0, StrtodChar("9223372036854775296", 0));
335*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9223372036854774784.0, StrtodChar("922337203685477529599999", -5));
336*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9223372036854775808.0, StrtodChar("922337203685477529600001", -5));
337*a6021da3SAndroid Build Coastguard Worker
338*a6021da3SAndroid Build Coastguard Worker // 0x1FFFFFFFFFFFF * 2^50 = 10141204801825834086073718800384
339*a6021da3SAndroid Build Coastguard Worker // next: 10141204801825835211973625643008
340*a6021da3SAndroid Build Coastguard Worker // boundary: 10141204801825834649023672221696 should round up.
341*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(10141204801825834086073718800384.0,
342*a6021da3SAndroid Build Coastguard Worker StrtodChar("10141204801825834086073718800384", 0));
343*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(10141204801825835211973625643008.0,
344*a6021da3SAndroid Build Coastguard Worker StrtodChar("10141204801825835211973625643008", 0));
345*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(10141204801825835211973625643008.0,
346*a6021da3SAndroid Build Coastguard Worker StrtodChar("10141204801825834649023672221696", 0));
347*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(10141204801825834086073718800384.0,
348*a6021da3SAndroid Build Coastguard Worker StrtodChar("1014120480182583464902367222169599999", -5));
349*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(10141204801825835211973625643008.0,
350*a6021da3SAndroid Build Coastguard Worker StrtodChar("1014120480182583464902367222169600001", -5));
351*a6021da3SAndroid Build Coastguard Worker
352*a6021da3SAndroid Build Coastguard Worker // 0x1FFFFFFFFFFFF * 2^99 = 5708990770823838890407843763683279797179383808
353*a6021da3SAndroid Build Coastguard Worker // next: 5708990770823839524233143877797980545530986496
354*a6021da3SAndroid Build Coastguard Worker // boundary: 5708990770823839207320493820740630171355185152
355*a6021da3SAndroid Build Coastguard Worker // The boundary should round up.
356*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(5708990770823838890407843763683279797179383808.0,
357*a6021da3SAndroid Build Coastguard Worker StrtodChar("5708990770823838890407843763683279797179383808", 0));
358*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(5708990770823839524233143877797980545530986496.0,
359*a6021da3SAndroid Build Coastguard Worker StrtodChar("5708990770823839524233143877797980545530986496", 0));
360*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(5708990770823839524233143877797980545530986496.0,
361*a6021da3SAndroid Build Coastguard Worker StrtodChar("5708990770823839207320493820740630171355185152", 0));
362*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(5708990770823838890407843763683279797179383808.0,
363*a6021da3SAndroid Build Coastguard Worker StrtodChar("5708990770823839207320493820740630171355185151999", -3));
364*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(5708990770823839524233143877797980545530986496.0,
365*a6021da3SAndroid Build Coastguard Worker StrtodChar("5708990770823839207320493820740630171355185152001", -3));
366*a6021da3SAndroid Build Coastguard Worker
367*a6021da3SAndroid Build Coastguard Worker // The following test-cases got some public attention in early 2011 when they
368*a6021da3SAndroid Build Coastguard Worker // sent Java and PHP into an infinite loop.
369*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2.225073858507201e-308, StrtodChar("22250738585072011", -324));
370*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2.22507385850720138309e-308,
371*a6021da3SAndroid Build Coastguard Worker StrtodChar("22250738585072011360574097967091319759348195463516456480"
372*a6021da3SAndroid Build Coastguard Worker "23426109724822222021076945516529523908135087914149158913"
373*a6021da3SAndroid Build Coastguard Worker "03962110687008643869459464552765720740782062174337998814"
374*a6021da3SAndroid Build Coastguard Worker "10632673292535522868813721490129811224514518898490572223"
375*a6021da3SAndroid Build Coastguard Worker "07285255133155755015914397476397983411801999323962548289"
376*a6021da3SAndroid Build Coastguard Worker "01710708185069063066665599493827577257201576306269066333"
377*a6021da3SAndroid Build Coastguard Worker "26475653000092458883164330377797918696120494973903778297"
378*a6021da3SAndroid Build Coastguard Worker "04905051080609940730262937128958950003583799967207254304"
379*a6021da3SAndroid Build Coastguard Worker "36028407889577179615094551674824347103070260914462157228"
380*a6021da3SAndroid Build Coastguard Worker "98802581825451803257070188608721131280795122334262883686"
381*a6021da3SAndroid Build Coastguard Worker "22321503775666622503982534335974568884423900265498198385"
382*a6021da3SAndroid Build Coastguard Worker "48794829220689472168983109969836584681402285424333066033"
383*a6021da3SAndroid Build Coastguard Worker "98508864458040010349339704275671864433837704860378616227"
384*a6021da3SAndroid Build Coastguard Worker "71738545623065874679014086723327636718751", -1076));
385*a6021da3SAndroid Build Coastguard Worker }
386*a6021da3SAndroid Build Coastguard Worker
387*a6021da3SAndroid Build Coastguard Worker
TEST(StrtodTrimmed)388*a6021da3SAndroid Build Coastguard Worker TEST(StrtodTrimmed) {
389*a6021da3SAndroid Build Coastguard Worker Vector<const char> vector;
390*a6021da3SAndroid Build Coastguard Worker
391*a6021da3SAndroid Build Coastguard Worker vector = StringToVector("1");
392*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1.0, StrtodTrimmed(vector, 0));
393*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(10.0, StrtodTrimmed(vector, 1));
394*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(100.0, StrtodTrimmed(vector, 2));
395*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e20, StrtodTrimmed(vector, 20));
396*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e22, StrtodTrimmed(vector, 22));
397*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e23, StrtodTrimmed(vector, 23));
398*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e35, StrtodTrimmed(vector, 35));
399*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e36, StrtodTrimmed(vector, 36));
400*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e37, StrtodTrimmed(vector, 37));
401*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e-1, StrtodTrimmed(vector, -1));
402*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e-2, StrtodTrimmed(vector, -2));
403*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e-5, StrtodTrimmed(vector, -5));
404*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e-20, StrtodTrimmed(vector, -20));
405*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e-22, StrtodTrimmed(vector, -22));
406*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e-23, StrtodTrimmed(vector, -23));
407*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e-25, StrtodTrimmed(vector, -25));
408*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e-39, StrtodTrimmed(vector, -39));
409*a6021da3SAndroid Build Coastguard Worker
410*a6021da3SAndroid Build Coastguard Worker vector = StringToVector("2");
411*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2.0, StrtodTrimmed(vector, 0));
412*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(20.0, StrtodTrimmed(vector, 1));
413*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(200.0, StrtodTrimmed(vector, 2));
414*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e20, StrtodTrimmed(vector, 20));
415*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e22, StrtodTrimmed(vector, 22));
416*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e23, StrtodTrimmed(vector, 23));
417*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e35, StrtodTrimmed(vector, 35));
418*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e36, StrtodTrimmed(vector, 36));
419*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e37, StrtodTrimmed(vector, 37));
420*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e-1, StrtodTrimmed(vector, -1));
421*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e-2, StrtodTrimmed(vector, -2));
422*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e-5, StrtodTrimmed(vector, -5));
423*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e-20, StrtodTrimmed(vector, -20));
424*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e-22, StrtodTrimmed(vector, -22));
425*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e-23, StrtodTrimmed(vector, -23));
426*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e-25, StrtodTrimmed(vector, -25));
427*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e-39, StrtodTrimmed(vector, -39));
428*a6021da3SAndroid Build Coastguard Worker
429*a6021da3SAndroid Build Coastguard Worker vector = StringToVector("9");
430*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9.0, StrtodTrimmed(vector, 0));
431*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(90.0, StrtodTrimmed(vector, 1));
432*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(900.0, StrtodTrimmed(vector, 2));
433*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e20, StrtodTrimmed(vector, 20));
434*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e22, StrtodTrimmed(vector, 22));
435*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e23, StrtodTrimmed(vector, 23));
436*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e35, StrtodTrimmed(vector, 35));
437*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e36, StrtodTrimmed(vector, 36));
438*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e37, StrtodTrimmed(vector, 37));
439*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e-1, StrtodTrimmed(vector, -1));
440*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e-2, StrtodTrimmed(vector, -2));
441*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e-5, StrtodTrimmed(vector, -5));
442*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e-20, StrtodTrimmed(vector, -20));
443*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e-22, StrtodTrimmed(vector, -22));
444*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e-23, StrtodTrimmed(vector, -23));
445*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e-25, StrtodTrimmed(vector, -25));
446*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e-39, StrtodTrimmed(vector, -39));
447*a6021da3SAndroid Build Coastguard Worker
448*a6021da3SAndroid Build Coastguard Worker vector = StringToVector("12345");
449*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345.0, StrtodTrimmed(vector, 0));
450*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123450.0, StrtodTrimmed(vector, 1));
451*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234500.0, StrtodTrimmed(vector, 2));
452*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e20, StrtodTrimmed(vector, 20));
453*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e22, StrtodTrimmed(vector, 22));
454*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e23, StrtodTrimmed(vector, 23));
455*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e30, StrtodTrimmed(vector, 30));
456*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e31, StrtodTrimmed(vector, 31));
457*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e32, StrtodTrimmed(vector, 32));
458*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e35, StrtodTrimmed(vector, 35));
459*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e36, StrtodTrimmed(vector, 36));
460*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e37, StrtodTrimmed(vector, 37));
461*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e-1, StrtodTrimmed(vector, -1));
462*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e-2, StrtodTrimmed(vector, -2));
463*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e-5, StrtodTrimmed(vector, -5));
464*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e-20, StrtodTrimmed(vector, -20));
465*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e-22, StrtodTrimmed(vector, -22));
466*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e-23, StrtodTrimmed(vector, -23));
467*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e-25, StrtodTrimmed(vector, -25));
468*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e-39, StrtodTrimmed(vector, -39));
469*a6021da3SAndroid Build Coastguard Worker
470*a6021da3SAndroid Build Coastguard Worker vector = StringToVector("12345678901234");
471*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234.0, StrtodTrimmed(vector, 0));
472*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012340.0, StrtodTrimmed(vector, 1));
473*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234567890123400.0, StrtodTrimmed(vector, 2));
474*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e20, StrtodTrimmed(vector, 20));
475*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e22, StrtodTrimmed(vector, 22));
476*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e23, StrtodTrimmed(vector, 23));
477*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e30, StrtodTrimmed(vector, 30));
478*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e31, StrtodTrimmed(vector, 31));
479*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e32, StrtodTrimmed(vector, 32));
480*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e35, StrtodTrimmed(vector, 35));
481*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e36, StrtodTrimmed(vector, 36));
482*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e37, StrtodTrimmed(vector, 37));
483*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e-1, StrtodTrimmed(vector, -1));
484*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e-2, StrtodTrimmed(vector, -2));
485*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e-5, StrtodTrimmed(vector, -5));
486*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e-20, StrtodTrimmed(vector, -20));
487*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e-22, StrtodTrimmed(vector, -22));
488*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e-23, StrtodTrimmed(vector, -23));
489*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e-25, StrtodTrimmed(vector, -25));
490*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e-39, StrtodTrimmed(vector, -39));
491*a6021da3SAndroid Build Coastguard Worker
492*a6021da3SAndroid Build Coastguard Worker vector = StringToVector("123456789012345");
493*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345.0, StrtodTrimmed(vector, 0));
494*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234567890123450.0, StrtodTrimmed(vector, 1));
495*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234500.0, StrtodTrimmed(vector, 2));
496*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345e20, StrtodTrimmed(vector, 20));
497*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345e22, StrtodTrimmed(vector, 22));
498*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345e23, StrtodTrimmed(vector, 23));
499*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345e35, StrtodTrimmed(vector, 35));
500*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345e36, StrtodTrimmed(vector, 36));
501*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345e37, StrtodTrimmed(vector, 37));
502*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345e39, StrtodTrimmed(vector, 39));
503*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345e-1, StrtodTrimmed(vector, -1));
504*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345e-2, StrtodTrimmed(vector, -2));
505*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345e-5, StrtodTrimmed(vector, -5));
506*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345e-20, StrtodTrimmed(vector, -20));
507*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345e-22, StrtodTrimmed(vector, -22));
508*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345e-23, StrtodTrimmed(vector, -23));
509*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345e-25, StrtodTrimmed(vector, -25));
510*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345e-39, StrtodTrimmed(vector, -39));
511*a6021da3SAndroid Build Coastguard Worker
512*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(0.0, StrtodTrimmedChar("", 1324));
513*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(0.0, StrtodTrimmedChar("2", -324));
514*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(4e-324, StrtodTrimmedChar("3", -324));
515*a6021da3SAndroid Build Coastguard Worker // It would be more readable to put non-zero literals on the left side (i.e.
516*a6021da3SAndroid Build Coastguard Worker // CHECK_EQ(1e-325, StrtodChar("1", -325))), but then Gcc complains that
517*a6021da3SAndroid Build Coastguard Worker // they are truncated to zero.
518*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(0.0, StrtodTrimmedChar("1", -325));
519*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(0.0, StrtodTrimmedChar("1", -325));
520*a6021da3SAndroid Build Coastguard Worker
521*a6021da3SAndroid Build Coastguard Worker // It would be more readable to put the literals (and not Double::Infinity())
522*a6021da3SAndroid Build Coastguard Worker // on the left side (i.e. CHECK_EQ(1e309, StrtodChar("1", 309))), but then Gcc
523*a6021da3SAndroid Build Coastguard Worker // complains that the floating constant exceeds range of 'double'.
524*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(Double::Infinity(), StrtodTrimmedChar("1", 309));
525*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e308, StrtodTrimmedChar("1", 308));
526*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234e305, StrtodTrimmedChar("1234", 305));
527*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234e304, StrtodTrimmedChar("1234", 304));
528*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(Double::Infinity(), StrtodTrimmedChar("18", 307));
529*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(17e307, StrtodTrimmedChar("17", 307));
530*a6021da3SAndroid Build Coastguard Worker
531*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1.7976931348623157E+308, StrtodTrimmedChar("17976931348623157", 292));
532*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1.7976931348623158E+308, StrtodTrimmedChar("17976931348623158", 292));
533*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(Double::Infinity(), StrtodTrimmedChar("17976931348623159", 292));
534*a6021da3SAndroid Build Coastguard Worker
535*a6021da3SAndroid Build Coastguard Worker // The following number is the result of 89255.0/1e-22. Both floating-point
536*a6021da3SAndroid Build Coastguard Worker // numbers can be accurately represented with doubles. However on Linux,x86
537*a6021da3SAndroid Build Coastguard Worker // the floating-point stack is set to 80bits and the double-rounding
538*a6021da3SAndroid Build Coastguard Worker // introduces an error.
539*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(89255e-22, StrtodTrimmedChar("89255", -22));
540*a6021da3SAndroid Build Coastguard Worker
541*a6021da3SAndroid Build Coastguard Worker // Some random values.
542*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(358416272e-33, StrtodTrimmedChar("358416272", -33));
543*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(104110013277974872254e-225,
544*a6021da3SAndroid Build Coastguard Worker StrtodTrimmedChar("104110013277974872254", -225));
545*a6021da3SAndroid Build Coastguard Worker
546*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789e108, StrtodTrimmedChar("123456789", 108));
547*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789e109, StrtodTrimmedChar("123456789", 109));
548*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789e110, StrtodTrimmedChar("123456789", 110));
549*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789e111, StrtodTrimmedChar("123456789", 111));
550*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789e112, StrtodTrimmedChar("123456789", 112));
551*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789e113, StrtodTrimmedChar("123456789", 113));
552*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789e114, StrtodTrimmedChar("123456789", 114));
553*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789e115, StrtodTrimmedChar("123456789", 115));
554*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234567890123456789012345e108,
555*a6021da3SAndroid Build Coastguard Worker StrtodTrimmedChar("1234567890123456789012345", 108));
556*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234567890123456789012345e109,
557*a6021da3SAndroid Build Coastguard Worker StrtodTrimmedChar("1234567890123456789012345", 109));
558*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234567890123456789012345e110,
559*a6021da3SAndroid Build Coastguard Worker StrtodTrimmedChar("1234567890123456789012345", 110));
560*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234567890123456789012345e111,
561*a6021da3SAndroid Build Coastguard Worker StrtodTrimmedChar("1234567890123456789012345", 111));
562*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234567890123456789012345e112,
563*a6021da3SAndroid Build Coastguard Worker StrtodTrimmedChar("1234567890123456789012345", 112));
564*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234567890123456789012345e113,
565*a6021da3SAndroid Build Coastguard Worker StrtodTrimmedChar("1234567890123456789012345", 113));
566*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234567890123456789012345e114,
567*a6021da3SAndroid Build Coastguard Worker StrtodTrimmedChar("1234567890123456789012345", 114));
568*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234567890123456789012345e115,
569*a6021da3SAndroid Build Coastguard Worker StrtodTrimmedChar("1234567890123456789012345", 115));
570*a6021da3SAndroid Build Coastguard Worker
571*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234567890123456789052345e108,
572*a6021da3SAndroid Build Coastguard Worker StrtodTrimmedChar("1234567890123456789052345", 108));
573*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234567890123456789052345e109,
574*a6021da3SAndroid Build Coastguard Worker StrtodTrimmedChar("1234567890123456789052345", 109));
575*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234567890123456789052345e110,
576*a6021da3SAndroid Build Coastguard Worker StrtodTrimmedChar("1234567890123456789052345", 110));
577*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234567890123456789052345e111,
578*a6021da3SAndroid Build Coastguard Worker StrtodTrimmedChar("1234567890123456789052345", 111));
579*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234567890123456789052345e112,
580*a6021da3SAndroid Build Coastguard Worker StrtodTrimmedChar("1234567890123456789052345", 112));
581*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234567890123456789052345e113,
582*a6021da3SAndroid Build Coastguard Worker StrtodTrimmedChar("1234567890123456789052345", 113));
583*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234567890123456789052345e114,
584*a6021da3SAndroid Build Coastguard Worker StrtodTrimmedChar("1234567890123456789052345", 114));
585*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234567890123456789052345e115,
586*a6021da3SAndroid Build Coastguard Worker StrtodTrimmedChar("1234567890123456789052345", 115));
587*a6021da3SAndroid Build Coastguard Worker
588*a6021da3SAndroid Build Coastguard Worker // Boundary cases. Boundaries themselves should round to even.
589*a6021da3SAndroid Build Coastguard Worker //
590*a6021da3SAndroid Build Coastguard Worker // 0x1FFFFFFFFFFFF * 2^3 = 72057594037927928
591*a6021da3SAndroid Build Coastguard Worker // next: 72057594037927936
592*a6021da3SAndroid Build Coastguard Worker // boundary: 72057594037927932 should round up.
593*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(72057594037927928.0, StrtodTrimmedChar("72057594037927928", 0));
594*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(72057594037927936.0, StrtodTrimmedChar("72057594037927936", 0));
595*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(72057594037927936.0, StrtodTrimmedChar("72057594037927932", 0));
596*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(72057594037927928.0, StrtodTrimmedChar("7205759403792793199999", -5));
597*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(72057594037927936.0, StrtodTrimmedChar("7205759403792793200001", -5));
598*a6021da3SAndroid Build Coastguard Worker
599*a6021da3SAndroid Build Coastguard Worker // 0x1FFFFFFFFFFFF * 2^10 = 9223372036854774784
600*a6021da3SAndroid Build Coastguard Worker // next: 9223372036854775808
601*a6021da3SAndroid Build Coastguard Worker // boundary: 9223372036854775296 should round up.
602*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9223372036854774784.0, StrtodTrimmedChar("9223372036854774784", 0));
603*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9223372036854775808.0, StrtodTrimmedChar("9223372036854775808", 0));
604*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9223372036854775808.0, StrtodTrimmedChar("9223372036854775296", 0));
605*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9223372036854774784.0, StrtodTrimmedChar("922337203685477529599999", -5));
606*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9223372036854775808.0, StrtodTrimmedChar("922337203685477529600001", -5));
607*a6021da3SAndroid Build Coastguard Worker
608*a6021da3SAndroid Build Coastguard Worker // 0x1FFFFFFFFFFFF * 2^50 = 10141204801825834086073718800384
609*a6021da3SAndroid Build Coastguard Worker // next: 10141204801825835211973625643008
610*a6021da3SAndroid Build Coastguard Worker // boundary: 10141204801825834649023672221696 should round up.
611*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(10141204801825834086073718800384.0,
612*a6021da3SAndroid Build Coastguard Worker StrtodTrimmedChar("10141204801825834086073718800384", 0));
613*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(10141204801825835211973625643008.0,
614*a6021da3SAndroid Build Coastguard Worker StrtodTrimmedChar("10141204801825835211973625643008", 0));
615*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(10141204801825835211973625643008.0,
616*a6021da3SAndroid Build Coastguard Worker StrtodTrimmedChar("10141204801825834649023672221696", 0));
617*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(10141204801825834086073718800384.0,
618*a6021da3SAndroid Build Coastguard Worker StrtodTrimmedChar("1014120480182583464902367222169599999", -5));
619*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(10141204801825835211973625643008.0,
620*a6021da3SAndroid Build Coastguard Worker StrtodTrimmedChar("1014120480182583464902367222169600001", -5));
621*a6021da3SAndroid Build Coastguard Worker
622*a6021da3SAndroid Build Coastguard Worker // 0x1FFFFFFFFFFFF * 2^99 = 5708990770823838890407843763683279797179383808
623*a6021da3SAndroid Build Coastguard Worker // next: 5708990770823839524233143877797980545530986496
624*a6021da3SAndroid Build Coastguard Worker // boundary: 5708990770823839207320493820740630171355185152
625*a6021da3SAndroid Build Coastguard Worker // The boundary should round up.
626*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(5708990770823838890407843763683279797179383808.0,
627*a6021da3SAndroid Build Coastguard Worker StrtodTrimmedChar("5708990770823838890407843763683279797179383808", 0));
628*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(5708990770823839524233143877797980545530986496.0,
629*a6021da3SAndroid Build Coastguard Worker StrtodTrimmedChar("5708990770823839524233143877797980545530986496", 0));
630*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(5708990770823839524233143877797980545530986496.0,
631*a6021da3SAndroid Build Coastguard Worker StrtodTrimmedChar("5708990770823839207320493820740630171355185152", 0));
632*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(5708990770823838890407843763683279797179383808.0,
633*a6021da3SAndroid Build Coastguard Worker StrtodTrimmedChar("5708990770823839207320493820740630171355185151999", -3));
634*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(5708990770823839524233143877797980545530986496.0,
635*a6021da3SAndroid Build Coastguard Worker StrtodTrimmedChar("5708990770823839207320493820740630171355185152001", -3));
636*a6021da3SAndroid Build Coastguard Worker
637*a6021da3SAndroid Build Coastguard Worker // The following test-cases got some public attention in early 2011 when they
638*a6021da3SAndroid Build Coastguard Worker // sent Java and PHP into an infinite loop.
639*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2.225073858507201e-308, StrtodTrimmedChar("22250738585072011", -324));
640*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2.22507385850720138309e-308,
641*a6021da3SAndroid Build Coastguard Worker StrtodTrimmedChar("22250738585072011360574097967091319759348195463516456480"
642*a6021da3SAndroid Build Coastguard Worker "23426109724822222021076945516529523908135087914149158913"
643*a6021da3SAndroid Build Coastguard Worker "03962110687008643869459464552765720740782062174337998814"
644*a6021da3SAndroid Build Coastguard Worker "10632673292535522868813721490129811224514518898490572223"
645*a6021da3SAndroid Build Coastguard Worker "07285255133155755015914397476397983411801999323962548289"
646*a6021da3SAndroid Build Coastguard Worker "01710708185069063066665599493827577257201576306269066333"
647*a6021da3SAndroid Build Coastguard Worker "26475653000092458883164330377797918696120494973903778297"
648*a6021da3SAndroid Build Coastguard Worker "04905051080609940730262937128958950003583799967207254304"
649*a6021da3SAndroid Build Coastguard Worker "36028407889577179615094551674824347103070260914462157228"
650*a6021da3SAndroid Build Coastguard Worker "98802581825451803257070188608721131280795122334262883686"
651*a6021da3SAndroid Build Coastguard Worker "22321503775666622503982534335974568884423900265498198385"
652*a6021da3SAndroid Build Coastguard Worker "48794829220689472168983109969836584681402285424333066033"
653*a6021da3SAndroid Build Coastguard Worker "98508864458040010349339704275671864433837704860378616227"
654*a6021da3SAndroid Build Coastguard Worker "71738545623065874679014086723327636718751", -1076));
655*a6021da3SAndroid Build Coastguard Worker }
656*a6021da3SAndroid Build Coastguard Worker
657*a6021da3SAndroid Build Coastguard Worker
TEST(Strtof)658*a6021da3SAndroid Build Coastguard Worker TEST(Strtof) {
659*a6021da3SAndroid Build Coastguard Worker Vector<const char> vector;
660*a6021da3SAndroid Build Coastguard Worker
661*a6021da3SAndroid Build Coastguard Worker vector = StringToVector("0");
662*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(0.0f, Strtof(vector, 1));
663*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(0.0f, Strtof(vector, 2));
664*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(0.0f, Strtof(vector, -2));
665*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(0.0f, Strtof(vector, -999));
666*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(0.0f, Strtof(vector, +999));
667*a6021da3SAndroid Build Coastguard Worker
668*a6021da3SAndroid Build Coastguard Worker vector = StringToVector("1");
669*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1.0f, Strtof(vector, 0));
670*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(10.0f, Strtof(vector, 1));
671*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(100.0f, Strtof(vector, 2));
672*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e20f, Strtof(vector, 20));
673*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e22f, Strtof(vector, 22));
674*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e23f, Strtof(vector, 23));
675*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e35f, Strtof(vector, 35));
676*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e36f, Strtof(vector, 36));
677*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e37f, Strtof(vector, 37));
678*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e-1f, Strtof(vector, -1));
679*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e-2f, Strtof(vector, -2));
680*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e-5f, Strtof(vector, -5));
681*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e-20f, Strtof(vector, -20));
682*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e-22f, Strtof(vector, -22));
683*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e-23f, Strtof(vector, -23));
684*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e-25f, Strtof(vector, -25));
685*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e-39f, Strtof(vector, -39));
686*a6021da3SAndroid Build Coastguard Worker
687*a6021da3SAndroid Build Coastguard Worker vector = StringToVector("2");
688*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2.0f, Strtof(vector, 0));
689*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(20.0f, Strtof(vector, 1));
690*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(200.0f, Strtof(vector, 2));
691*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e20f, Strtof(vector, 20));
692*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e22f, Strtof(vector, 22));
693*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e23f, Strtof(vector, 23));
694*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e35f, Strtof(vector, 35));
695*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e36f, Strtof(vector, 36));
696*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e37f, Strtof(vector, 37));
697*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e-1f, Strtof(vector, -1));
698*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e-2f, Strtof(vector, -2));
699*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e-5f, Strtof(vector, -5));
700*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e-20f, Strtof(vector, -20));
701*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e-22f, Strtof(vector, -22));
702*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e-23f, Strtof(vector, -23));
703*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e-25f, Strtof(vector, -25));
704*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e-39f, Strtof(vector, -39));
705*a6021da3SAndroid Build Coastguard Worker
706*a6021da3SAndroid Build Coastguard Worker vector = StringToVector("9");
707*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9.0f, Strtof(vector, 0));
708*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(90.0f, Strtof(vector, 1));
709*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(900.0f, Strtof(vector, 2));
710*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e20f, Strtof(vector, 20));
711*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e22f, Strtof(vector, 22));
712*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e23f, Strtof(vector, 23));
713*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e35f, Strtof(vector, 35));
714*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e36f, Strtof(vector, 36));
715*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e37f, Strtof(vector, 37));
716*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e-1f, Strtof(vector, -1));
717*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e-2f, Strtof(vector, -2));
718*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e-5f, Strtof(vector, -5));
719*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e-20f, Strtof(vector, -20));
720*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e-22f, Strtof(vector, -22));
721*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e-23f, Strtof(vector, -23));
722*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e-25f, Strtof(vector, -25));
723*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e-39f, Strtof(vector, -39));
724*a6021da3SAndroid Build Coastguard Worker
725*a6021da3SAndroid Build Coastguard Worker vector = StringToVector("12345");
726*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345.0f, Strtof(vector, 0));
727*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123450.0f, Strtof(vector, 1));
728*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234500.0f, Strtof(vector, 2));
729*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e20f, Strtof(vector, 20));
730*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e22f, Strtof(vector, 22));
731*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e23f, Strtof(vector, 23));
732*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e30f, Strtof(vector, 30));
733*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e31f, Strtof(vector, 31));
734*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e32f, Strtof(vector, 32));
735*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e-1f, Strtof(vector, -1));
736*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e-2f, Strtof(vector, -2));
737*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e-5f, Strtof(vector, -5));
738*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e-20f, Strtof(vector, -20));
739*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e-22f, Strtof(vector, -22));
740*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e-23f, Strtof(vector, -23));
741*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e-25f, Strtof(vector, -25));
742*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e-39f, Strtof(vector, -39));
743*a6021da3SAndroid Build Coastguard Worker
744*a6021da3SAndroid Build Coastguard Worker vector = StringToVector("12345678901234");
745*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234.0f, Strtof(vector, 0));
746*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012340.0f, Strtof(vector, 1));
747*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234567890123400.0f, Strtof(vector, 2));
748*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e20f, Strtof(vector, 20));
749*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e22f, Strtof(vector, 22));
750*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e23f, Strtof(vector, 23));
751*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e-1f, Strtof(vector, -1));
752*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e-2f, Strtof(vector, -2));
753*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e-5f, Strtof(vector, -5));
754*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e-20f, Strtof(vector, -20));
755*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e-22f, Strtof(vector, -22));
756*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e-23f, Strtof(vector, -23));
757*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e-25f, Strtof(vector, -25));
758*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e-39f, Strtof(vector, -39));
759*a6021da3SAndroid Build Coastguard Worker
760*a6021da3SAndroid Build Coastguard Worker vector = StringToVector("123456789012345");
761*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345.0f, Strtof(vector, 0));
762*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234567890123450.0f, Strtof(vector, 1));
763*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234500.0f, Strtof(vector, 2));
764*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345e20f, Strtof(vector, 20));
765*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345e22f, Strtof(vector, 22));
766*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345e23f, Strtof(vector, 23));
767*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345e-1f, Strtof(vector, -1));
768*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345e-2f, Strtof(vector, -2));
769*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345e-5f, Strtof(vector, -5));
770*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345e-20f, Strtof(vector, -20));
771*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345e-22f, Strtof(vector, -22));
772*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345e-23f, Strtof(vector, -23));
773*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345e-25f, Strtof(vector, -25));
774*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345e-39f, Strtof(vector, -39));
775*a6021da3SAndroid Build Coastguard Worker
776*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(0.0f, StrtofChar("0", 12345));
777*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(0.0f, StrtofChar("", 1324));
778*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(0.0f, StrtofChar("000000000", 123));
779*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(0.0f, StrtofChar("2", -324));
780*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e-45f, StrtofChar("1", -45));
781*a6021da3SAndroid Build Coastguard Worker // It would be more readable to put non-zero literals on the left side (i.e.
782*a6021da3SAndroid Build Coastguard Worker // CHECK_EQ(1e-46, StrtofChar("1", -45))), but then Gcc complains that
783*a6021da3SAndroid Build Coastguard Worker // they are truncated to zero.
784*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(0.0f, StrtofChar("1", -46));
785*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(0.0f, StrtofChar("1", -47));
786*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e-45f, StrtofChar("1", -45));
787*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e-45f, StrtofChar("8", -46));
788*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(0.0f, StrtofChar("200000", -51));
789*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(100000e-50f, StrtofChar("100000", -50));
790*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(0.0f, StrtofChar("100000", -51));
791*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(0.0f, StrtofChar("900000", -52));
792*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(0.0f, StrtofChar("000000001", -47));
793*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(0.0f, StrtofChar("000000001", -47));
794*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(0.0f, StrtofChar("00000000200000", -51));
795*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(800000e-50f, StrtofChar("000000800000", -50));
796*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(0.0f, StrtofChar("00000000100000", -51));
797*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e-45f, StrtofChar("00000000900000", -51));
798*a6021da3SAndroid Build Coastguard Worker
799*a6021da3SAndroid Build Coastguard Worker // It would be more readable to put the literals (and not Double::Infinity())
800*a6021da3SAndroid Build Coastguard Worker // on the left side (i.e. CHECK_EQ(3e38, StrtofChar("3", 38))), but then Gcc
801*a6021da3SAndroid Build Coastguard Worker // complains that the floating constant exceeds range of 'double'.
802*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(Single::Infinity(), StrtofChar("3", 39));
803*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(3e38f, StrtofChar("3", 38));
804*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(3401e35f, StrtofChar("3401", 35));
805*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(3401e34f, StrtofChar("3401", 34));
806*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(Single::Infinity(), StrtofChar("3410", 35));
807*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(34e37f, StrtofChar("34", 37));
808*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(Single::Infinity(), StrtofChar("0000001", 39));
809*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(3401e35f, StrtofChar("0000003401", 35));
810*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(3401e34f, StrtofChar("0000003401", 34));
811*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(Single::Infinity(), StrtofChar("0000003410", 35));
812*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(34e37f, StrtofChar("00000034", 37));
813*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e38f, StrtofChar("100000", 33));
814*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(3401e35f, StrtofChar("340100000", 30));
815*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(3401e34f, StrtofChar("340100000", 29));
816*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(Single::Infinity(), StrtofChar("341000000", 30));
817*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(34e37f, StrtofChar("3400000", 32));
818*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e38f, StrtofChar("00000100000", 33));
819*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(3401e35f, StrtofChar("00000340100000", 30));
820*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(3401e34f, StrtofChar("00000340100000", 29));
821*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(Single::Infinity(), StrtofChar("00000341000000", 30));
822*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(34e37f, StrtofChar("000003400000", 32));
823*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(3.4028234e+38f, StrtofChar("34028235676", 28));
824*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(3.4028234e+38f, StrtofChar("34028235677", 28));
825*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(Single::Infinity(), StrtofChar("34028235678", 28));
826*a6021da3SAndroid Build Coastguard Worker
827*a6021da3SAndroid Build Coastguard Worker // The following number is the result of 89255.0/1e-22. Both floating-point
828*a6021da3SAndroid Build Coastguard Worker // numbers can be accurately represented with doubles. However on Linux,x86
829*a6021da3SAndroid Build Coastguard Worker // the floating-point stack is set to 80bits and the double-rounding
830*a6021da3SAndroid Build Coastguard Worker // introduces an error.
831*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(89255e-22f, StrtofChar("89255", -22));
832*a6021da3SAndroid Build Coastguard Worker
833*a6021da3SAndroid Build Coastguard Worker // Boundary cases. Boundaries themselves should round to even.
834*a6021da3SAndroid Build Coastguard Worker //
835*a6021da3SAndroid Build Coastguard Worker // 0x4f012334 = 2166567936
836*a6021da3SAndroid Build Coastguard Worker // next: 2166568192
837*a6021da3SAndroid Build Coastguard Worker // boundary: 2166568064 should round down.
838*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2166567936.0f, StrtofChar("2166567936", 0));
839*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2166568192.0f, StrtofChar("2166568192", 0));
840*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2166567936.0f, StrtofChar("2166568064", 0));
841*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2166567936.0f, StrtofChar("216656806399999", -5));
842*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2166568192.0f, StrtofChar("216656806400001", -5));
843*a6021da3SAndroid Build Coastguard Worker // Verify that we don't double round.
844*a6021da3SAndroid Build Coastguard Worker // Get the boundary of the boundary.
845*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2.1665680640000002384185791015625e9, 2166568064.0);
846*a6021da3SAndroid Build Coastguard Worker // Visual Studio gets this wrong and believes that these two numbers are the
847*a6021da3SAndroid Build Coastguard Worker // same doubles. We want to test our conversion and not the compiler. We
848*a6021da3SAndroid Build Coastguard Worker // therefore disable the check.
849*a6021da3SAndroid Build Coastguard Worker #ifndef _MSC_VER
850*a6021da3SAndroid Build Coastguard Worker CHECK(2.16656806400000023841857910156251e9 != 2166568064.0);
851*a6021da3SAndroid Build Coastguard Worker #endif
852*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2166568192.0f, StrtofChar("21665680640000002384185791015625", -22));
853*a6021da3SAndroid Build Coastguard Worker
854*a6021da3SAndroid Build Coastguard Worker // 0x4fffffff = 8589934080
855*a6021da3SAndroid Build Coastguard Worker // next: 8589934592
856*a6021da3SAndroid Build Coastguard Worker // boundary: 8589934336 should round up.
857*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(8589934080.0f, StrtofChar("8589934080", 0));
858*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(8589934592.0f, StrtofChar("8589934592", 0));
859*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(8589934592.0f, StrtofChar("8589934336", 0));
860*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(8589934080.0f, StrtofChar("858993433599999", -5));
861*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(8589934592.0f, StrtofChar("858993433600001", -5));
862*a6021da3SAndroid Build Coastguard Worker // Verify that we don't double round.
863*a6021da3SAndroid Build Coastguard Worker // Get the boundary of the boundary.
864*a6021da3SAndroid Build Coastguard Worker // Visual Studio gets this wrong. To avoid failing tests because of a broken
865*a6021da3SAndroid Build Coastguard Worker // compiler we disable the following two tests. They were only testing the
866*a6021da3SAndroid Build Coastguard Worker // compiler. The real test is still active.
867*a6021da3SAndroid Build Coastguard Worker #ifndef _MSC_VER
868*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(8.589934335999999523162841796875e+09, 8589934336.0);
869*a6021da3SAndroid Build Coastguard Worker CHECK(8.5899343359999995231628417968749e+09 != 8589934336.0);
870*a6021da3SAndroid Build Coastguard Worker #endif
871*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(8589934080.0f, StrtofChar("8589934335999999523162841796875", -21));
872*a6021da3SAndroid Build Coastguard Worker
873*a6021da3SAndroid Build Coastguard Worker // 0x4f000000 = 2147483648
874*a6021da3SAndroid Build Coastguard Worker // next: 2147483904
875*a6021da3SAndroid Build Coastguard Worker // boundary: 2147483776 should round down.
876*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2147483648.0f, StrtofChar("2147483648", 0));
877*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2147483904.0f, StrtofChar("2147483904", 0));
878*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2147483648.0f, StrtofChar("2147483776", 0));
879*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2147483648.0f, StrtofChar("214748377599999", -5));
880*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2147483904.0f, StrtofChar("214748377600001", -5));
881*a6021da3SAndroid Build Coastguard Worker
882*a6021da3SAndroid Build Coastguard Worker }
883*a6021da3SAndroid Build Coastguard Worker
TEST(StrtofTrimmed)884*a6021da3SAndroid Build Coastguard Worker TEST(StrtofTrimmed) {
885*a6021da3SAndroid Build Coastguard Worker Vector<const char> vector;
886*a6021da3SAndroid Build Coastguard Worker
887*a6021da3SAndroid Build Coastguard Worker vector = StringToVector("1");
888*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1.0f, StrtofTrimmed(vector, 0));
889*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(10.0f, StrtofTrimmed(vector, 1));
890*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(100.0f, StrtofTrimmed(vector, 2));
891*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e20f, StrtofTrimmed(vector, 20));
892*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e22f, StrtofTrimmed(vector, 22));
893*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e23f, StrtofTrimmed(vector, 23));
894*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e35f, StrtofTrimmed(vector, 35));
895*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e36f, StrtofTrimmed(vector, 36));
896*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e37f, StrtofTrimmed(vector, 37));
897*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e-1f, StrtofTrimmed(vector, -1));
898*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e-2f, StrtofTrimmed(vector, -2));
899*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e-5f, StrtofTrimmed(vector, -5));
900*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e-20f, StrtofTrimmed(vector, -20));
901*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e-22f, StrtofTrimmed(vector, -22));
902*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e-23f, StrtofTrimmed(vector, -23));
903*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e-25f, StrtofTrimmed(vector, -25));
904*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e-39f, StrtofTrimmed(vector, -39));
905*a6021da3SAndroid Build Coastguard Worker
906*a6021da3SAndroid Build Coastguard Worker vector = StringToVector("2");
907*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2.0f, StrtofTrimmed(vector, 0));
908*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(20.0f, StrtofTrimmed(vector, 1));
909*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(200.0f, StrtofTrimmed(vector, 2));
910*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e20f, StrtofTrimmed(vector, 20));
911*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e22f, StrtofTrimmed(vector, 22));
912*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e23f, StrtofTrimmed(vector, 23));
913*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e35f, StrtofTrimmed(vector, 35));
914*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e36f, StrtofTrimmed(vector, 36));
915*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e37f, StrtofTrimmed(vector, 37));
916*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e-1f, StrtofTrimmed(vector, -1));
917*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e-2f, StrtofTrimmed(vector, -2));
918*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e-5f, StrtofTrimmed(vector, -5));
919*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e-20f, StrtofTrimmed(vector, -20));
920*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e-22f, StrtofTrimmed(vector, -22));
921*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e-23f, StrtofTrimmed(vector, -23));
922*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e-25f, StrtofTrimmed(vector, -25));
923*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2e-39f, StrtofTrimmed(vector, -39));
924*a6021da3SAndroid Build Coastguard Worker
925*a6021da3SAndroid Build Coastguard Worker vector = StringToVector("9");
926*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9.0f, StrtofTrimmed(vector, 0));
927*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(90.0f, StrtofTrimmed(vector, 1));
928*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(900.0f, StrtofTrimmed(vector, 2));
929*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e20f, StrtofTrimmed(vector, 20));
930*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e22f, StrtofTrimmed(vector, 22));
931*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e23f, StrtofTrimmed(vector, 23));
932*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e35f, StrtofTrimmed(vector, 35));
933*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e36f, StrtofTrimmed(vector, 36));
934*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e37f, StrtofTrimmed(vector, 37));
935*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e-1f, StrtofTrimmed(vector, -1));
936*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e-2f, StrtofTrimmed(vector, -2));
937*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e-5f, StrtofTrimmed(vector, -5));
938*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e-20f, StrtofTrimmed(vector, -20));
939*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e-22f, StrtofTrimmed(vector, -22));
940*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e-23f, StrtofTrimmed(vector, -23));
941*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e-25f, StrtofTrimmed(vector, -25));
942*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(9e-39f, StrtofTrimmed(vector, -39));
943*a6021da3SAndroid Build Coastguard Worker
944*a6021da3SAndroid Build Coastguard Worker vector = StringToVector("12345");
945*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345.0f, StrtofTrimmed(vector, 0));
946*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123450.0f, StrtofTrimmed(vector, 1));
947*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234500.0f, StrtofTrimmed(vector, 2));
948*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e20f, StrtofTrimmed(vector, 20));
949*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e22f, StrtofTrimmed(vector, 22));
950*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e23f, StrtofTrimmed(vector, 23));
951*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e30f, StrtofTrimmed(vector, 30));
952*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e31f, StrtofTrimmed(vector, 31));
953*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e32f, StrtofTrimmed(vector, 32));
954*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e-1f, StrtofTrimmed(vector, -1));
955*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e-2f, StrtofTrimmed(vector, -2));
956*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e-5f, StrtofTrimmed(vector, -5));
957*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e-20f, StrtofTrimmed(vector, -20));
958*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e-22f, StrtofTrimmed(vector, -22));
959*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e-23f, StrtofTrimmed(vector, -23));
960*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e-25f, StrtofTrimmed(vector, -25));
961*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345e-39f, StrtofTrimmed(vector, -39));
962*a6021da3SAndroid Build Coastguard Worker
963*a6021da3SAndroid Build Coastguard Worker vector = StringToVector("12345678901234");
964*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234.0f, StrtofTrimmed(vector, 0));
965*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012340.0f, StrtofTrimmed(vector, 1));
966*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234567890123400.0f, StrtofTrimmed(vector, 2));
967*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e20f, StrtofTrimmed(vector, 20));
968*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e22f, StrtofTrimmed(vector, 22));
969*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e23f, StrtofTrimmed(vector, 23));
970*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e-1f, StrtofTrimmed(vector, -1));
971*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e-2f, StrtofTrimmed(vector, -2));
972*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e-5f, StrtofTrimmed(vector, -5));
973*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e-20f, StrtofTrimmed(vector, -20));
974*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e-22f, StrtofTrimmed(vector, -22));
975*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e-23f, StrtofTrimmed(vector, -23));
976*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e-25f, StrtofTrimmed(vector, -25));
977*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234e-39f, StrtofTrimmed(vector, -39));
978*a6021da3SAndroid Build Coastguard Worker
979*a6021da3SAndroid Build Coastguard Worker vector = StringToVector("123456789012345");
980*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345.0f, StrtofTrimmed(vector, 0));
981*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1234567890123450.0f, StrtofTrimmed(vector, 1));
982*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(12345678901234500.0f, StrtofTrimmed(vector, 2));
983*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345e20f, StrtofTrimmed(vector, 20));
984*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345e22f, StrtofTrimmed(vector, 22));
985*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345e23f, StrtofTrimmed(vector, 23));
986*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345e-1f, StrtofTrimmed(vector, -1));
987*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345e-2f, StrtofTrimmed(vector, -2));
988*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345e-5f, StrtofTrimmed(vector, -5));
989*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345e-20f, StrtofTrimmed(vector, -20));
990*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345e-22f, StrtofTrimmed(vector, -22));
991*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345e-23f, StrtofTrimmed(vector, -23));
992*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345e-25f, StrtofTrimmed(vector, -25));
993*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(123456789012345e-39f, StrtofTrimmed(vector, -39));
994*a6021da3SAndroid Build Coastguard Worker
995*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(0.0f, StrtofTrimmedChar("", 1324));
996*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(0.0f, StrtofTrimmedChar("2", -324));
997*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e-45f, StrtofTrimmedChar("1", -45));
998*a6021da3SAndroid Build Coastguard Worker // It would be more readable to put non-zero literals on the left side (i.e.
999*a6021da3SAndroid Build Coastguard Worker // CHECK_EQ(1e-46, StrtofChar("1", -45))), but then Gcc complains that
1000*a6021da3SAndroid Build Coastguard Worker // they are truncated to zero.
1001*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(0.0f, StrtofTrimmedChar("1", -46));
1002*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(0.0f, StrtofTrimmedChar("1", -47));
1003*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e-45f, StrtofTrimmedChar("1", -45));
1004*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1e-45f, StrtofTrimmedChar("8", -46));
1005*a6021da3SAndroid Build Coastguard Worker
1006*a6021da3SAndroid Build Coastguard Worker // It would be more readable to put the literals (and not Double::Infinity())
1007*a6021da3SAndroid Build Coastguard Worker // on the left side (i.e. CHECK_EQ(3e38, StrtofChar("3", 38))), but then Gcc
1008*a6021da3SAndroid Build Coastguard Worker // complains that the floating constant exceeds range of 'double'.
1009*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(Single::Infinity(), StrtofTrimmedChar("3", 39));
1010*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(3e38f, StrtofTrimmedChar("3", 38));
1011*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(3401e35f, StrtofTrimmedChar("3401", 35));
1012*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(3401e34f, StrtofTrimmedChar("3401", 34));
1013*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(34e37f, StrtofTrimmedChar("34", 37));
1014*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(3.4028234e+38f, StrtofTrimmedChar("34028235676", 28));
1015*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(3.4028234e+38f, StrtofTrimmedChar("34028235677", 28));
1016*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(Single::Infinity(), StrtofTrimmedChar("34028235678", 28));
1017*a6021da3SAndroid Build Coastguard Worker
1018*a6021da3SAndroid Build Coastguard Worker // The following number is the result of 89255.0/1e-22. Both floating-point
1019*a6021da3SAndroid Build Coastguard Worker // numbers can be accurately represented with doubles. However on Linux,x86
1020*a6021da3SAndroid Build Coastguard Worker // the floating-point stack is set to 80bits and the double-rounding
1021*a6021da3SAndroid Build Coastguard Worker // introduces an error.
1022*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(89255e-22f, StrtofTrimmedChar("89255", -22));
1023*a6021da3SAndroid Build Coastguard Worker
1024*a6021da3SAndroid Build Coastguard Worker // Boundary cases. Boundaries themselves should round to even.
1025*a6021da3SAndroid Build Coastguard Worker //
1026*a6021da3SAndroid Build Coastguard Worker // 0x4f012334 = 2166567936
1027*a6021da3SAndroid Build Coastguard Worker // next: 2166568192
1028*a6021da3SAndroid Build Coastguard Worker // boundary: 2166568064 should round down.
1029*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2166567936.0f, StrtofTrimmedChar("2166567936", 0));
1030*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2166568192.0f, StrtofTrimmedChar("2166568192", 0));
1031*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2166567936.0f, StrtofTrimmedChar("2166568064", 0));
1032*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2166567936.0f, StrtofTrimmedChar("216656806399999", -5));
1033*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2166568192.0f, StrtofTrimmedChar("216656806400001", -5));
1034*a6021da3SAndroid Build Coastguard Worker // Verify that we don't double round.
1035*a6021da3SAndroid Build Coastguard Worker // Get the boundary of the boundary.
1036*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2.1665680640000002384185791015625e9, 2166568064.0);
1037*a6021da3SAndroid Build Coastguard Worker // Visual Studio gets this wrong and believes that these two numbers are the
1038*a6021da3SAndroid Build Coastguard Worker // same doubles. We want to test our conversion and not the compiler. We
1039*a6021da3SAndroid Build Coastguard Worker // therefore disable the check.
1040*a6021da3SAndroid Build Coastguard Worker #ifndef _MSC_VER
1041*a6021da3SAndroid Build Coastguard Worker CHECK(2.16656806400000023841857910156251e9 != 2166568064.0);
1042*a6021da3SAndroid Build Coastguard Worker #endif
1043*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2166568192.0f, StrtofTrimmedChar("21665680640000002384185791015625", -22));
1044*a6021da3SAndroid Build Coastguard Worker
1045*a6021da3SAndroid Build Coastguard Worker // 0x4fffffff = 8589934080
1046*a6021da3SAndroid Build Coastguard Worker // next: 8589934592
1047*a6021da3SAndroid Build Coastguard Worker // boundary: 8589934336 should round up.
1048*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(8589934592.0f, StrtofTrimmedChar("8589934592", 0));
1049*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(8589934592.0f, StrtofTrimmedChar("8589934336", 0));
1050*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(8589934080.0f, StrtofTrimmedChar("858993433599999", -5));
1051*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(8589934592.0f, StrtofTrimmedChar("858993433600001", -5));
1052*a6021da3SAndroid Build Coastguard Worker // Verify that we don't double round.
1053*a6021da3SAndroid Build Coastguard Worker // Get the boundary of the boundary.
1054*a6021da3SAndroid Build Coastguard Worker // Visual Studio gets this wrong. To avoid failing tests because of a broken
1055*a6021da3SAndroid Build Coastguard Worker // compiler we disable the following two tests. They were only testing the
1056*a6021da3SAndroid Build Coastguard Worker // compiler. The real test is still active.
1057*a6021da3SAndroid Build Coastguard Worker #ifndef _MSC_VER
1058*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(8.589934335999999523162841796875e+09, 8589934336.0);
1059*a6021da3SAndroid Build Coastguard Worker CHECK(8.5899343359999995231628417968749e+09 != 8589934336.0);
1060*a6021da3SAndroid Build Coastguard Worker #endif
1061*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(8589934080.0f, StrtofTrimmedChar("8589934335999999523162841796875", -21));
1062*a6021da3SAndroid Build Coastguard Worker
1063*a6021da3SAndroid Build Coastguard Worker // 0x4f000000 = 2147483648
1064*a6021da3SAndroid Build Coastguard Worker // next: 2147483904
1065*a6021da3SAndroid Build Coastguard Worker // boundary: 2147483776 should round down.
1066*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2147483648.0f, StrtofTrimmedChar("2147483648", 0));
1067*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2147483904.0f, StrtofTrimmedChar("2147483904", 0));
1068*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2147483648.0f, StrtofTrimmedChar("2147483776", 0));
1069*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2147483648.0f, StrtofTrimmedChar("214748377599999", -5));
1070*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(2147483904.0f, StrtofTrimmedChar("214748377600001", -5));
1071*a6021da3SAndroid Build Coastguard Worker }
1072*a6021da3SAndroid Build Coastguard Worker
CompareBignumToDiyFp(const Bignum & bignum_digits,int bignum_exponent,DiyFp diy_fp)1073*a6021da3SAndroid Build Coastguard Worker static int CompareBignumToDiyFp(const Bignum& bignum_digits,
1074*a6021da3SAndroid Build Coastguard Worker int bignum_exponent,
1075*a6021da3SAndroid Build Coastguard Worker DiyFp diy_fp) {
1076*a6021da3SAndroid Build Coastguard Worker Bignum bignum;
1077*a6021da3SAndroid Build Coastguard Worker bignum.AssignBignum(bignum_digits);
1078*a6021da3SAndroid Build Coastguard Worker Bignum other;
1079*a6021da3SAndroid Build Coastguard Worker other.AssignUInt64(diy_fp.f());
1080*a6021da3SAndroid Build Coastguard Worker if (bignum_exponent >= 0) {
1081*a6021da3SAndroid Build Coastguard Worker bignum.MultiplyByPowerOfTen(bignum_exponent);
1082*a6021da3SAndroid Build Coastguard Worker } else {
1083*a6021da3SAndroid Build Coastguard Worker other.MultiplyByPowerOfTen(-bignum_exponent);
1084*a6021da3SAndroid Build Coastguard Worker }
1085*a6021da3SAndroid Build Coastguard Worker if (diy_fp.e() >= 0) {
1086*a6021da3SAndroid Build Coastguard Worker other.ShiftLeft(diy_fp.e());
1087*a6021da3SAndroid Build Coastguard Worker } else {
1088*a6021da3SAndroid Build Coastguard Worker bignum.ShiftLeft(-diy_fp.e());
1089*a6021da3SAndroid Build Coastguard Worker }
1090*a6021da3SAndroid Build Coastguard Worker return Bignum::Compare(bignum, other);
1091*a6021da3SAndroid Build Coastguard Worker }
1092*a6021da3SAndroid Build Coastguard Worker
1093*a6021da3SAndroid Build Coastguard Worker
CheckDouble(Vector<const char> buffer,int exponent,double to_check)1094*a6021da3SAndroid Build Coastguard Worker static bool CheckDouble(Vector<const char> buffer,
1095*a6021da3SAndroid Build Coastguard Worker int exponent,
1096*a6021da3SAndroid Build Coastguard Worker double to_check) {
1097*a6021da3SAndroid Build Coastguard Worker DiyFp lower_boundary;
1098*a6021da3SAndroid Build Coastguard Worker DiyFp upper_boundary;
1099*a6021da3SAndroid Build Coastguard Worker Bignum input_digits;
1100*a6021da3SAndroid Build Coastguard Worker input_digits.AssignDecimalString(buffer);
1101*a6021da3SAndroid Build Coastguard Worker if (to_check == 0.0) {
1102*a6021da3SAndroid Build Coastguard Worker const double kMinDouble = 4e-324;
1103*a6021da3SAndroid Build Coastguard Worker // Check that the buffer*10^exponent < (0 + kMinDouble)/2.
1104*a6021da3SAndroid Build Coastguard Worker Double d(kMinDouble);
1105*a6021da3SAndroid Build Coastguard Worker d.NormalizedBoundaries(&lower_boundary, &upper_boundary);
1106*a6021da3SAndroid Build Coastguard Worker return CompareBignumToDiyFp(input_digits, exponent, lower_boundary) <= 0;
1107*a6021da3SAndroid Build Coastguard Worker }
1108*a6021da3SAndroid Build Coastguard Worker if (to_check == Double::Infinity()) {
1109*a6021da3SAndroid Build Coastguard Worker const double kMaxDouble = 1.7976931348623157e308;
1110*a6021da3SAndroid Build Coastguard Worker // Check that the buffer*10^exponent >= boundary between kMaxDouble and inf.
1111*a6021da3SAndroid Build Coastguard Worker Double d(kMaxDouble);
1112*a6021da3SAndroid Build Coastguard Worker d.NormalizedBoundaries(&lower_boundary, &upper_boundary);
1113*a6021da3SAndroid Build Coastguard Worker return CompareBignumToDiyFp(input_digits, exponent, upper_boundary) >= 0;
1114*a6021da3SAndroid Build Coastguard Worker }
1115*a6021da3SAndroid Build Coastguard Worker Double d(to_check);
1116*a6021da3SAndroid Build Coastguard Worker d.NormalizedBoundaries(&lower_boundary, &upper_boundary);
1117*a6021da3SAndroid Build Coastguard Worker if ((d.Significand() & 1) == 0) {
1118*a6021da3SAndroid Build Coastguard Worker return CompareBignumToDiyFp(input_digits, exponent, lower_boundary) >= 0 &&
1119*a6021da3SAndroid Build Coastguard Worker CompareBignumToDiyFp(input_digits, exponent, upper_boundary) <= 0;
1120*a6021da3SAndroid Build Coastguard Worker } else {
1121*a6021da3SAndroid Build Coastguard Worker return CompareBignumToDiyFp(input_digits, exponent, lower_boundary) > 0 &&
1122*a6021da3SAndroid Build Coastguard Worker CompareBignumToDiyFp(input_digits, exponent, upper_boundary) < 0;
1123*a6021da3SAndroid Build Coastguard Worker }
1124*a6021da3SAndroid Build Coastguard Worker }
1125*a6021da3SAndroid Build Coastguard Worker
1126*a6021da3SAndroid Build Coastguard Worker
1127*a6021da3SAndroid Build Coastguard Worker // Copied from v8.cc and adapted to make the function deterministic.
DeterministicRandom()1128*a6021da3SAndroid Build Coastguard Worker static uint32_t DeterministicRandom() {
1129*a6021da3SAndroid Build Coastguard Worker // Random number generator using George Marsaglia's MWC algorithm.
1130*a6021da3SAndroid Build Coastguard Worker static uint32_t hi = 0;
1131*a6021da3SAndroid Build Coastguard Worker static uint32_t lo = 0;
1132*a6021da3SAndroid Build Coastguard Worker
1133*a6021da3SAndroid Build Coastguard Worker // Initialization values don't have any special meaning. (They are the result
1134*a6021da3SAndroid Build Coastguard Worker // of two calls to random().)
1135*a6021da3SAndroid Build Coastguard Worker if (hi == 0) hi = 0xbfe166e7;
1136*a6021da3SAndroid Build Coastguard Worker if (lo == 0) lo = 0x64d1c3c9;
1137*a6021da3SAndroid Build Coastguard Worker
1138*a6021da3SAndroid Build Coastguard Worker // Mix the bits.
1139*a6021da3SAndroid Build Coastguard Worker hi = 36969 * (hi & 0xFFFF) + (hi >> 16);
1140*a6021da3SAndroid Build Coastguard Worker lo = 18273 * (lo & 0xFFFF) + (lo >> 16);
1141*a6021da3SAndroid Build Coastguard Worker return (hi << 16) + (lo & 0xFFFF);
1142*a6021da3SAndroid Build Coastguard Worker }
1143*a6021da3SAndroid Build Coastguard Worker
1144*a6021da3SAndroid Build Coastguard Worker
1145*a6021da3SAndroid Build Coastguard Worker static const int kBufferSize = 1024;
1146*a6021da3SAndroid Build Coastguard Worker static const int kShortStrtodRandomCount = 2;
1147*a6021da3SAndroid Build Coastguard Worker static const int kLargeStrtodRandomCount = 2;
1148*a6021da3SAndroid Build Coastguard Worker
TEST(RandomStrtod)1149*a6021da3SAndroid Build Coastguard Worker TEST(RandomStrtod) {
1150*a6021da3SAndroid Build Coastguard Worker char buffer[kBufferSize];
1151*a6021da3SAndroid Build Coastguard Worker for (int length = 1; length < 15; length++) {
1152*a6021da3SAndroid Build Coastguard Worker for (int i = 0; i < kShortStrtodRandomCount; ++i) {
1153*a6021da3SAndroid Build Coastguard Worker int pos = 0;
1154*a6021da3SAndroid Build Coastguard Worker for (int j = 0; j < length; ++j) {
1155*a6021da3SAndroid Build Coastguard Worker buffer[pos++] = DeterministicRandom() % 10 + '0';
1156*a6021da3SAndroid Build Coastguard Worker }
1157*a6021da3SAndroid Build Coastguard Worker int exponent = DeterministicRandom() % (25*2 + 1) - 25 - length;
1158*a6021da3SAndroid Build Coastguard Worker buffer[pos] = '\0';
1159*a6021da3SAndroid Build Coastguard Worker Vector<const char> vector(buffer, pos);
1160*a6021da3SAndroid Build Coastguard Worker double strtod_result = Strtod(vector, exponent);
1161*a6021da3SAndroid Build Coastguard Worker CHECK(CheckDouble(vector, exponent, strtod_result));
1162*a6021da3SAndroid Build Coastguard Worker }
1163*a6021da3SAndroid Build Coastguard Worker }
1164*a6021da3SAndroid Build Coastguard Worker for (int length = 15; length < 800; length += 2) {
1165*a6021da3SAndroid Build Coastguard Worker for (int i = 0; i < kLargeStrtodRandomCount; ++i) {
1166*a6021da3SAndroid Build Coastguard Worker int pos = 0;
1167*a6021da3SAndroid Build Coastguard Worker for (int j = 0; j < length; ++j) {
1168*a6021da3SAndroid Build Coastguard Worker buffer[pos++] = DeterministicRandom() % 10 + '0';
1169*a6021da3SAndroid Build Coastguard Worker }
1170*a6021da3SAndroid Build Coastguard Worker int exponent = DeterministicRandom() % (308*2 + 1) - 308 - length;
1171*a6021da3SAndroid Build Coastguard Worker buffer[pos] = '\0';
1172*a6021da3SAndroid Build Coastguard Worker Vector<const char> vector(buffer, pos);
1173*a6021da3SAndroid Build Coastguard Worker double strtod_result = Strtod(vector, exponent);
1174*a6021da3SAndroid Build Coastguard Worker CHECK(CheckDouble(vector, exponent, strtod_result));
1175*a6021da3SAndroid Build Coastguard Worker }
1176*a6021da3SAndroid Build Coastguard Worker }
1177*a6021da3SAndroid Build Coastguard Worker }
1178*a6021da3SAndroid Build Coastguard Worker
1179*a6021da3SAndroid Build Coastguard Worker
CheckFloat(Vector<const char> buffer,int exponent,float to_check)1180*a6021da3SAndroid Build Coastguard Worker static bool CheckFloat(Vector<const char> buffer,
1181*a6021da3SAndroid Build Coastguard Worker int exponent,
1182*a6021da3SAndroid Build Coastguard Worker float to_check) {
1183*a6021da3SAndroid Build Coastguard Worker DiyFp lower_boundary;
1184*a6021da3SAndroid Build Coastguard Worker DiyFp upper_boundary;
1185*a6021da3SAndroid Build Coastguard Worker Bignum input_digits;
1186*a6021da3SAndroid Build Coastguard Worker input_digits.AssignDecimalString(buffer);
1187*a6021da3SAndroid Build Coastguard Worker if (to_check == 0.0) {
1188*a6021da3SAndroid Build Coastguard Worker const float kMinFloat = 1e-45f;
1189*a6021da3SAndroid Build Coastguard Worker // Check that the buffer*10^exponent < (0 + kMinFloat)/2.
1190*a6021da3SAndroid Build Coastguard Worker Single s(kMinFloat);
1191*a6021da3SAndroid Build Coastguard Worker s.NormalizedBoundaries(&lower_boundary, &upper_boundary);
1192*a6021da3SAndroid Build Coastguard Worker return CompareBignumToDiyFp(input_digits, exponent, lower_boundary) <= 0;
1193*a6021da3SAndroid Build Coastguard Worker }
1194*a6021da3SAndroid Build Coastguard Worker if (to_check == static_cast<float>(Double::Infinity())) {
1195*a6021da3SAndroid Build Coastguard Worker const float kMaxFloat = 3.4028234e38f;
1196*a6021da3SAndroid Build Coastguard Worker // Check that the buffer*10^exponent >= boundary between kMaxFloat and inf.
1197*a6021da3SAndroid Build Coastguard Worker Single s(kMaxFloat);
1198*a6021da3SAndroid Build Coastguard Worker s.NormalizedBoundaries(&lower_boundary, &upper_boundary);
1199*a6021da3SAndroid Build Coastguard Worker return CompareBignumToDiyFp(input_digits, exponent, upper_boundary) >= 0;
1200*a6021da3SAndroid Build Coastguard Worker }
1201*a6021da3SAndroid Build Coastguard Worker Single s(to_check);
1202*a6021da3SAndroid Build Coastguard Worker s.NormalizedBoundaries(&lower_boundary, &upper_boundary);
1203*a6021da3SAndroid Build Coastguard Worker if ((s.Significand() & 1) == 0) {
1204*a6021da3SAndroid Build Coastguard Worker return CompareBignumToDiyFp(input_digits, exponent, lower_boundary) >= 0 &&
1205*a6021da3SAndroid Build Coastguard Worker CompareBignumToDiyFp(input_digits, exponent, upper_boundary) <= 0;
1206*a6021da3SAndroid Build Coastguard Worker } else {
1207*a6021da3SAndroid Build Coastguard Worker return CompareBignumToDiyFp(input_digits, exponent, lower_boundary) > 0 &&
1208*a6021da3SAndroid Build Coastguard Worker CompareBignumToDiyFp(input_digits, exponent, upper_boundary) < 0;
1209*a6021da3SAndroid Build Coastguard Worker }
1210*a6021da3SAndroid Build Coastguard Worker }
1211*a6021da3SAndroid Build Coastguard Worker
1212*a6021da3SAndroid Build Coastguard Worker
1213*a6021da3SAndroid Build Coastguard Worker static const int kShortStrtofRandomCount = 2;
1214*a6021da3SAndroid Build Coastguard Worker static const int kLargeStrtofRandomCount = 2;
1215*a6021da3SAndroid Build Coastguard Worker
TEST(RandomStrtof)1216*a6021da3SAndroid Build Coastguard Worker TEST(RandomStrtof) {
1217*a6021da3SAndroid Build Coastguard Worker char buffer[kBufferSize];
1218*a6021da3SAndroid Build Coastguard Worker for (int length = 1; length < 15; length++) {
1219*a6021da3SAndroid Build Coastguard Worker for (int i = 0; i < kShortStrtofRandomCount; ++i) {
1220*a6021da3SAndroid Build Coastguard Worker int pos = 0;
1221*a6021da3SAndroid Build Coastguard Worker for (int j = 0; j < length; ++j) {
1222*a6021da3SAndroid Build Coastguard Worker buffer[pos++] = DeterministicRandom() % 10 + '0';
1223*a6021da3SAndroid Build Coastguard Worker }
1224*a6021da3SAndroid Build Coastguard Worker int exponent = DeterministicRandom() % (5*2 + 1) - 5 - length;
1225*a6021da3SAndroid Build Coastguard Worker buffer[pos] = '\0';
1226*a6021da3SAndroid Build Coastguard Worker Vector<const char> vector(buffer, pos);
1227*a6021da3SAndroid Build Coastguard Worker float strtof_result = Strtof(vector, exponent);
1228*a6021da3SAndroid Build Coastguard Worker CHECK(CheckFloat(vector, exponent, strtof_result));
1229*a6021da3SAndroid Build Coastguard Worker }
1230*a6021da3SAndroid Build Coastguard Worker }
1231*a6021da3SAndroid Build Coastguard Worker for (int length = 15; length < 800; length += 2) {
1232*a6021da3SAndroid Build Coastguard Worker for (int i = 0; i < kLargeStrtofRandomCount; ++i) {
1233*a6021da3SAndroid Build Coastguard Worker int pos = 0;
1234*a6021da3SAndroid Build Coastguard Worker for (int j = 0; j < length; ++j) {
1235*a6021da3SAndroid Build Coastguard Worker buffer[pos++] = DeterministicRandom() % 10 + '0';
1236*a6021da3SAndroid Build Coastguard Worker }
1237*a6021da3SAndroid Build Coastguard Worker int exponent = DeterministicRandom() % (38*2 + 1) - 38 - length;
1238*a6021da3SAndroid Build Coastguard Worker buffer[pos] = '\0';
1239*a6021da3SAndroid Build Coastguard Worker Vector<const char> vector(buffer, pos);
1240*a6021da3SAndroid Build Coastguard Worker float strtof_result = Strtof(vector, exponent);
1241*a6021da3SAndroid Build Coastguard Worker CHECK(CheckFloat(vector, exponent, strtof_result));
1242*a6021da3SAndroid Build Coastguard Worker }
1243*a6021da3SAndroid Build Coastguard Worker }
1244*a6021da3SAndroid Build Coastguard Worker }
1245