FixedDtoaTest.java revision 1511:a1f59730bfb5
1/*
2 * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.  Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26// This file is available under and governed by the GNU General Public
27// License version 2 only, as published by the Free Software Foundation.
28// However, the following notice accompanied the original version of this
29// file:
30//
31// Copyright 2010 the V8 project authors. All rights reserved.
32// Redistribution and use in source and binary forms, with or without
33// modification, are permitted provided that the following conditions are
34// met:
35//
36//     * Redistributions of source code must retain the above copyright
37//       notice, this list of conditions and the following disclaimer.
38//     * Redistributions in binary form must reproduce the above
39//       copyright notice, this list of conditions and the following
40//       disclaimer in the documentation and/or other materials provided
41//       with the distribution.
42//     * Neither the name of Google Inc. nor the names of its
43//       contributors may be used to endorse or promote products derived
44//       from this software without specific prior written permission.
45//
46// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
47// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
48// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
49// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
50// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
51// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
52// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
53// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
54// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
55// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
56// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
57
58package jdk.nashorn.internal.runtime.doubleconv.test;
59
60import java.io.BufferedReader;
61import java.io.InputStreamReader;
62import java.util.concurrent.atomic.AtomicInteger;
63import jdk.nashorn.internal.runtime.doubleconv.DoubleConversion;
64import jdk.nashorn.internal.runtime.doubleconv.DtoaBuffer;
65
66import org.testng.annotations.Test;
67
68import static org.testng.Assert.assertEquals;
69import static org.testng.Assert.assertTrue;
70
71/**
72 * FixedDtoa tests
73 */
74@SuppressWarnings("javadoc")
75public class FixedDtoaTest {
76
77    static final int kBufferSize = 500;
78
79    @Test
80    public void testFastShortestVarious() {
81        final DtoaBuffer buffer = new DtoaBuffer(kBufferSize);
82
83        assertTrue(DoubleConversion.fixedDtoa(1.0, 1, buffer));
84        assertEquals("1", buffer.getRawDigits());
85        assertEquals(1, buffer.getDecimalPoint());
86        buffer.reset();
87
88        assertTrue(DoubleConversion.fixedDtoa(1.0, 15, buffer));
89        assertEquals("1", buffer.getRawDigits());
90        assertEquals(1, buffer.getDecimalPoint());
91        buffer.reset();
92
93        assertTrue(DoubleConversion.fixedDtoa(1.0, 0, buffer));
94        assertEquals("1", buffer.getRawDigits());
95        assertEquals(1, buffer.getDecimalPoint());
96        buffer.reset();
97
98        assertTrue(DoubleConversion.fixedDtoa(0xFFFFFFFFL, 5, buffer));
99        assertEquals("4294967295", buffer.getRawDigits());
100        assertEquals(10, buffer.getDecimalPoint());
101        buffer.reset();
102
103        assertTrue(DoubleConversion.fixedDtoa(4294967296.0, 5, buffer));
104        assertEquals("4294967296", buffer.getRawDigits());
105        assertEquals(10, buffer.getDecimalPoint());
106        buffer.reset();
107
108        assertTrue(DoubleConversion.fixedDtoa(1e21, 5, buffer));
109        assertEquals("1", buffer.getRawDigits());
110        assertEquals(22, buffer.getDecimalPoint());
111        buffer.reset();
112
113        assertTrue(DoubleConversion.fixedDtoa(999999999999999868928.00, 2, buffer));
114        assertEquals("999999999999999868928", buffer.getRawDigits());
115        assertEquals(21, buffer.getDecimalPoint());
116        buffer.reset();
117
118        assertTrue(DoubleConversion.fixedDtoa(6.9999999999999989514240000e+21, 5, buffer));
119        assertEquals("6999999999999998951424", buffer.getRawDigits());
120        assertEquals(22, buffer.getDecimalPoint());
121        buffer.reset();
122
123        assertTrue(DoubleConversion.fixedDtoa(1.5, 5, buffer));
124        assertEquals("15", buffer.getRawDigits());
125        assertEquals(1, buffer.getDecimalPoint());
126        buffer.reset();
127
128        assertTrue(DoubleConversion.fixedDtoa(1.55, 5, buffer));
129        assertEquals("155", buffer.getRawDigits());
130        assertEquals(1, buffer.getDecimalPoint());
131        buffer.reset();
132
133        assertTrue(DoubleConversion.fixedDtoa(1.55, 1, buffer));
134        assertEquals("16", buffer.getRawDigits());
135        assertEquals(1, buffer.getDecimalPoint());
136        buffer.reset();
137
138        assertTrue(DoubleConversion.fixedDtoa(1.00000001, 15, buffer));
139        assertEquals("100000001", buffer.getRawDigits());
140        assertEquals(1, buffer.getDecimalPoint());
141        buffer.reset();
142
143        assertTrue(DoubleConversion.fixedDtoa(0.1, 10, buffer));
144        assertEquals("1", buffer.getRawDigits());
145        assertEquals(0, buffer.getDecimalPoint());
146        buffer.reset();
147
148        assertTrue(DoubleConversion.fixedDtoa(0.01, 10, buffer));
149        assertEquals("1", buffer.getRawDigits());
150        assertEquals(-1, buffer.getDecimalPoint());
151        buffer.reset();
152
153        assertTrue(DoubleConversion.fixedDtoa(0.001, 10, buffer));
154        assertEquals("1", buffer.getRawDigits());
155        assertEquals(-2, buffer.getDecimalPoint());
156        buffer.reset();
157
158        assertTrue(DoubleConversion.fixedDtoa(0.0001, 10, buffer));
159        assertEquals("1", buffer.getRawDigits());
160        assertEquals(-3, buffer.getDecimalPoint());
161        buffer.reset();
162
163        assertTrue(DoubleConversion.fixedDtoa(0.00001, 10, buffer));
164        assertEquals("1", buffer.getRawDigits());
165        assertEquals(-4, buffer.getDecimalPoint());
166        buffer.reset();
167
168        assertTrue(DoubleConversion.fixedDtoa(0.000001, 10, buffer));
169        assertEquals("1", buffer.getRawDigits());
170        assertEquals(-5, buffer.getDecimalPoint());
171        buffer.reset();
172
173        assertTrue(DoubleConversion.fixedDtoa(0.0000001, 10, buffer));
174        assertEquals("1", buffer.getRawDigits());
175        assertEquals(-6, buffer.getDecimalPoint());
176        buffer.reset();
177
178        assertTrue(DoubleConversion.fixedDtoa(0.00000001, 10, buffer));
179        assertEquals("1", buffer.getRawDigits());
180        assertEquals(-7, buffer.getDecimalPoint());
181        buffer.reset();
182
183        assertTrue(DoubleConversion.fixedDtoa(0.000000001, 10, buffer));
184        assertEquals("1", buffer.getRawDigits());
185        assertEquals(-8, buffer.getDecimalPoint());
186        buffer.reset();
187
188        assertTrue(DoubleConversion.fixedDtoa(0.0000000001, 15, buffer));
189        assertEquals("1", buffer.getRawDigits());
190        assertEquals(-9, buffer.getDecimalPoint());
191        buffer.reset();
192
193        assertTrue(DoubleConversion.fixedDtoa(0.00000000001, 15, buffer));
194        assertEquals("1", buffer.getRawDigits());
195        assertEquals(-10, buffer.getDecimalPoint());
196        buffer.reset();
197
198        assertTrue(DoubleConversion.fixedDtoa(0.000000000001, 15, buffer));
199        assertEquals("1", buffer.getRawDigits());
200        assertEquals(-11, buffer.getDecimalPoint());
201        buffer.reset();
202
203        assertTrue(DoubleConversion.fixedDtoa(0.0000000000001, 15, buffer));
204        assertEquals("1", buffer.getRawDigits());
205        assertEquals(-12, buffer.getDecimalPoint());
206        buffer.reset();
207
208        assertTrue(DoubleConversion.fixedDtoa(0.00000000000001, 15, buffer));
209        assertEquals("1", buffer.getRawDigits());
210        assertEquals(-13, buffer.getDecimalPoint());
211        buffer.reset();
212
213        assertTrue(DoubleConversion.fixedDtoa(0.000000000000001, 20, buffer));
214        assertEquals("1", buffer.getRawDigits());
215        assertEquals(-14, buffer.getDecimalPoint());
216        buffer.reset();
217
218        assertTrue(DoubleConversion.fixedDtoa(0.0000000000000001, 20, buffer));
219        assertEquals("1", buffer.getRawDigits());
220        assertEquals(-15, buffer.getDecimalPoint());
221        buffer.reset();
222
223        assertTrue(DoubleConversion.fixedDtoa(0.00000000000000001, 20, buffer));
224        assertEquals("1", buffer.getRawDigits());
225        assertEquals(-16, buffer.getDecimalPoint());
226        buffer.reset();
227
228        assertTrue(DoubleConversion.fixedDtoa(0.000000000000000001, 20, buffer));
229        assertEquals("1", buffer.getRawDigits());
230        assertEquals(-17, buffer.getDecimalPoint());
231        buffer.reset();
232
233        assertTrue(DoubleConversion.fixedDtoa(0.0000000000000000001, 20, buffer));
234        assertEquals("1", buffer.getRawDigits());
235        assertEquals(-18, buffer.getDecimalPoint());
236        buffer.reset();
237
238        assertTrue(DoubleConversion.fixedDtoa(0.00000000000000000001, 20, buffer));
239        assertEquals("1", buffer.getRawDigits());
240        assertEquals(-19, buffer.getDecimalPoint());
241        buffer.reset();
242
243        assertTrue(DoubleConversion.fixedDtoa(0.10000000004, 10, buffer));
244        assertEquals("1", buffer.getRawDigits());
245        assertEquals(0, buffer.getDecimalPoint());
246        buffer.reset();
247
248        assertTrue(DoubleConversion.fixedDtoa(0.01000000004, 10, buffer));
249        assertEquals("1", buffer.getRawDigits());
250        assertEquals(-1, buffer.getDecimalPoint());
251        buffer.reset();
252
253        assertTrue(DoubleConversion.fixedDtoa(0.00100000004, 10, buffer));
254        assertEquals("1", buffer.getRawDigits());
255        assertEquals(-2, buffer.getDecimalPoint());
256        buffer.reset();
257
258        assertTrue(DoubleConversion.fixedDtoa(0.00010000004, 10, buffer));
259        assertEquals("1", buffer.getRawDigits());
260        assertEquals(-3, buffer.getDecimalPoint());
261        buffer.reset();
262
263        assertTrue(DoubleConversion.fixedDtoa(0.00001000004, 10, buffer));
264        assertEquals("1", buffer.getRawDigits());
265        assertEquals(-4, buffer.getDecimalPoint());
266        buffer.reset();
267
268        assertTrue(DoubleConversion.fixedDtoa(0.00000100004, 10, buffer));
269        assertEquals("1", buffer.getRawDigits());
270        assertEquals(-5, buffer.getDecimalPoint());
271        buffer.reset();
272
273        assertTrue(DoubleConversion.fixedDtoa(0.00000010004, 10, buffer));
274        assertEquals("1", buffer.getRawDigits());
275        assertEquals(-6, buffer.getDecimalPoint());
276        buffer.reset();
277
278        assertTrue(DoubleConversion.fixedDtoa(0.00000001004, 10, buffer));
279        assertEquals("1", buffer.getRawDigits());
280        assertEquals(-7, buffer.getDecimalPoint());
281        buffer.reset();
282
283        assertTrue(DoubleConversion.fixedDtoa(0.00000000104, 10, buffer));
284        assertEquals("1", buffer.getRawDigits());
285        assertEquals(-8, buffer.getDecimalPoint());
286        buffer.reset();
287
288        assertTrue(DoubleConversion.fixedDtoa(0.0000000001000004, 15, buffer));
289        assertEquals("1", buffer.getRawDigits());
290        assertEquals(-9, buffer.getDecimalPoint());
291        buffer.reset();
292
293        assertTrue(DoubleConversion.fixedDtoa(0.0000000000100004, 15, buffer));
294        assertEquals("1", buffer.getRawDigits());
295        assertEquals(-10, buffer.getDecimalPoint());
296        buffer.reset();
297
298        assertTrue(DoubleConversion.fixedDtoa(0.0000000000010004, 15, buffer));
299        assertEquals("1", buffer.getRawDigits());
300        assertEquals(-11, buffer.getDecimalPoint());
301        buffer.reset();
302
303        assertTrue(DoubleConversion.fixedDtoa(0.0000000000001004, 15, buffer));
304        assertEquals("1", buffer.getRawDigits());
305        assertEquals(-12, buffer.getDecimalPoint());
306        buffer.reset();
307
308        assertTrue(DoubleConversion.fixedDtoa(0.0000000000000104, 15, buffer));
309        assertEquals("1", buffer.getRawDigits());
310        assertEquals(-13, buffer.getDecimalPoint());
311        buffer.reset();
312
313        assertTrue(DoubleConversion.fixedDtoa(0.000000000000001000004, 20, buffer));
314        assertEquals("1", buffer.getRawDigits());
315        assertEquals(-14, buffer.getDecimalPoint());
316        buffer.reset();
317
318        assertTrue(DoubleConversion.fixedDtoa(0.000000000000000100004, 20, buffer));
319        assertEquals("1", buffer.getRawDigits());
320        assertEquals(-15, buffer.getDecimalPoint());
321        buffer.reset();
322
323        assertTrue(DoubleConversion.fixedDtoa(0.000000000000000010004, 20, buffer));
324        assertEquals("1", buffer.getRawDigits());
325        assertEquals(-16, buffer.getDecimalPoint());
326        buffer.reset();
327
328        assertTrue(DoubleConversion.fixedDtoa(0.000000000000000001004, 20, buffer));
329        assertEquals("1", buffer.getRawDigits());
330        assertEquals(-17, buffer.getDecimalPoint());
331        buffer.reset();
332
333        assertTrue(DoubleConversion.fixedDtoa(0.000000000000000000104, 20, buffer));
334        assertEquals("1", buffer.getRawDigits());
335        assertEquals(-18, buffer.getDecimalPoint());
336        buffer.reset();
337
338        assertTrue(DoubleConversion.fixedDtoa(0.000000000000000000014, 20, buffer));
339        assertEquals("1", buffer.getRawDigits());
340        assertEquals(-19, buffer.getDecimalPoint());
341        buffer.reset();
342
343        assertTrue(DoubleConversion.fixedDtoa(0.10000000006, 10, buffer));
344        assertEquals("1000000001", buffer.getRawDigits());
345        assertEquals(0, buffer.getDecimalPoint());
346        buffer.reset();
347
348        assertTrue(DoubleConversion.fixedDtoa(0.01000000006, 10, buffer));
349        assertEquals("100000001", buffer.getRawDigits());
350        assertEquals(-1, buffer.getDecimalPoint());
351        buffer.reset();
352
353        assertTrue(DoubleConversion.fixedDtoa(0.00100000006, 10, buffer));
354        assertEquals("10000001", buffer.getRawDigits());
355        assertEquals(-2, buffer.getDecimalPoint());
356        buffer.reset();
357
358        assertTrue(DoubleConversion.fixedDtoa(0.00010000006, 10, buffer));
359        assertEquals("1000001", buffer.getRawDigits());
360        assertEquals(-3, buffer.getDecimalPoint());
361        buffer.reset();
362
363        assertTrue(DoubleConversion.fixedDtoa(0.00001000006, 10, buffer));
364        assertEquals("100001", buffer.getRawDigits());
365        assertEquals(-4, buffer.getDecimalPoint());
366        buffer.reset();
367
368        assertTrue(DoubleConversion.fixedDtoa(0.00000100006, 10, buffer));
369        assertEquals("10001", buffer.getRawDigits());
370        assertEquals(-5, buffer.getDecimalPoint());
371        buffer.reset();
372
373        assertTrue(DoubleConversion.fixedDtoa(0.00000010006, 10, buffer));
374        assertEquals("1001", buffer.getRawDigits());
375        assertEquals(-6, buffer.getDecimalPoint());
376        buffer.reset();
377
378        assertTrue(DoubleConversion.fixedDtoa(0.00000001006, 10, buffer));
379        assertEquals("101", buffer.getRawDigits());
380        assertEquals(-7, buffer.getDecimalPoint());
381        buffer.reset();
382
383        assertTrue(DoubleConversion.fixedDtoa(0.00000000106, 10, buffer));
384        assertEquals("11", buffer.getRawDigits());
385        assertEquals(-8, buffer.getDecimalPoint());
386        buffer.reset();
387
388        assertTrue(DoubleConversion.fixedDtoa(0.0000000001000006, 15, buffer));
389        assertEquals("100001", buffer.getRawDigits());
390        assertEquals(-9, buffer.getDecimalPoint());
391        buffer.reset();
392
393        assertTrue(DoubleConversion.fixedDtoa(0.0000000000100006, 15, buffer));
394        assertEquals("10001", buffer.getRawDigits());
395        assertEquals(-10, buffer.getDecimalPoint());
396        buffer.reset();
397
398        assertTrue(DoubleConversion.fixedDtoa(0.0000000000010006, 15, buffer));
399        assertEquals("1001", buffer.getRawDigits());
400        assertEquals(-11, buffer.getDecimalPoint());
401        buffer.reset();
402
403        assertTrue(DoubleConversion.fixedDtoa(0.0000000000001006, 15, buffer));
404        assertEquals("101", buffer.getRawDigits());
405        assertEquals(-12, buffer.getDecimalPoint());
406        buffer.reset();
407
408        assertTrue(DoubleConversion.fixedDtoa(0.0000000000000106, 15, buffer));
409        assertEquals("11", buffer.getRawDigits());
410        assertEquals(-13, buffer.getDecimalPoint());
411        buffer.reset();
412
413        assertTrue(DoubleConversion.fixedDtoa(0.000000000000001000006, 20, buffer));
414        assertEquals("100001", buffer.getRawDigits());
415        assertEquals(-14, buffer.getDecimalPoint());
416        buffer.reset();
417
418        assertTrue(DoubleConversion.fixedDtoa(0.000000000000000100006, 20, buffer));
419        assertEquals("10001", buffer.getRawDigits());
420        assertEquals(-15, buffer.getDecimalPoint());
421        buffer.reset();
422
423        assertTrue(DoubleConversion.fixedDtoa(0.000000000000000010006, 20, buffer));
424        assertEquals("1001", buffer.getRawDigits());
425        assertEquals(-16, buffer.getDecimalPoint());
426        buffer.reset();
427
428        assertTrue(DoubleConversion.fixedDtoa(0.000000000000000001006, 20, buffer));
429        assertEquals("101", buffer.getRawDigits());
430        assertEquals(-17, buffer.getDecimalPoint());
431        buffer.reset();
432
433        assertTrue(DoubleConversion.fixedDtoa(0.000000000000000000106, 20, buffer));
434        assertEquals("11", buffer.getRawDigits());
435        assertEquals(-18, buffer.getDecimalPoint());
436        buffer.reset();
437
438        assertTrue(DoubleConversion.fixedDtoa(0.000000000000000000016, 20, buffer));
439        assertEquals("2", buffer.getRawDigits());
440        assertEquals(-19, buffer.getDecimalPoint());
441        buffer.reset();
442
443        assertTrue(DoubleConversion.fixedDtoa(0.6, 0, buffer));
444        assertEquals("1", buffer.getRawDigits());
445        assertEquals(1, buffer.getDecimalPoint());
446        buffer.reset();
447
448        assertTrue(DoubleConversion.fixedDtoa(0.96, 1, buffer));
449        assertEquals("1", buffer.getRawDigits());
450        assertEquals(1, buffer.getDecimalPoint());
451        buffer.reset();
452
453        assertTrue(DoubleConversion.fixedDtoa(0.996, 2, buffer));
454        assertEquals("1", buffer.getRawDigits());
455        assertEquals(1, buffer.getDecimalPoint());
456        buffer.reset();
457
458        assertTrue(DoubleConversion.fixedDtoa(0.9996, 3, buffer));
459        assertEquals("1", buffer.getRawDigits());
460        assertEquals(1, buffer.getDecimalPoint());
461        buffer.reset();
462
463        assertTrue(DoubleConversion.fixedDtoa(0.99996, 4, buffer));
464        assertEquals("1", buffer.getRawDigits());
465        assertEquals(1, buffer.getDecimalPoint());
466        buffer.reset();
467
468        assertTrue(DoubleConversion.fixedDtoa(0.999996, 5, buffer));
469        assertEquals("1", buffer.getRawDigits());
470        assertEquals(1, buffer.getDecimalPoint());
471        buffer.reset();
472
473        assertTrue(DoubleConversion.fixedDtoa(0.9999996, 6, buffer));
474        assertEquals("1", buffer.getRawDigits());
475        assertEquals(1, buffer.getDecimalPoint());
476        buffer.reset();
477
478        assertTrue(DoubleConversion.fixedDtoa(0.99999996, 7, buffer));
479        assertEquals("1", buffer.getRawDigits());
480        assertEquals(1, buffer.getDecimalPoint());
481        buffer.reset();
482
483        assertTrue(DoubleConversion.fixedDtoa(0.999999996, 8, buffer));
484        assertEquals("1", buffer.getRawDigits());
485        assertEquals(1, buffer.getDecimalPoint());
486        buffer.reset();
487
488        assertTrue(DoubleConversion.fixedDtoa(0.9999999996, 9, buffer));
489        assertEquals("1", buffer.getRawDigits());
490        assertEquals(1, buffer.getDecimalPoint());
491        buffer.reset();
492
493        assertTrue(DoubleConversion.fixedDtoa(0.99999999996, 10, buffer));
494        assertEquals("1", buffer.getRawDigits());
495        assertEquals(1, buffer.getDecimalPoint());
496        buffer.reset();
497
498        assertTrue(DoubleConversion.fixedDtoa(0.999999999996, 11, buffer));
499        assertEquals("1", buffer.getRawDigits());
500        assertEquals(1, buffer.getDecimalPoint());
501        buffer.reset();
502
503        assertTrue(DoubleConversion.fixedDtoa(0.9999999999996, 12, buffer));
504        assertEquals("1", buffer.getRawDigits());
505        assertEquals(1, buffer.getDecimalPoint());
506        buffer.reset();
507
508        assertTrue(DoubleConversion.fixedDtoa(0.99999999999996, 13, buffer));
509        assertEquals("1", buffer.getRawDigits());
510        assertEquals(1, buffer.getDecimalPoint());
511        buffer.reset();
512
513        assertTrue(DoubleConversion.fixedDtoa(0.999999999999996, 14, buffer));
514        assertEquals("1", buffer.getRawDigits());
515        assertEquals(1, buffer.getDecimalPoint());
516        buffer.reset();
517
518        assertTrue(DoubleConversion.fixedDtoa(0.9999999999999996, 15, buffer));
519        assertEquals("1", buffer.getRawDigits());
520        assertEquals(1, buffer.getDecimalPoint());
521        buffer.reset();
522
523        assertTrue(DoubleConversion.fixedDtoa(0.00999999999999996, 16, buffer));
524        assertEquals("1", buffer.getRawDigits());
525        assertEquals(-1, buffer.getDecimalPoint());
526        buffer.reset();
527
528        assertTrue(DoubleConversion.fixedDtoa(0.000999999999999996, 17, buffer));
529        assertEquals("1", buffer.getRawDigits());
530        assertEquals(-2, buffer.getDecimalPoint());
531        buffer.reset();
532
533        assertTrue(DoubleConversion.fixedDtoa(0.0000999999999999996, 18, buffer));
534        assertEquals("1", buffer.getRawDigits());
535        assertEquals(-3, buffer.getDecimalPoint());
536        buffer.reset();
537
538        assertTrue(DoubleConversion.fixedDtoa(0.00000999999999999996, 19, buffer));
539        assertEquals("1", buffer.getRawDigits());
540        assertEquals(-4, buffer.getDecimalPoint());
541        buffer.reset();
542
543        assertTrue(DoubleConversion.fixedDtoa(0.000000999999999999996, 20, buffer));
544        assertEquals("1", buffer.getRawDigits());
545        assertEquals(-5, buffer.getDecimalPoint());
546        buffer.reset();
547
548        assertTrue(DoubleConversion.fixedDtoa(323423.234234, 10, buffer));
549        assertEquals("323423234234", buffer.getRawDigits());
550        assertEquals(6, buffer.getDecimalPoint());
551        buffer.reset();
552
553        assertTrue(DoubleConversion.fixedDtoa(12345678.901234, 4, buffer));
554        assertEquals("123456789012", buffer.getRawDigits());
555        assertEquals(8, buffer.getDecimalPoint());
556        buffer.reset();
557
558        assertTrue(DoubleConversion.fixedDtoa(98765.432109, 5, buffer));
559        assertEquals("9876543211", buffer.getRawDigits());
560        assertEquals(5, buffer.getDecimalPoint());
561        buffer.reset();
562
563        assertTrue(DoubleConversion.fixedDtoa(42, 20, buffer));
564        assertEquals("42", buffer.getRawDigits());
565        assertEquals(2, buffer.getDecimalPoint());
566        buffer.reset();
567
568        assertTrue(DoubleConversion.fixedDtoa(0.5, 0, buffer));
569        assertEquals("1", buffer.getRawDigits());
570        assertEquals(1, buffer.getDecimalPoint());
571        buffer.reset();
572
573        assertTrue(DoubleConversion.fixedDtoa(1e-23, 10, buffer));
574        assertEquals("", buffer.getRawDigits());
575        assertEquals(-10, buffer.getDecimalPoint());
576        buffer.reset();
577
578        assertTrue(DoubleConversion.fixedDtoa(1e-123, 2, buffer));
579        assertEquals("", buffer.getRawDigits());
580        assertEquals(-2, buffer.getDecimalPoint());
581        buffer.reset();
582
583        assertTrue(DoubleConversion.fixedDtoa(1e-123, 0, buffer));
584        assertEquals("", buffer.getRawDigits());
585        assertEquals(0, buffer.getDecimalPoint());
586        buffer.reset();
587
588        assertTrue(DoubleConversion.fixedDtoa(1e-23, 20, buffer));
589        assertEquals("", buffer.getRawDigits());
590        assertEquals(-20, buffer.getDecimalPoint());
591        buffer.reset();
592
593        assertTrue(DoubleConversion.fixedDtoa(1e-21, 20, buffer));
594        assertEquals("", buffer.getRawDigits());
595        assertEquals(-20, buffer.getDecimalPoint());
596        buffer.reset();
597
598        assertTrue(DoubleConversion.fixedDtoa(1e-22, 20, buffer));
599        assertEquals("", buffer.getRawDigits());
600        assertEquals(-20, buffer.getDecimalPoint());
601        buffer.reset();
602
603        assertTrue(DoubleConversion.fixedDtoa(6e-21, 20, buffer));
604        assertEquals("1", buffer.getRawDigits());
605        assertEquals(-19, buffer.getDecimalPoint());
606        buffer.reset();
607
608        assertTrue(DoubleConversion.fixedDtoa(9.1193616301674545152000000e+19, 0, buffer));
609        assertEquals("91193616301674545152", buffer.getRawDigits());
610        assertEquals(20, buffer.getDecimalPoint());
611        buffer.reset();
612
613        assertTrue(DoubleConversion.fixedDtoa(4.8184662102767651659096515e-04, 19, buffer));
614        assertEquals("4818466210276765", buffer.getRawDigits());
615        assertEquals(-3, buffer.getDecimalPoint());
616        buffer.reset();
617
618        assertTrue(DoubleConversion.fixedDtoa(1.9023164229540652612705182e-23, 8, buffer));
619        assertEquals("", buffer.getRawDigits());
620        assertEquals(-8, buffer.getDecimalPoint());
621        buffer.reset();
622
623        assertTrue(DoubleConversion.fixedDtoa(1000000000000000128.0, 0, buffer));
624        assertEquals("1000000000000000128", buffer.getRawDigits());
625        assertEquals(19, buffer.getDecimalPoint());
626        buffer.reset();
627    }
628
629
630
631    @Test
632    public void testFastFixed() {
633        final AtomicInteger total = new AtomicInteger();
634        final AtomicInteger succeeded = new AtomicInteger();
635
636        new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("resources/gay-fixed.txt")))
637                .lines()
638                .forEach(line -> {
639                    if (line.isEmpty() || line.startsWith("//")) {
640                        return; // comment or empty line
641                    }
642                    final String[] tokens = line.split(",\\s+");
643                    assertEquals(tokens.length, 4);
644                    final double v = Double.parseDouble(tokens[0]);
645                    final int digits = Integer.parseInt(tokens[1]);
646                    final String str = tokens[2].replace('"', ' ').trim();;
647                    final int point = Integer.parseInt(tokens[3]);
648                    final DtoaBuffer buffer = new DtoaBuffer(kBufferSize);
649                    total.getAndIncrement();
650
651                    if (DoubleConversion.fixedDtoa(v, digits, buffer)) {
652                        assertEquals(str, buffer.getRawDigits());
653                        assertEquals(point, buffer.getDecimalPoint());
654                        succeeded.getAndIncrement();
655                    }
656                });
657
658        // should work for all numbers
659        assertEquals(succeeded.get(), total.get());
660    }
661
662}
663