FixedDtoaTest.java revision 1507:549f06563f1c
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 * @test 75 * @run testng jdk.nashorn.internal.runtime.doubleconv.test.FixedDtoaTest 76 */ 77@SuppressWarnings("javadoc") 78public class FixedDtoaTest { 79 80 static final int kBufferSize = 500; 81 82 @Test 83 public void testFastShortestVarious() { 84 final DtoaBuffer buffer = new DtoaBuffer(kBufferSize); 85 86 assertTrue(DoubleConversion.fixedDtoa(1.0, 1, buffer)); 87 assertEquals("1", buffer.getRawDigits()); 88 assertEquals(1, buffer.getDecimalPoint()); 89 buffer.reset(); 90 91 assertTrue(DoubleConversion.fixedDtoa(1.0, 15, buffer)); 92 assertEquals("1", buffer.getRawDigits()); 93 assertEquals(1, buffer.getDecimalPoint()); 94 buffer.reset(); 95 96 assertTrue(DoubleConversion.fixedDtoa(1.0, 0, buffer)); 97 assertEquals("1", buffer.getRawDigits()); 98 assertEquals(1, buffer.getDecimalPoint()); 99 buffer.reset(); 100 101 assertTrue(DoubleConversion.fixedDtoa(0xFFFFFFFFL, 5, buffer)); 102 assertEquals("4294967295", buffer.getRawDigits()); 103 assertEquals(10, buffer.getDecimalPoint()); 104 buffer.reset(); 105 106 assertTrue(DoubleConversion.fixedDtoa(4294967296.0, 5, buffer)); 107 assertEquals("4294967296", buffer.getRawDigits()); 108 assertEquals(10, buffer.getDecimalPoint()); 109 buffer.reset(); 110 111 assertTrue(DoubleConversion.fixedDtoa(1e21, 5, buffer)); 112 assertEquals("1", buffer.getRawDigits()); 113 assertEquals(22, buffer.getDecimalPoint()); 114 buffer.reset(); 115 116 assertTrue(DoubleConversion.fixedDtoa(999999999999999868928.00, 2, buffer)); 117 assertEquals("999999999999999868928", buffer.getRawDigits()); 118 assertEquals(21, buffer.getDecimalPoint()); 119 buffer.reset(); 120 121 assertTrue(DoubleConversion.fixedDtoa(6.9999999999999989514240000e+21, 5, buffer)); 122 assertEquals("6999999999999998951424", buffer.getRawDigits()); 123 assertEquals(22, buffer.getDecimalPoint()); 124 buffer.reset(); 125 126 assertTrue(DoubleConversion.fixedDtoa(1.5, 5, buffer)); 127 assertEquals("15", buffer.getRawDigits()); 128 assertEquals(1, buffer.getDecimalPoint()); 129 buffer.reset(); 130 131 assertTrue(DoubleConversion.fixedDtoa(1.55, 5, buffer)); 132 assertEquals("155", buffer.getRawDigits()); 133 assertEquals(1, buffer.getDecimalPoint()); 134 buffer.reset(); 135 136 assertTrue(DoubleConversion.fixedDtoa(1.55, 1, buffer)); 137 assertEquals("16", buffer.getRawDigits()); 138 assertEquals(1, buffer.getDecimalPoint()); 139 buffer.reset(); 140 141 assertTrue(DoubleConversion.fixedDtoa(1.00000001, 15, buffer)); 142 assertEquals("100000001", buffer.getRawDigits()); 143 assertEquals(1, buffer.getDecimalPoint()); 144 buffer.reset(); 145 146 assertTrue(DoubleConversion.fixedDtoa(0.1, 10, buffer)); 147 assertEquals("1", buffer.getRawDigits()); 148 assertEquals(0, buffer.getDecimalPoint()); 149 buffer.reset(); 150 151 assertTrue(DoubleConversion.fixedDtoa(0.01, 10, buffer)); 152 assertEquals("1", buffer.getRawDigits()); 153 assertEquals(-1, buffer.getDecimalPoint()); 154 buffer.reset(); 155 156 assertTrue(DoubleConversion.fixedDtoa(0.001, 10, buffer)); 157 assertEquals("1", buffer.getRawDigits()); 158 assertEquals(-2, buffer.getDecimalPoint()); 159 buffer.reset(); 160 161 assertTrue(DoubleConversion.fixedDtoa(0.0001, 10, buffer)); 162 assertEquals("1", buffer.getRawDigits()); 163 assertEquals(-3, buffer.getDecimalPoint()); 164 buffer.reset(); 165 166 assertTrue(DoubleConversion.fixedDtoa(0.00001, 10, buffer)); 167 assertEquals("1", buffer.getRawDigits()); 168 assertEquals(-4, buffer.getDecimalPoint()); 169 buffer.reset(); 170 171 assertTrue(DoubleConversion.fixedDtoa(0.000001, 10, buffer)); 172 assertEquals("1", buffer.getRawDigits()); 173 assertEquals(-5, buffer.getDecimalPoint()); 174 buffer.reset(); 175 176 assertTrue(DoubleConversion.fixedDtoa(0.0000001, 10, buffer)); 177 assertEquals("1", buffer.getRawDigits()); 178 assertEquals(-6, buffer.getDecimalPoint()); 179 buffer.reset(); 180 181 assertTrue(DoubleConversion.fixedDtoa(0.00000001, 10, buffer)); 182 assertEquals("1", buffer.getRawDigits()); 183 assertEquals(-7, buffer.getDecimalPoint()); 184 buffer.reset(); 185 186 assertTrue(DoubleConversion.fixedDtoa(0.000000001, 10, buffer)); 187 assertEquals("1", buffer.getRawDigits()); 188 assertEquals(-8, buffer.getDecimalPoint()); 189 buffer.reset(); 190 191 assertTrue(DoubleConversion.fixedDtoa(0.0000000001, 15, buffer)); 192 assertEquals("1", buffer.getRawDigits()); 193 assertEquals(-9, buffer.getDecimalPoint()); 194 buffer.reset(); 195 196 assertTrue(DoubleConversion.fixedDtoa(0.00000000001, 15, buffer)); 197 assertEquals("1", buffer.getRawDigits()); 198 assertEquals(-10, buffer.getDecimalPoint()); 199 buffer.reset(); 200 201 assertTrue(DoubleConversion.fixedDtoa(0.000000000001, 15, buffer)); 202 assertEquals("1", buffer.getRawDigits()); 203 assertEquals(-11, buffer.getDecimalPoint()); 204 buffer.reset(); 205 206 assertTrue(DoubleConversion.fixedDtoa(0.0000000000001, 15, buffer)); 207 assertEquals("1", buffer.getRawDigits()); 208 assertEquals(-12, buffer.getDecimalPoint()); 209 buffer.reset(); 210 211 assertTrue(DoubleConversion.fixedDtoa(0.00000000000001, 15, buffer)); 212 assertEquals("1", buffer.getRawDigits()); 213 assertEquals(-13, buffer.getDecimalPoint()); 214 buffer.reset(); 215 216 assertTrue(DoubleConversion.fixedDtoa(0.000000000000001, 20, buffer)); 217 assertEquals("1", buffer.getRawDigits()); 218 assertEquals(-14, buffer.getDecimalPoint()); 219 buffer.reset(); 220 221 assertTrue(DoubleConversion.fixedDtoa(0.0000000000000001, 20, buffer)); 222 assertEquals("1", buffer.getRawDigits()); 223 assertEquals(-15, buffer.getDecimalPoint()); 224 buffer.reset(); 225 226 assertTrue(DoubleConversion.fixedDtoa(0.00000000000000001, 20, buffer)); 227 assertEquals("1", buffer.getRawDigits()); 228 assertEquals(-16, buffer.getDecimalPoint()); 229 buffer.reset(); 230 231 assertTrue(DoubleConversion.fixedDtoa(0.000000000000000001, 20, buffer)); 232 assertEquals("1", buffer.getRawDigits()); 233 assertEquals(-17, buffer.getDecimalPoint()); 234 buffer.reset(); 235 236 assertTrue(DoubleConversion.fixedDtoa(0.0000000000000000001, 20, buffer)); 237 assertEquals("1", buffer.getRawDigits()); 238 assertEquals(-18, buffer.getDecimalPoint()); 239 buffer.reset(); 240 241 assertTrue(DoubleConversion.fixedDtoa(0.00000000000000000001, 20, buffer)); 242 assertEquals("1", buffer.getRawDigits()); 243 assertEquals(-19, buffer.getDecimalPoint()); 244 buffer.reset(); 245 246 assertTrue(DoubleConversion.fixedDtoa(0.10000000004, 10, buffer)); 247 assertEquals("1", buffer.getRawDigits()); 248 assertEquals(0, buffer.getDecimalPoint()); 249 buffer.reset(); 250 251 assertTrue(DoubleConversion.fixedDtoa(0.01000000004, 10, buffer)); 252 assertEquals("1", buffer.getRawDigits()); 253 assertEquals(-1, buffer.getDecimalPoint()); 254 buffer.reset(); 255 256 assertTrue(DoubleConversion.fixedDtoa(0.00100000004, 10, buffer)); 257 assertEquals("1", buffer.getRawDigits()); 258 assertEquals(-2, buffer.getDecimalPoint()); 259 buffer.reset(); 260 261 assertTrue(DoubleConversion.fixedDtoa(0.00010000004, 10, buffer)); 262 assertEquals("1", buffer.getRawDigits()); 263 assertEquals(-3, buffer.getDecimalPoint()); 264 buffer.reset(); 265 266 assertTrue(DoubleConversion.fixedDtoa(0.00001000004, 10, buffer)); 267 assertEquals("1", buffer.getRawDigits()); 268 assertEquals(-4, buffer.getDecimalPoint()); 269 buffer.reset(); 270 271 assertTrue(DoubleConversion.fixedDtoa(0.00000100004, 10, buffer)); 272 assertEquals("1", buffer.getRawDigits()); 273 assertEquals(-5, buffer.getDecimalPoint()); 274 buffer.reset(); 275 276 assertTrue(DoubleConversion.fixedDtoa(0.00000010004, 10, buffer)); 277 assertEquals("1", buffer.getRawDigits()); 278 assertEquals(-6, buffer.getDecimalPoint()); 279 buffer.reset(); 280 281 assertTrue(DoubleConversion.fixedDtoa(0.00000001004, 10, buffer)); 282 assertEquals("1", buffer.getRawDigits()); 283 assertEquals(-7, buffer.getDecimalPoint()); 284 buffer.reset(); 285 286 assertTrue(DoubleConversion.fixedDtoa(0.00000000104, 10, buffer)); 287 assertEquals("1", buffer.getRawDigits()); 288 assertEquals(-8, buffer.getDecimalPoint()); 289 buffer.reset(); 290 291 assertTrue(DoubleConversion.fixedDtoa(0.0000000001000004, 15, buffer)); 292 assertEquals("1", buffer.getRawDigits()); 293 assertEquals(-9, buffer.getDecimalPoint()); 294 buffer.reset(); 295 296 assertTrue(DoubleConversion.fixedDtoa(0.0000000000100004, 15, buffer)); 297 assertEquals("1", buffer.getRawDigits()); 298 assertEquals(-10, buffer.getDecimalPoint()); 299 buffer.reset(); 300 301 assertTrue(DoubleConversion.fixedDtoa(0.0000000000010004, 15, buffer)); 302 assertEquals("1", buffer.getRawDigits()); 303 assertEquals(-11, buffer.getDecimalPoint()); 304 buffer.reset(); 305 306 assertTrue(DoubleConversion.fixedDtoa(0.0000000000001004, 15, buffer)); 307 assertEquals("1", buffer.getRawDigits()); 308 assertEquals(-12, buffer.getDecimalPoint()); 309 buffer.reset(); 310 311 assertTrue(DoubleConversion.fixedDtoa(0.0000000000000104, 15, buffer)); 312 assertEquals("1", buffer.getRawDigits()); 313 assertEquals(-13, buffer.getDecimalPoint()); 314 buffer.reset(); 315 316 assertTrue(DoubleConversion.fixedDtoa(0.000000000000001000004, 20, buffer)); 317 assertEquals("1", buffer.getRawDigits()); 318 assertEquals(-14, buffer.getDecimalPoint()); 319 buffer.reset(); 320 321 assertTrue(DoubleConversion.fixedDtoa(0.000000000000000100004, 20, buffer)); 322 assertEquals("1", buffer.getRawDigits()); 323 assertEquals(-15, buffer.getDecimalPoint()); 324 buffer.reset(); 325 326 assertTrue(DoubleConversion.fixedDtoa(0.000000000000000010004, 20, buffer)); 327 assertEquals("1", buffer.getRawDigits()); 328 assertEquals(-16, buffer.getDecimalPoint()); 329 buffer.reset(); 330 331 assertTrue(DoubleConversion.fixedDtoa(0.000000000000000001004, 20, buffer)); 332 assertEquals("1", buffer.getRawDigits()); 333 assertEquals(-17, buffer.getDecimalPoint()); 334 buffer.reset(); 335 336 assertTrue(DoubleConversion.fixedDtoa(0.000000000000000000104, 20, buffer)); 337 assertEquals("1", buffer.getRawDigits()); 338 assertEquals(-18, buffer.getDecimalPoint()); 339 buffer.reset(); 340 341 assertTrue(DoubleConversion.fixedDtoa(0.000000000000000000014, 20, buffer)); 342 assertEquals("1", buffer.getRawDigits()); 343 assertEquals(-19, buffer.getDecimalPoint()); 344 buffer.reset(); 345 346 assertTrue(DoubleConversion.fixedDtoa(0.10000000006, 10, buffer)); 347 assertEquals("1000000001", buffer.getRawDigits()); 348 assertEquals(0, buffer.getDecimalPoint()); 349 buffer.reset(); 350 351 assertTrue(DoubleConversion.fixedDtoa(0.01000000006, 10, buffer)); 352 assertEquals("100000001", buffer.getRawDigits()); 353 assertEquals(-1, buffer.getDecimalPoint()); 354 buffer.reset(); 355 356 assertTrue(DoubleConversion.fixedDtoa(0.00100000006, 10, buffer)); 357 assertEquals("10000001", buffer.getRawDigits()); 358 assertEquals(-2, buffer.getDecimalPoint()); 359 buffer.reset(); 360 361 assertTrue(DoubleConversion.fixedDtoa(0.00010000006, 10, buffer)); 362 assertEquals("1000001", buffer.getRawDigits()); 363 assertEquals(-3, buffer.getDecimalPoint()); 364 buffer.reset(); 365 366 assertTrue(DoubleConversion.fixedDtoa(0.00001000006, 10, buffer)); 367 assertEquals("100001", buffer.getRawDigits()); 368 assertEquals(-4, buffer.getDecimalPoint()); 369 buffer.reset(); 370 371 assertTrue(DoubleConversion.fixedDtoa(0.00000100006, 10, buffer)); 372 assertEquals("10001", buffer.getRawDigits()); 373 assertEquals(-5, buffer.getDecimalPoint()); 374 buffer.reset(); 375 376 assertTrue(DoubleConversion.fixedDtoa(0.00000010006, 10, buffer)); 377 assertEquals("1001", buffer.getRawDigits()); 378 assertEquals(-6, buffer.getDecimalPoint()); 379 buffer.reset(); 380 381 assertTrue(DoubleConversion.fixedDtoa(0.00000001006, 10, buffer)); 382 assertEquals("101", buffer.getRawDigits()); 383 assertEquals(-7, buffer.getDecimalPoint()); 384 buffer.reset(); 385 386 assertTrue(DoubleConversion.fixedDtoa(0.00000000106, 10, buffer)); 387 assertEquals("11", buffer.getRawDigits()); 388 assertEquals(-8, buffer.getDecimalPoint()); 389 buffer.reset(); 390 391 assertTrue(DoubleConversion.fixedDtoa(0.0000000001000006, 15, buffer)); 392 assertEquals("100001", buffer.getRawDigits()); 393 assertEquals(-9, buffer.getDecimalPoint()); 394 buffer.reset(); 395 396 assertTrue(DoubleConversion.fixedDtoa(0.0000000000100006, 15, buffer)); 397 assertEquals("10001", buffer.getRawDigits()); 398 assertEquals(-10, buffer.getDecimalPoint()); 399 buffer.reset(); 400 401 assertTrue(DoubleConversion.fixedDtoa(0.0000000000010006, 15, buffer)); 402 assertEquals("1001", buffer.getRawDigits()); 403 assertEquals(-11, buffer.getDecimalPoint()); 404 buffer.reset(); 405 406 assertTrue(DoubleConversion.fixedDtoa(0.0000000000001006, 15, buffer)); 407 assertEquals("101", buffer.getRawDigits()); 408 assertEquals(-12, buffer.getDecimalPoint()); 409 buffer.reset(); 410 411 assertTrue(DoubleConversion.fixedDtoa(0.0000000000000106, 15, buffer)); 412 assertEquals("11", buffer.getRawDigits()); 413 assertEquals(-13, buffer.getDecimalPoint()); 414 buffer.reset(); 415 416 assertTrue(DoubleConversion.fixedDtoa(0.000000000000001000006, 20, buffer)); 417 assertEquals("100001", buffer.getRawDigits()); 418 assertEquals(-14, buffer.getDecimalPoint()); 419 buffer.reset(); 420 421 assertTrue(DoubleConversion.fixedDtoa(0.000000000000000100006, 20, buffer)); 422 assertEquals("10001", buffer.getRawDigits()); 423 assertEquals(-15, buffer.getDecimalPoint()); 424 buffer.reset(); 425 426 assertTrue(DoubleConversion.fixedDtoa(0.000000000000000010006, 20, buffer)); 427 assertEquals("1001", buffer.getRawDigits()); 428 assertEquals(-16, buffer.getDecimalPoint()); 429 buffer.reset(); 430 431 assertTrue(DoubleConversion.fixedDtoa(0.000000000000000001006, 20, buffer)); 432 assertEquals("101", buffer.getRawDigits()); 433 assertEquals(-17, buffer.getDecimalPoint()); 434 buffer.reset(); 435 436 assertTrue(DoubleConversion.fixedDtoa(0.000000000000000000106, 20, buffer)); 437 assertEquals("11", buffer.getRawDigits()); 438 assertEquals(-18, buffer.getDecimalPoint()); 439 buffer.reset(); 440 441 assertTrue(DoubleConversion.fixedDtoa(0.000000000000000000016, 20, buffer)); 442 assertEquals("2", buffer.getRawDigits()); 443 assertEquals(-19, buffer.getDecimalPoint()); 444 buffer.reset(); 445 446 assertTrue(DoubleConversion.fixedDtoa(0.6, 0, buffer)); 447 assertEquals("1", buffer.getRawDigits()); 448 assertEquals(1, buffer.getDecimalPoint()); 449 buffer.reset(); 450 451 assertTrue(DoubleConversion.fixedDtoa(0.96, 1, buffer)); 452 assertEquals("1", buffer.getRawDigits()); 453 assertEquals(1, buffer.getDecimalPoint()); 454 buffer.reset(); 455 456 assertTrue(DoubleConversion.fixedDtoa(0.996, 2, buffer)); 457 assertEquals("1", buffer.getRawDigits()); 458 assertEquals(1, buffer.getDecimalPoint()); 459 buffer.reset(); 460 461 assertTrue(DoubleConversion.fixedDtoa(0.9996, 3, buffer)); 462 assertEquals("1", buffer.getRawDigits()); 463 assertEquals(1, buffer.getDecimalPoint()); 464 buffer.reset(); 465 466 assertTrue(DoubleConversion.fixedDtoa(0.99996, 4, buffer)); 467 assertEquals("1", buffer.getRawDigits()); 468 assertEquals(1, buffer.getDecimalPoint()); 469 buffer.reset(); 470 471 assertTrue(DoubleConversion.fixedDtoa(0.999996, 5, buffer)); 472 assertEquals("1", buffer.getRawDigits()); 473 assertEquals(1, buffer.getDecimalPoint()); 474 buffer.reset(); 475 476 assertTrue(DoubleConversion.fixedDtoa(0.9999996, 6, buffer)); 477 assertEquals("1", buffer.getRawDigits()); 478 assertEquals(1, buffer.getDecimalPoint()); 479 buffer.reset(); 480 481 assertTrue(DoubleConversion.fixedDtoa(0.99999996, 7, buffer)); 482 assertEquals("1", buffer.getRawDigits()); 483 assertEquals(1, buffer.getDecimalPoint()); 484 buffer.reset(); 485 486 assertTrue(DoubleConversion.fixedDtoa(0.999999996, 8, buffer)); 487 assertEquals("1", buffer.getRawDigits()); 488 assertEquals(1, buffer.getDecimalPoint()); 489 buffer.reset(); 490 491 assertTrue(DoubleConversion.fixedDtoa(0.9999999996, 9, buffer)); 492 assertEquals("1", buffer.getRawDigits()); 493 assertEquals(1, buffer.getDecimalPoint()); 494 buffer.reset(); 495 496 assertTrue(DoubleConversion.fixedDtoa(0.99999999996, 10, buffer)); 497 assertEquals("1", buffer.getRawDigits()); 498 assertEquals(1, buffer.getDecimalPoint()); 499 buffer.reset(); 500 501 assertTrue(DoubleConversion.fixedDtoa(0.999999999996, 11, buffer)); 502 assertEquals("1", buffer.getRawDigits()); 503 assertEquals(1, buffer.getDecimalPoint()); 504 buffer.reset(); 505 506 assertTrue(DoubleConversion.fixedDtoa(0.9999999999996, 12, buffer)); 507 assertEquals("1", buffer.getRawDigits()); 508 assertEquals(1, buffer.getDecimalPoint()); 509 buffer.reset(); 510 511 assertTrue(DoubleConversion.fixedDtoa(0.99999999999996, 13, buffer)); 512 assertEquals("1", buffer.getRawDigits()); 513 assertEquals(1, buffer.getDecimalPoint()); 514 buffer.reset(); 515 516 assertTrue(DoubleConversion.fixedDtoa(0.999999999999996, 14, buffer)); 517 assertEquals("1", buffer.getRawDigits()); 518 assertEquals(1, buffer.getDecimalPoint()); 519 buffer.reset(); 520 521 assertTrue(DoubleConversion.fixedDtoa(0.9999999999999996, 15, buffer)); 522 assertEquals("1", buffer.getRawDigits()); 523 assertEquals(1, buffer.getDecimalPoint()); 524 buffer.reset(); 525 526 assertTrue(DoubleConversion.fixedDtoa(0.00999999999999996, 16, buffer)); 527 assertEquals("1", buffer.getRawDigits()); 528 assertEquals(-1, buffer.getDecimalPoint()); 529 buffer.reset(); 530 531 assertTrue(DoubleConversion.fixedDtoa(0.000999999999999996, 17, buffer)); 532 assertEquals("1", buffer.getRawDigits()); 533 assertEquals(-2, buffer.getDecimalPoint()); 534 buffer.reset(); 535 536 assertTrue(DoubleConversion.fixedDtoa(0.0000999999999999996, 18, buffer)); 537 assertEquals("1", buffer.getRawDigits()); 538 assertEquals(-3, buffer.getDecimalPoint()); 539 buffer.reset(); 540 541 assertTrue(DoubleConversion.fixedDtoa(0.00000999999999999996, 19, buffer)); 542 assertEquals("1", buffer.getRawDigits()); 543 assertEquals(-4, buffer.getDecimalPoint()); 544 buffer.reset(); 545 546 assertTrue(DoubleConversion.fixedDtoa(0.000000999999999999996, 20, buffer)); 547 assertEquals("1", buffer.getRawDigits()); 548 assertEquals(-5, buffer.getDecimalPoint()); 549 buffer.reset(); 550 551 assertTrue(DoubleConversion.fixedDtoa(323423.234234, 10, buffer)); 552 assertEquals("323423234234", buffer.getRawDigits()); 553 assertEquals(6, buffer.getDecimalPoint()); 554 buffer.reset(); 555 556 assertTrue(DoubleConversion.fixedDtoa(12345678.901234, 4, buffer)); 557 assertEquals("123456789012", buffer.getRawDigits()); 558 assertEquals(8, buffer.getDecimalPoint()); 559 buffer.reset(); 560 561 assertTrue(DoubleConversion.fixedDtoa(98765.432109, 5, buffer)); 562 assertEquals("9876543211", buffer.getRawDigits()); 563 assertEquals(5, buffer.getDecimalPoint()); 564 buffer.reset(); 565 566 assertTrue(DoubleConversion.fixedDtoa(42, 20, buffer)); 567 assertEquals("42", buffer.getRawDigits()); 568 assertEquals(2, buffer.getDecimalPoint()); 569 buffer.reset(); 570 571 assertTrue(DoubleConversion.fixedDtoa(0.5, 0, buffer)); 572 assertEquals("1", buffer.getRawDigits()); 573 assertEquals(1, buffer.getDecimalPoint()); 574 buffer.reset(); 575 576 assertTrue(DoubleConversion.fixedDtoa(1e-23, 10, buffer)); 577 assertEquals("", buffer.getRawDigits()); 578 assertEquals(-10, buffer.getDecimalPoint()); 579 buffer.reset(); 580 581 assertTrue(DoubleConversion.fixedDtoa(1e-123, 2, buffer)); 582 assertEquals("", buffer.getRawDigits()); 583 assertEquals(-2, buffer.getDecimalPoint()); 584 buffer.reset(); 585 586 assertTrue(DoubleConversion.fixedDtoa(1e-123, 0, buffer)); 587 assertEquals("", buffer.getRawDigits()); 588 assertEquals(0, buffer.getDecimalPoint()); 589 buffer.reset(); 590 591 assertTrue(DoubleConversion.fixedDtoa(1e-23, 20, buffer)); 592 assertEquals("", buffer.getRawDigits()); 593 assertEquals(-20, buffer.getDecimalPoint()); 594 buffer.reset(); 595 596 assertTrue(DoubleConversion.fixedDtoa(1e-21, 20, buffer)); 597 assertEquals("", buffer.getRawDigits()); 598 assertEquals(-20, buffer.getDecimalPoint()); 599 buffer.reset(); 600 601 assertTrue(DoubleConversion.fixedDtoa(1e-22, 20, buffer)); 602 assertEquals("", buffer.getRawDigits()); 603 assertEquals(-20, buffer.getDecimalPoint()); 604 buffer.reset(); 605 606 assertTrue(DoubleConversion.fixedDtoa(6e-21, 20, buffer)); 607 assertEquals("1", buffer.getRawDigits()); 608 assertEquals(-19, buffer.getDecimalPoint()); 609 buffer.reset(); 610 611 assertTrue(DoubleConversion.fixedDtoa(9.1193616301674545152000000e+19, 0, buffer)); 612 assertEquals("91193616301674545152", buffer.getRawDigits()); 613 assertEquals(20, buffer.getDecimalPoint()); 614 buffer.reset(); 615 616 assertTrue(DoubleConversion.fixedDtoa(4.8184662102767651659096515e-04, 19, buffer)); 617 assertEquals("4818466210276765", buffer.getRawDigits()); 618 assertEquals(-3, buffer.getDecimalPoint()); 619 buffer.reset(); 620 621 assertTrue(DoubleConversion.fixedDtoa(1.9023164229540652612705182e-23, 8, buffer)); 622 assertEquals("", buffer.getRawDigits()); 623 assertEquals(-8, buffer.getDecimalPoint()); 624 buffer.reset(); 625 626 assertTrue(DoubleConversion.fixedDtoa(1000000000000000128.0, 0, buffer)); 627 assertEquals("1000000000000000128", buffer.getRawDigits()); 628 assertEquals(19, buffer.getDecimalPoint()); 629 buffer.reset(); 630 } 631 632 633 634 @Test 635 public void testFastFixed() { 636 final AtomicInteger total = new AtomicInteger(); 637 final AtomicInteger succeeded = new AtomicInteger(); 638 639 new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("resources/gay-fixed.txt"))) 640 .lines() 641 .forEach(line -> { 642 if (line.isEmpty() || line.startsWith("//")) { 643 return; // comment or empty line 644 } 645 final String[] tokens = line.split(",\\s+"); 646 assertEquals(tokens.length, 4); 647 final double v = Double.parseDouble(tokens[0]); 648 final int digits = Integer.parseInt(tokens[1]); 649 final String str = tokens[2].replace('"', ' ').trim();; 650 final int point = Integer.parseInt(tokens[3]); 651 final DtoaBuffer buffer = new DtoaBuffer(kBufferSize); 652 total.getAndIncrement(); 653 654 if (DoubleConversion.fixedDtoa(v, digits, buffer)) { 655 assertEquals(str, buffer.getRawDigits()); 656 assertEquals(point, buffer.getDecimalPoint()); 657 succeeded.getAndIncrement(); 658 } 659 }); 660 661 // should work for all numbers 662 assertEquals(succeeded.get(), total.get()); 663 } 664 665} 666