1*a6021da3SAndroid Build Coastguard Worker // Copyright 2010 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/double-conversion.h"
31*a6021da3SAndroid Build Coastguard Worker
32*a6021da3SAndroid Build Coastguard Worker #include "cctest.h"
33*a6021da3SAndroid Build Coastguard Worker #include "gay-fixed.h"
34*a6021da3SAndroid Build Coastguard Worker #include "gay-precision.h"
35*a6021da3SAndroid Build Coastguard Worker #include "gay-shortest.h"
36*a6021da3SAndroid Build Coastguard Worker #include "gay-shortest-single.h"
37*a6021da3SAndroid Build Coastguard Worker #include "double-conversion/ieee.h"
38*a6021da3SAndroid Build Coastguard Worker
39*a6021da3SAndroid Build Coastguard Worker
40*a6021da3SAndroid Build Coastguard Worker using namespace double_conversion;
41*a6021da3SAndroid Build Coastguard Worker
42*a6021da3SAndroid Build Coastguard Worker
43*a6021da3SAndroid Build Coastguard Worker enum DtoaMode {
44*a6021da3SAndroid Build Coastguard Worker SHORTEST,
45*a6021da3SAndroid Build Coastguard Worker SHORTEST_SINGLE,
46*a6021da3SAndroid Build Coastguard Worker FIXED,
47*a6021da3SAndroid Build Coastguard Worker PRECISION
48*a6021da3SAndroid Build Coastguard Worker };
49*a6021da3SAndroid Build Coastguard Worker
DoubleToAscii(double v,DtoaMode test_mode,int requested_digits,Vector<char> buffer,bool * sign,int * length,int * point)50*a6021da3SAndroid Build Coastguard Worker static void DoubleToAscii(double v, DtoaMode test_mode, int requested_digits,
51*a6021da3SAndroid Build Coastguard Worker Vector<char> buffer, bool* sign, int* length,
52*a6021da3SAndroid Build Coastguard Worker int* point) {
53*a6021da3SAndroid Build Coastguard Worker DoubleToStringConverter::DtoaMode mode = DoubleToStringConverter::SHORTEST;
54*a6021da3SAndroid Build Coastguard Worker switch (test_mode) {
55*a6021da3SAndroid Build Coastguard Worker case SHORTEST: mode = DoubleToStringConverter::SHORTEST; break;
56*a6021da3SAndroid Build Coastguard Worker case SHORTEST_SINGLE:
57*a6021da3SAndroid Build Coastguard Worker mode = DoubleToStringConverter::SHORTEST_SINGLE;
58*a6021da3SAndroid Build Coastguard Worker break;
59*a6021da3SAndroid Build Coastguard Worker case FIXED: mode = DoubleToStringConverter::FIXED; break;
60*a6021da3SAndroid Build Coastguard Worker case PRECISION: mode = DoubleToStringConverter::PRECISION; break;
61*a6021da3SAndroid Build Coastguard Worker }
62*a6021da3SAndroid Build Coastguard Worker DoubleToStringConverter::DoubleToAscii(v, mode, requested_digits,
63*a6021da3SAndroid Build Coastguard Worker buffer.start(), buffer.length(),
64*a6021da3SAndroid Build Coastguard Worker sign, length, point);
65*a6021da3SAndroid Build Coastguard Worker }
66*a6021da3SAndroid Build Coastguard Worker
67*a6021da3SAndroid Build Coastguard Worker // Removes trailing '0' digits.
TrimRepresentation(Vector<char> representation)68*a6021da3SAndroid Build Coastguard Worker static void TrimRepresentation(Vector<char> representation) {
69*a6021da3SAndroid Build Coastguard Worker int len = static_cast<int>(strlen(representation.start()));
70*a6021da3SAndroid Build Coastguard Worker int i;
71*a6021da3SAndroid Build Coastguard Worker for (i = len - 1; i >= 0; --i) {
72*a6021da3SAndroid Build Coastguard Worker if (representation[i] != '0') break;
73*a6021da3SAndroid Build Coastguard Worker }
74*a6021da3SAndroid Build Coastguard Worker representation[i + 1] = '\0';
75*a6021da3SAndroid Build Coastguard Worker }
76*a6021da3SAndroid Build Coastguard Worker
77*a6021da3SAndroid Build Coastguard Worker
78*a6021da3SAndroid Build Coastguard Worker static const int kBufferSize = 100;
79*a6021da3SAndroid Build Coastguard Worker
80*a6021da3SAndroid Build Coastguard Worker
TEST(DtoaVariousDoubles)81*a6021da3SAndroid Build Coastguard Worker TEST(DtoaVariousDoubles) {
82*a6021da3SAndroid Build Coastguard Worker char buffer_container[kBufferSize];
83*a6021da3SAndroid Build Coastguard Worker Vector<char> buffer(buffer_container, kBufferSize);
84*a6021da3SAndroid Build Coastguard Worker int length;
85*a6021da3SAndroid Build Coastguard Worker int point;
86*a6021da3SAndroid Build Coastguard Worker bool sign;
87*a6021da3SAndroid Build Coastguard Worker
88*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(0.0, SHORTEST, 0, buffer, &sign, &length, &point);
89*a6021da3SAndroid Build Coastguard Worker CHECK_EQ("0", buffer.start());
90*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1, point);
91*a6021da3SAndroid Build Coastguard Worker
92*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(0.0f, SHORTEST_SINGLE, 0, buffer, &sign, &length, &point);
93*a6021da3SAndroid Build Coastguard Worker CHECK_EQ("0", buffer.start());
94*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1, point);
95*a6021da3SAndroid Build Coastguard Worker
96*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(0.0, FIXED, 2, buffer, &sign, &length, &point);
97*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1, length);
98*a6021da3SAndroid Build Coastguard Worker CHECK_EQ("0", buffer.start());
99*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1, point);
100*a6021da3SAndroid Build Coastguard Worker
101*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(0.0, PRECISION, 3, buffer, &sign, &length, &point);
102*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1, length);
103*a6021da3SAndroid Build Coastguard Worker CHECK_EQ("0", buffer.start());
104*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1, point);
105*a6021da3SAndroid Build Coastguard Worker
106*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(1.0, SHORTEST, 0, buffer, &sign, &length, &point);
107*a6021da3SAndroid Build Coastguard Worker CHECK_EQ("1", buffer.start());
108*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1, point);
109*a6021da3SAndroid Build Coastguard Worker
110*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(1.0f, SHORTEST_SINGLE, 0, buffer, &sign, &length, &point);
111*a6021da3SAndroid Build Coastguard Worker CHECK_EQ("1", buffer.start());
112*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1, point);
113*a6021da3SAndroid Build Coastguard Worker
114*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(1.0, FIXED, 3, buffer, &sign, &length, &point);
115*a6021da3SAndroid Build Coastguard Worker CHECK_GE(3, length - point);
116*a6021da3SAndroid Build Coastguard Worker TrimRepresentation(buffer);
117*a6021da3SAndroid Build Coastguard Worker CHECK_EQ("1", buffer.start());
118*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1, point);
119*a6021da3SAndroid Build Coastguard Worker
120*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(1.0, PRECISION, 3, buffer, &sign, &length, &point);
121*a6021da3SAndroid Build Coastguard Worker CHECK_GE(3, length);
122*a6021da3SAndroid Build Coastguard Worker TrimRepresentation(buffer);
123*a6021da3SAndroid Build Coastguard Worker CHECK_EQ("1", buffer.start());
124*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1, point);
125*a6021da3SAndroid Build Coastguard Worker
126*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(1.5, SHORTEST, 0, buffer, &sign, &length, &point);
127*a6021da3SAndroid Build Coastguard Worker CHECK_EQ("15", buffer.start());
128*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1, point);
129*a6021da3SAndroid Build Coastguard Worker
130*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(1.5f, SHORTEST_SINGLE, 0, buffer, &sign, &length, &point);
131*a6021da3SAndroid Build Coastguard Worker CHECK_EQ("15", buffer.start());
132*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1, point);
133*a6021da3SAndroid Build Coastguard Worker
134*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(1.5, FIXED, 10, buffer, &sign, &length, &point);
135*a6021da3SAndroid Build Coastguard Worker CHECK_GE(10, length - point);
136*a6021da3SAndroid Build Coastguard Worker TrimRepresentation(buffer);
137*a6021da3SAndroid Build Coastguard Worker CHECK_EQ("15", buffer.start());
138*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1, point);
139*a6021da3SAndroid Build Coastguard Worker
140*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(1.5, PRECISION, 10, buffer, &sign, &length, &point);
141*a6021da3SAndroid Build Coastguard Worker CHECK_GE(10, length);
142*a6021da3SAndroid Build Coastguard Worker TrimRepresentation(buffer);
143*a6021da3SAndroid Build Coastguard Worker CHECK_EQ("15", buffer.start());
144*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1, point);
145*a6021da3SAndroid Build Coastguard Worker
146*a6021da3SAndroid Build Coastguard Worker double min_double = 5e-324;
147*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(min_double, SHORTEST, 0, buffer, &sign, &length, &point);
148*a6021da3SAndroid Build Coastguard Worker CHECK_EQ("5", buffer.start());
149*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(-323, point);
150*a6021da3SAndroid Build Coastguard Worker
151*a6021da3SAndroid Build Coastguard Worker float min_float = 1e-45f;
152*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(min_float, SHORTEST_SINGLE, 0, buffer, &sign, &length, &point);
153*a6021da3SAndroid Build Coastguard Worker CHECK_EQ("1", buffer.start());
154*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(-44, point);
155*a6021da3SAndroid Build Coastguard Worker
156*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(min_double, FIXED, 5, buffer, &sign, &length, &point);
157*a6021da3SAndroid Build Coastguard Worker CHECK_GE(5, length - point);
158*a6021da3SAndroid Build Coastguard Worker TrimRepresentation(buffer);
159*a6021da3SAndroid Build Coastguard Worker CHECK_EQ("", buffer.start());
160*a6021da3SAndroid Build Coastguard Worker CHECK_GE(-5, point);
161*a6021da3SAndroid Build Coastguard Worker
162*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(min_double, PRECISION, 5, buffer, &sign, &length, &point);
163*a6021da3SAndroid Build Coastguard Worker CHECK_GE(5, length);
164*a6021da3SAndroid Build Coastguard Worker TrimRepresentation(buffer);
165*a6021da3SAndroid Build Coastguard Worker CHECK_EQ("49407", buffer.start());
166*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(-323, point);
167*a6021da3SAndroid Build Coastguard Worker
168*a6021da3SAndroid Build Coastguard Worker double max_double = 1.7976931348623157e308;
169*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(max_double, SHORTEST, 0, buffer, &sign, &length, &point);
170*a6021da3SAndroid Build Coastguard Worker CHECK_EQ("17976931348623157", buffer.start());
171*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(309, point);
172*a6021da3SAndroid Build Coastguard Worker
173*a6021da3SAndroid Build Coastguard Worker float max_float = 3.4028234e38f;
174*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(max_float, SHORTEST_SINGLE, 0,
175*a6021da3SAndroid Build Coastguard Worker buffer, &sign, &length, &point);
176*a6021da3SAndroid Build Coastguard Worker CHECK_EQ("34028235", buffer.start());
177*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(39, point);
178*a6021da3SAndroid Build Coastguard Worker
179*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(max_double, PRECISION, 7, buffer, &sign, &length, &point);
180*a6021da3SAndroid Build Coastguard Worker CHECK_GE(7, length);
181*a6021da3SAndroid Build Coastguard Worker TrimRepresentation(buffer);
182*a6021da3SAndroid Build Coastguard Worker CHECK_EQ("1797693", buffer.start());
183*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(309, point);
184*a6021da3SAndroid Build Coastguard Worker
185*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(4294967272.0, SHORTEST, 0, buffer, &sign, &length, &point);
186*a6021da3SAndroid Build Coastguard Worker CHECK_EQ("4294967272", buffer.start());
187*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(10, point);
188*a6021da3SAndroid Build Coastguard Worker
189*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(4294967272.0f, SHORTEST_SINGLE, 0, buffer, &sign, &length, &point);
190*a6021da3SAndroid Build Coastguard Worker CHECK_EQ("42949673", buffer.start());
191*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(10, point);
192*a6021da3SAndroid Build Coastguard Worker
193*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(4294967272.0, FIXED, 5, buffer, &sign, &length, &point);
194*a6021da3SAndroid Build Coastguard Worker CHECK_GE(5, length - point);
195*a6021da3SAndroid Build Coastguard Worker TrimRepresentation(buffer);
196*a6021da3SAndroid Build Coastguard Worker CHECK_EQ("4294967272", buffer.start());
197*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(10, point);
198*a6021da3SAndroid Build Coastguard Worker
199*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(4294967272.0, PRECISION, 14,
200*a6021da3SAndroid Build Coastguard Worker buffer, &sign, &length, &point);
201*a6021da3SAndroid Build Coastguard Worker CHECK_GE(14, length);
202*a6021da3SAndroid Build Coastguard Worker TrimRepresentation(buffer);
203*a6021da3SAndroid Build Coastguard Worker CHECK_EQ("4294967272", buffer.start());
204*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(10, point);
205*a6021da3SAndroid Build Coastguard Worker
206*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(4.1855804968213567e298, SHORTEST, 0,
207*a6021da3SAndroid Build Coastguard Worker buffer, &sign, &length, &point);
208*a6021da3SAndroid Build Coastguard Worker CHECK_EQ("4185580496821357", buffer.start());
209*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(299, point);
210*a6021da3SAndroid Build Coastguard Worker
211*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(4.1855804968213567e298, PRECISION, 20,
212*a6021da3SAndroid Build Coastguard Worker buffer, &sign, &length, &point);
213*a6021da3SAndroid Build Coastguard Worker CHECK_GE(20, length);
214*a6021da3SAndroid Build Coastguard Worker TrimRepresentation(buffer);
215*a6021da3SAndroid Build Coastguard Worker CHECK_EQ("41855804968213567225", buffer.start());
216*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(299, point);
217*a6021da3SAndroid Build Coastguard Worker
218*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(5.5626846462680035e-309, SHORTEST, 0,
219*a6021da3SAndroid Build Coastguard Worker buffer, &sign, &length, &point);
220*a6021da3SAndroid Build Coastguard Worker CHECK_EQ("5562684646268003", buffer.start());
221*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(-308, point);
222*a6021da3SAndroid Build Coastguard Worker
223*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(5.5626846462680035e-309, PRECISION, 1,
224*a6021da3SAndroid Build Coastguard Worker buffer, &sign, &length, &point);
225*a6021da3SAndroid Build Coastguard Worker CHECK_GE(1, length);
226*a6021da3SAndroid Build Coastguard Worker TrimRepresentation(buffer);
227*a6021da3SAndroid Build Coastguard Worker CHECK_EQ("6", buffer.start());
228*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(-308, point);
229*a6021da3SAndroid Build Coastguard Worker
230*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(-2147483648.0, SHORTEST, 0,
231*a6021da3SAndroid Build Coastguard Worker buffer, &sign, &length, &point);
232*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(true, sign);
233*a6021da3SAndroid Build Coastguard Worker CHECK_EQ("2147483648", buffer.start());
234*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(10, point);
235*a6021da3SAndroid Build Coastguard Worker
236*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(-2147483648.0, SHORTEST_SINGLE, 0,
237*a6021da3SAndroid Build Coastguard Worker buffer, &sign, &length, &point);
238*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(true, sign);
239*a6021da3SAndroid Build Coastguard Worker CHECK_EQ("21474836", buffer.start());
240*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(10, point);
241*a6021da3SAndroid Build Coastguard Worker
242*a6021da3SAndroid Build Coastguard Worker
243*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(-2147483648.0, FIXED, 2, buffer, &sign, &length, &point);
244*a6021da3SAndroid Build Coastguard Worker CHECK_GE(2, length - point);
245*a6021da3SAndroid Build Coastguard Worker TrimRepresentation(buffer);
246*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(true, sign);
247*a6021da3SAndroid Build Coastguard Worker CHECK_EQ("2147483648", buffer.start());
248*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(10, point);
249*a6021da3SAndroid Build Coastguard Worker
250*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(-2147483648.0, PRECISION, 5,
251*a6021da3SAndroid Build Coastguard Worker buffer, &sign, &length, &point);
252*a6021da3SAndroid Build Coastguard Worker CHECK_GE(5, length);
253*a6021da3SAndroid Build Coastguard Worker TrimRepresentation(buffer);
254*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(true, sign);
255*a6021da3SAndroid Build Coastguard Worker CHECK_EQ("21475", buffer.start());
256*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(10, point);
257*a6021da3SAndroid Build Coastguard Worker
258*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(-3.5844466002796428e+298, SHORTEST, 0,
259*a6021da3SAndroid Build Coastguard Worker buffer, &sign, &length, &point);
260*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(true, sign);
261*a6021da3SAndroid Build Coastguard Worker CHECK_EQ("35844466002796428", buffer.start());
262*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(299, point);
263*a6021da3SAndroid Build Coastguard Worker
264*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(-3.5844466002796428e+298, PRECISION, 10,
265*a6021da3SAndroid Build Coastguard Worker buffer, &sign, &length, &point);
266*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(true, sign);
267*a6021da3SAndroid Build Coastguard Worker CHECK_GE(10, length);
268*a6021da3SAndroid Build Coastguard Worker TrimRepresentation(buffer);
269*a6021da3SAndroid Build Coastguard Worker CHECK_EQ("35844466", buffer.start());
270*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(299, point);
271*a6021da3SAndroid Build Coastguard Worker
272*a6021da3SAndroid Build Coastguard Worker uint64_t smallest_normal64 = DOUBLE_CONVERSION_UINT64_2PART_C(0x00100000, 00000000);
273*a6021da3SAndroid Build Coastguard Worker double v = Double(smallest_normal64).value();
274*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(v, SHORTEST, 0, buffer, &sign, &length, &point);
275*a6021da3SAndroid Build Coastguard Worker CHECK_EQ("22250738585072014", buffer.start());
276*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(-307, point);
277*a6021da3SAndroid Build Coastguard Worker
278*a6021da3SAndroid Build Coastguard Worker uint32_t smallest_normal32 = 0x00800000;
279*a6021da3SAndroid Build Coastguard Worker float f = Single(smallest_normal32).value();
280*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(f, SHORTEST_SINGLE, 0, buffer, &sign, &length, &point);
281*a6021da3SAndroid Build Coastguard Worker CHECK_EQ("11754944", buffer.start());
282*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(-37, point);
283*a6021da3SAndroid Build Coastguard Worker
284*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(v, PRECISION, 20, buffer, &sign, &length, &point);
285*a6021da3SAndroid Build Coastguard Worker CHECK_GE(20, length);
286*a6021da3SAndroid Build Coastguard Worker TrimRepresentation(buffer);
287*a6021da3SAndroid Build Coastguard Worker CHECK_EQ("22250738585072013831", buffer.start());
288*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(-307, point);
289*a6021da3SAndroid Build Coastguard Worker
290*a6021da3SAndroid Build Coastguard Worker uint64_t largest_denormal64 = DOUBLE_CONVERSION_UINT64_2PART_C(0x000FFFFF, FFFFFFFF);
291*a6021da3SAndroid Build Coastguard Worker v = Double(largest_denormal64).value();
292*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(v, SHORTEST, 0, buffer, &sign, &length, &point);
293*a6021da3SAndroid Build Coastguard Worker CHECK_EQ("2225073858507201", buffer.start());
294*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(-307, point);
295*a6021da3SAndroid Build Coastguard Worker
296*a6021da3SAndroid Build Coastguard Worker uint32_t largest_denormal32 = 0x007FFFFF;
297*a6021da3SAndroid Build Coastguard Worker f = Single(largest_denormal32).value();
298*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(f, SHORTEST_SINGLE, 0, buffer, &sign, &length, &point);
299*a6021da3SAndroid Build Coastguard Worker CHECK_EQ("11754942", buffer.start());
300*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(-37, point);
301*a6021da3SAndroid Build Coastguard Worker
302*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(v, PRECISION, 20, buffer, &sign, &length, &point);
303*a6021da3SAndroid Build Coastguard Worker CHECK_GE(20, length);
304*a6021da3SAndroid Build Coastguard Worker TrimRepresentation(buffer);
305*a6021da3SAndroid Build Coastguard Worker CHECK_EQ("2225073858507200889", buffer.start());
306*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(-307, point);
307*a6021da3SAndroid Build Coastguard Worker
308*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(4128420500802942e-24, SHORTEST, 0,
309*a6021da3SAndroid Build Coastguard Worker buffer, &sign, &length, &point);
310*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(false, sign);
311*a6021da3SAndroid Build Coastguard Worker CHECK_EQ("4128420500802942", buffer.start());
312*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(-8, point);
313*a6021da3SAndroid Build Coastguard Worker
314*a6021da3SAndroid Build Coastguard Worker v = -3.9292015898194142585311918e-10;
315*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(v, SHORTEST, 0, buffer, &sign, &length, &point);
316*a6021da3SAndroid Build Coastguard Worker CHECK_EQ("39292015898194143", buffer.start());
317*a6021da3SAndroid Build Coastguard Worker
318*a6021da3SAndroid Build Coastguard Worker f = -3.9292015898194142585311918e-10f;
319*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(f, SHORTEST_SINGLE, 0, buffer, &sign, &length, &point);
320*a6021da3SAndroid Build Coastguard Worker CHECK_EQ("39292017", buffer.start());
321*a6021da3SAndroid Build Coastguard Worker
322*a6021da3SAndroid Build Coastguard Worker v = 4194304.0;
323*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(v, FIXED, 5, buffer, &sign, &length, &point);
324*a6021da3SAndroid Build Coastguard Worker CHECK_GE(5, length - point);
325*a6021da3SAndroid Build Coastguard Worker TrimRepresentation(buffer);
326*a6021da3SAndroid Build Coastguard Worker CHECK_EQ("4194304", buffer.start());
327*a6021da3SAndroid Build Coastguard Worker
328*a6021da3SAndroid Build Coastguard Worker v = 3.3161339052167390562200598e-237;
329*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(v, PRECISION, 19, buffer, &sign, &length, &point);
330*a6021da3SAndroid Build Coastguard Worker CHECK_GE(19, length);
331*a6021da3SAndroid Build Coastguard Worker TrimRepresentation(buffer);
332*a6021da3SAndroid Build Coastguard Worker CHECK_EQ("3316133905216739056", buffer.start());
333*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(-236, point);
334*a6021da3SAndroid Build Coastguard Worker }
335*a6021da3SAndroid Build Coastguard Worker
336*a6021da3SAndroid Build Coastguard Worker
TEST(DtoaSign)337*a6021da3SAndroid Build Coastguard Worker TEST(DtoaSign) {
338*a6021da3SAndroid Build Coastguard Worker char buffer_container[kBufferSize];
339*a6021da3SAndroid Build Coastguard Worker Vector<char> buffer(buffer_container, kBufferSize);
340*a6021da3SAndroid Build Coastguard Worker bool sign;
341*a6021da3SAndroid Build Coastguard Worker int length;
342*a6021da3SAndroid Build Coastguard Worker int point;
343*a6021da3SAndroid Build Coastguard Worker
344*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(0.0, SHORTEST, 0, buffer, &sign, &length, &point);
345*a6021da3SAndroid Build Coastguard Worker CHECK(!sign);
346*a6021da3SAndroid Build Coastguard Worker
347*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(-0.0, SHORTEST, 0, buffer, &sign, &length, &point);
348*a6021da3SAndroid Build Coastguard Worker CHECK(sign);
349*a6021da3SAndroid Build Coastguard Worker
350*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(1.0, SHORTEST, 0, buffer, &sign, &length, &point);
351*a6021da3SAndroid Build Coastguard Worker CHECK(!sign);
352*a6021da3SAndroid Build Coastguard Worker
353*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(-1.0, SHORTEST, 0, buffer, &sign, &length, &point);
354*a6021da3SAndroid Build Coastguard Worker CHECK(sign);
355*a6021da3SAndroid Build Coastguard Worker
356*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(0.0f, SHORTEST_SINGLE, 0, buffer, &sign, &length, &point);
357*a6021da3SAndroid Build Coastguard Worker CHECK(!sign);
358*a6021da3SAndroid Build Coastguard Worker
359*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(-0.0f, SHORTEST_SINGLE, 0, buffer, &sign, &length, &point);
360*a6021da3SAndroid Build Coastguard Worker CHECK(sign);
361*a6021da3SAndroid Build Coastguard Worker
362*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(1.0f, SHORTEST_SINGLE, 0, buffer, &sign, &length, &point);
363*a6021da3SAndroid Build Coastguard Worker CHECK(!sign);
364*a6021da3SAndroid Build Coastguard Worker
365*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(-1.0f, SHORTEST_SINGLE, 0, buffer, &sign, &length, &point);
366*a6021da3SAndroid Build Coastguard Worker CHECK(sign);
367*a6021da3SAndroid Build Coastguard Worker
368*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(0.0, PRECISION, 1, buffer, &sign, &length, &point);
369*a6021da3SAndroid Build Coastguard Worker CHECK(!sign);
370*a6021da3SAndroid Build Coastguard Worker
371*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(-0.0, PRECISION, 1, buffer, &sign, &length, &point);
372*a6021da3SAndroid Build Coastguard Worker CHECK(sign);
373*a6021da3SAndroid Build Coastguard Worker
374*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(1.0, PRECISION, 1, buffer, &sign, &length, &point);
375*a6021da3SAndroid Build Coastguard Worker CHECK(!sign);
376*a6021da3SAndroid Build Coastguard Worker
377*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(-1.0, PRECISION, 1, buffer, &sign, &length, &point);
378*a6021da3SAndroid Build Coastguard Worker CHECK(sign);
379*a6021da3SAndroid Build Coastguard Worker
380*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(0.0, FIXED, 1, buffer, &sign, &length, &point);
381*a6021da3SAndroid Build Coastguard Worker CHECK(!sign);
382*a6021da3SAndroid Build Coastguard Worker
383*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(-0.0, FIXED, 1, buffer, &sign, &length, &point);
384*a6021da3SAndroid Build Coastguard Worker CHECK(sign);
385*a6021da3SAndroid Build Coastguard Worker
386*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(1.0, FIXED, 1, buffer, &sign, &length, &point);
387*a6021da3SAndroid Build Coastguard Worker CHECK(!sign);
388*a6021da3SAndroid Build Coastguard Worker
389*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(-1.0, FIXED, 1, buffer, &sign, &length, &point);
390*a6021da3SAndroid Build Coastguard Worker CHECK(sign);
391*a6021da3SAndroid Build Coastguard Worker }
392*a6021da3SAndroid Build Coastguard Worker
393*a6021da3SAndroid Build Coastguard Worker
TEST(DtoaCorners)394*a6021da3SAndroid Build Coastguard Worker TEST(DtoaCorners) {
395*a6021da3SAndroid Build Coastguard Worker char buffer_container[kBufferSize];
396*a6021da3SAndroid Build Coastguard Worker Vector<char> buffer(buffer_container, kBufferSize);
397*a6021da3SAndroid Build Coastguard Worker bool sign;
398*a6021da3SAndroid Build Coastguard Worker int length;
399*a6021da3SAndroid Build Coastguard Worker int point;
400*a6021da3SAndroid Build Coastguard Worker
401*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(0.0, PRECISION, 0, buffer, &sign, &length, &point);
402*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(0, length);
403*a6021da3SAndroid Build Coastguard Worker CHECK_EQ("", buffer.start());
404*a6021da3SAndroid Build Coastguard Worker CHECK(!sign);
405*a6021da3SAndroid Build Coastguard Worker
406*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(1.0, PRECISION, 0, buffer, &sign, &length, &point);
407*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(0, length);
408*a6021da3SAndroid Build Coastguard Worker CHECK_EQ("", buffer.start());
409*a6021da3SAndroid Build Coastguard Worker CHECK(!sign);
410*a6021da3SAndroid Build Coastguard Worker
411*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(0.0, FIXED, 0, buffer, &sign, &length, &point);
412*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1, length);
413*a6021da3SAndroid Build Coastguard Worker CHECK_EQ("0", buffer.start());
414*a6021da3SAndroid Build Coastguard Worker CHECK(!sign);
415*a6021da3SAndroid Build Coastguard Worker
416*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(1.0, FIXED, 0, buffer, &sign, &length, &point);
417*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(1, length);
418*a6021da3SAndroid Build Coastguard Worker CHECK_EQ("1", buffer.start());
419*a6021da3SAndroid Build Coastguard Worker CHECK(!sign);
420*a6021da3SAndroid Build Coastguard Worker }
421*a6021da3SAndroid Build Coastguard Worker
422*a6021da3SAndroid Build Coastguard Worker
TEST(DtoaGayShortest)423*a6021da3SAndroid Build Coastguard Worker TEST(DtoaGayShortest) {
424*a6021da3SAndroid Build Coastguard Worker char buffer_container[kBufferSize];
425*a6021da3SAndroid Build Coastguard Worker Vector<char> buffer(buffer_container, kBufferSize);
426*a6021da3SAndroid Build Coastguard Worker bool sign;
427*a6021da3SAndroid Build Coastguard Worker int length;
428*a6021da3SAndroid Build Coastguard Worker int point;
429*a6021da3SAndroid Build Coastguard Worker
430*a6021da3SAndroid Build Coastguard Worker Vector<const PrecomputedShortest> precomputed =
431*a6021da3SAndroid Build Coastguard Worker PrecomputedShortestRepresentations();
432*a6021da3SAndroid Build Coastguard Worker for (int i = 0; i < precomputed.length(); ++i) {
433*a6021da3SAndroid Build Coastguard Worker const PrecomputedShortest current_test = precomputed[i];
434*a6021da3SAndroid Build Coastguard Worker double v = current_test.v;
435*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(v, SHORTEST, 0, buffer, &sign, &length, &point);
436*a6021da3SAndroid Build Coastguard Worker CHECK(!sign); // All precomputed numbers are positive.
437*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(current_test.decimal_point, point);
438*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(current_test.representation, buffer.start());
439*a6021da3SAndroid Build Coastguard Worker }
440*a6021da3SAndroid Build Coastguard Worker }
441*a6021da3SAndroid Build Coastguard Worker
442*a6021da3SAndroid Build Coastguard Worker
TEST(DtoaGayShortestSingle)443*a6021da3SAndroid Build Coastguard Worker TEST(DtoaGayShortestSingle) {
444*a6021da3SAndroid Build Coastguard Worker char buffer_container[kBufferSize];
445*a6021da3SAndroid Build Coastguard Worker Vector<char> buffer(buffer_container, kBufferSize);
446*a6021da3SAndroid Build Coastguard Worker bool sign;
447*a6021da3SAndroid Build Coastguard Worker int length;
448*a6021da3SAndroid Build Coastguard Worker int point;
449*a6021da3SAndroid Build Coastguard Worker
450*a6021da3SAndroid Build Coastguard Worker Vector<const PrecomputedShortestSingle> precomputed =
451*a6021da3SAndroid Build Coastguard Worker PrecomputedShortestSingleRepresentations();
452*a6021da3SAndroid Build Coastguard Worker for (int i = 0; i < precomputed.length(); ++i) {
453*a6021da3SAndroid Build Coastguard Worker const PrecomputedShortestSingle current_test = precomputed[i];
454*a6021da3SAndroid Build Coastguard Worker float v = current_test.v;
455*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(v, SHORTEST_SINGLE, 0, buffer, &sign, &length, &point);
456*a6021da3SAndroid Build Coastguard Worker CHECK(!sign); // All precomputed numbers are positive.
457*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(current_test.decimal_point, point);
458*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(current_test.representation, buffer.start());
459*a6021da3SAndroid Build Coastguard Worker }
460*a6021da3SAndroid Build Coastguard Worker }
461*a6021da3SAndroid Build Coastguard Worker
462*a6021da3SAndroid Build Coastguard Worker
TEST(DtoaGayFixed)463*a6021da3SAndroid Build Coastguard Worker TEST(DtoaGayFixed) {
464*a6021da3SAndroid Build Coastguard Worker char buffer_container[kBufferSize];
465*a6021da3SAndroid Build Coastguard Worker Vector<char> buffer(buffer_container, kBufferSize);
466*a6021da3SAndroid Build Coastguard Worker bool sign;
467*a6021da3SAndroid Build Coastguard Worker int length;
468*a6021da3SAndroid Build Coastguard Worker int point;
469*a6021da3SAndroid Build Coastguard Worker
470*a6021da3SAndroid Build Coastguard Worker Vector<const PrecomputedFixed> precomputed =
471*a6021da3SAndroid Build Coastguard Worker PrecomputedFixedRepresentations();
472*a6021da3SAndroid Build Coastguard Worker for (int i = 0; i < precomputed.length(); ++i) {
473*a6021da3SAndroid Build Coastguard Worker const PrecomputedFixed current_test = precomputed[i];
474*a6021da3SAndroid Build Coastguard Worker double v = current_test.v;
475*a6021da3SAndroid Build Coastguard Worker int number_digits = current_test.number_digits;
476*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(v, FIXED, number_digits, buffer, &sign, &length, &point);
477*a6021da3SAndroid Build Coastguard Worker CHECK(!sign); // All precomputed numbers are positive.
478*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(current_test.decimal_point, point);
479*a6021da3SAndroid Build Coastguard Worker CHECK_GE(number_digits, length - point);
480*a6021da3SAndroid Build Coastguard Worker TrimRepresentation(buffer);
481*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(current_test.representation, buffer.start());
482*a6021da3SAndroid Build Coastguard Worker }
483*a6021da3SAndroid Build Coastguard Worker }
484*a6021da3SAndroid Build Coastguard Worker
485*a6021da3SAndroid Build Coastguard Worker
TEST(DtoaGayPrecision)486*a6021da3SAndroid Build Coastguard Worker TEST(DtoaGayPrecision) {
487*a6021da3SAndroid Build Coastguard Worker char buffer_container[kBufferSize];
488*a6021da3SAndroid Build Coastguard Worker Vector<char> buffer(buffer_container, kBufferSize);
489*a6021da3SAndroid Build Coastguard Worker bool sign;
490*a6021da3SAndroid Build Coastguard Worker int length;
491*a6021da3SAndroid Build Coastguard Worker int point;
492*a6021da3SAndroid Build Coastguard Worker
493*a6021da3SAndroid Build Coastguard Worker Vector<const PrecomputedPrecision> precomputed =
494*a6021da3SAndroid Build Coastguard Worker PrecomputedPrecisionRepresentations();
495*a6021da3SAndroid Build Coastguard Worker for (int i = 0; i < precomputed.length(); ++i) {
496*a6021da3SAndroid Build Coastguard Worker const PrecomputedPrecision current_test = precomputed[i];
497*a6021da3SAndroid Build Coastguard Worker double v = current_test.v;
498*a6021da3SAndroid Build Coastguard Worker int number_digits = current_test.number_digits;
499*a6021da3SAndroid Build Coastguard Worker DoubleToAscii(v, PRECISION, number_digits,
500*a6021da3SAndroid Build Coastguard Worker buffer, &sign, &length, &point);
501*a6021da3SAndroid Build Coastguard Worker CHECK(!sign); // All precomputed numbers are positive.
502*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(current_test.decimal_point, point);
503*a6021da3SAndroid Build Coastguard Worker CHECK_GE(number_digits, length);
504*a6021da3SAndroid Build Coastguard Worker TrimRepresentation(buffer);
505*a6021da3SAndroid Build Coastguard Worker CHECK_EQ(current_test.representation, buffer.start());
506*a6021da3SAndroid Build Coastguard Worker }
507*a6021da3SAndroid Build Coastguard Worker }
508