1 36 38 56 57 package com.google.gwt.dev.js.rhino; 58 59 import java.math.BigInteger ; 60 61 class DToA { 62 63 64 67 68 static final int DTOBASESTR_BUFFER_SIZE = 1078; 69 70 static char BASEDIGIT(int digit) { 71 return (char)((digit >= 10) ? 'a' - 10 + digit : '0' + digit); 72 } 73 74 static final int 75 DTOSTR_STANDARD = 0, 76 DTOSTR_STANDARD_EXPONENTIAL = 1, 77 DTOSTR_FIXED = 2, 78 DTOSTR_EXPONENTIAL = 3, 79 DTOSTR_PRECISION = 4; 80 81 82 static final int Frac_mask = 0xfffff; 83 static final int Exp_shift = 20; 84 static final int Exp_msk1 = 0x100000; 85 static final int Bias = 1023; 86 static final int P = 53; 87 88 static final int Exp_shift1 = 20; 89 static final int Exp_mask = 0x7ff00000; 90 static final int Bndry_mask = 0xfffff; 91 static final int Log2P = 1; 92 93 static final int Sign_bit = 0x80000000; 94 static final int Exp_11 = 0x3ff00000; 95 static final int Ten_pmax = 22; 96 static final int Quick_max = 14; 97 static final int Bletch = 0x10; 98 static final int Frac_mask1 = 0xfffff; 99 static final int Int_max = 14; 100 static final int n_bigtens = 5; 101 102 103 static final double tens[] = { 104 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 105 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19, 106 1e20, 1e21, 1e22 107 }; 108 109 static final double bigtens[] = { 1e16, 1e32, 1e64, 1e128, 1e256 }; 110 111 static int lo0bits(int y) 112 { 113 int k; 114 int x = y; 115 116 if ((x & 7) != 0) { 117 if ((x & 1) != 0) 118 return 0; 119 if ((x & 2) != 0) { 120 return 1; 121 } 122 return 2; 123 } 124 k = 0; 125 if ((x & 0xffff) == 0) { 126 k = 16; 127 x >>>= 16; 128 } 129 if ((x & 0xff) == 0) { 130 k += 8; 131 x >>>= 8; 132 } 133 if ((x & 0xf) == 0) { 134 k += 4; 135 x >>>= 4; 136 } 137 if ((x & 0x3) == 0) { 138 k += 2; 139 x >>>= 2; 140 } 141 if ((x & 1) == 0) { 142 k++; 143 x >>>= 1; 144 if ((x & 1) == 0) 145 return 32; 146 } 147 return k; 148 } 149 150 151 static int hi0bits(int x) 152 { 153 int k = 0; 154 155 if ((x & 0xffff0000) == 0) { 156 k = 16; 157 x <<= 16; 158 } 159 if ((x & 0xff000000) == 0) { 160 k += 8; 161 x <<= 8; 162 } 163 if ((x & 0xf0000000) == 0) { 164 k += 4; 165 x <<= 4; 166 } 167 if ((x & 0xc0000000) == 0) { 168 k += 2; 169 x <<= 2; 170 } 171 if ((x & 0x80000000) == 0) { 172 k++; 173 if ((x & 0x40000000) == 0) 174 return 32; 175 } 176 return k; 177 } 178 179 static void stuffBits(byte bits[], int offset, int val) 180 { 181 bits[offset] = (byte)(val >> 24); 182 bits[offset + 1] = (byte)(val >> 16); 183 bits[offset + 2] = (byte)(val >> 8); 184 bits[offset + 3] = (byte)(val); 185 } 186 187 190 static BigInteger d2b(double d, int[] e, int[] bits) 191 { 192 byte dbl_bits[]; 193 int i, k, y, z, de; 194 long dBits = Double.doubleToLongBits(d); 195 int d0 = (int)(dBits >>> 32); 196 int d1 = (int)(dBits); 197 198 z = d0 & Frac_mask; 199 d0 &= 0x7fffffff; 200 201 if ((de = (int)(d0 >>> Exp_shift)) != 0) 202 z |= Exp_msk1; 203 204 if ((y = d1) != 0) { 205 dbl_bits = new byte[8]; 206 k = lo0bits(y); 207 y >>>= k; 208 if (k != 0) { 209 stuffBits(dbl_bits, 4, y | z << (32 - k)); 210 z >>= k; 211 } 212 else 213 stuffBits(dbl_bits, 4, y); 214 stuffBits(dbl_bits, 0, z); 215 i = (z != 0) ? 2 : 1; 216 } 217 else { 218 dbl_bits = new byte[4]; 220 k = lo0bits(z); 221 z >>>= k; 222 stuffBits(dbl_bits, 0, z); 223 k += 32; 224 i = 1; 225 } 226 if (de != 0) { 227 e[0] = de - Bias - (P-1) + k; 228 bits[0] = P - k; 229 } 230 else { 231 e[0] = de - Bias - (P-1) + 1 + k; 232 bits[0] = 32*i - hi0bits(z); 233 } 234 return new BigInteger (dbl_bits); 235 } 236 237 public static String JS_dtobasestr(int base, double d) 238 { 239 char[] buffer; 240 int p; 241 int pInt; 242 243 int q; 244 int digit; 245 double di; 246 double df; 247 248 250 buffer = new char[DTOBASESTR_BUFFER_SIZE]; 251 252 p = 0; 253 if (d < 0.0) { 254 buffer[p++] = '-'; 255 d = -d; 256 } 257 258 259 if (Double.isNaN(d)) 260 return "NaN"; 261 else 262 if (Double.isInfinite(d)) 263 return "Infinity"; 264 265 266 pInt = p; 267 di = (int)d; 268 BigInteger b = BigInteger.valueOf((int)di); 269 String intDigits = b.toString(base); 270 intDigits.getChars(0, intDigits.length(), buffer, p); 271 p += intDigits.length(); 272 273 df = d - di; 274 if (df != 0.0) { 275 276 buffer[p++] = '.'; 277 278 long dBits = Double.doubleToLongBits(d); 279 int word0 = (int)(dBits >> 32); 280 int word1 = (int)(dBits); 281 282 int[] e = new int[1]; 283 int[] bbits = new int[1]; 284 285 b = d2b(df, e, bbits); 286 288 289 int s2 = -(word0 >>> Exp_shift1 & Exp_mask >> Exp_shift1); 290 if (s2 == 0) 291 s2 = -1; 292 s2 += Bias + P; 293 294 BigInteger mlo = BigInteger.valueOf(1); 296 BigInteger mhi = mlo; 297 if ((word1 == 0) && ((word0 & Bndry_mask) == 0) 298 && ((word0 & (Exp_mask & Exp_mask << 1)) != 0)) { 299 301 s2 += Log2P; 302 mhi = BigInteger.valueOf(1<<Log2P); 303 } 304 305 b = b.shiftLeft(e[0] + s2); 306 BigInteger s = BigInteger.valueOf(1); 307 s = s.shiftLeft(s2); 308 313 BigInteger bigBase = BigInteger.valueOf(base); 314 315 boolean done = false; 316 do { 317 b = b.multiply(bigBase); 318 BigInteger [] divResult = b.divideAndRemainder(s); 319 b = divResult[1]; 320 digit = (char)(divResult[0].intValue()); 321 if (mlo == mhi) 322 mlo = mhi = mlo.multiply(bigBase); 323 else { 324 mlo = mlo.multiply(bigBase); 325 mhi = mhi.multiply(bigBase); 326 } 327 328 329 int j = b.compareTo(mlo); 330 331 BigInteger delta = s.subtract(mhi); 332 int j1 = (delta.signum() <= 0) ? 1 : b.compareTo(delta); 333 334 if (j1 == 0 && ((word1 & 1) == 0)) { 335 if (j > 0) 336 digit++; 337 done = true; 338 } else 339 if (j < 0 || (j == 0 && ((word1 & 1) == 0))) { 340 if (j1 > 0) { 341 343 b = b.shiftLeft(1); 344 j1 = b.compareTo(s); 345 if (j1 > 0) 347 digit++; 348 } 349 done = true; 350 } else if (j1 > 0) { 351 digit++; 352 done = true; 353 } 354 buffer[p++] = BASEDIGIT(digit); 356 } while (!done); 357 } 358 359 return new String (buffer, 0, p); 360 } 361 362 395 396 static int word0(double d) 397 { 398 long dBits = Double.doubleToLongBits(d); 399 return (int)(dBits >> 32); 400 } 401 402 static double setWord0(double d, int i) 403 { 404 long dBits = Double.doubleToLongBits(d); 405 dBits = ((long)i << 32) | (dBits & 0x0FFFFFFFFL); 406 return Double.longBitsToDouble(dBits); 407 } 408 409 static int word1(double d) 410 { 411 long dBits = Double.doubleToLongBits(d); 412 return (int)(dBits); 413 } 414 415 416 static BigInteger pow5mult(BigInteger b, int k) 418 { 419 return b.multiply(BigInteger.valueOf(5).pow(k)); 420 } 421 422 static boolean roundOff(StringBuffer buf) 423 { 424 char lastCh; 425 while ((lastCh = buf.charAt(buf.length() - 1)) == '9') { 426 buf.setLength(buf.length() - 1); 427 if (buf.length() == 0) { 428 return true; 429 } 430 } 431 buf.append((char)(lastCh + 1)); 432 return false; 433 } 434 435 436 440 442 static int 443 JS_dtoa(double d, int mode, boolean biasUp, int ndigits, 444 boolean[] sign, StringBuffer buf) 445 { 446 479 480 int b2, b5, i, ieps, ilim, ilim0, ilim1, 481 j, j1, k, k0, m2, m5, s2, s5; 482 char dig; 483 long L; 484 long x; 485 BigInteger b, b1, delta, mlo, mhi, S; 486 int[] be = new int[1]; 487 int[] bbits = new int[1]; 488 double d2, ds, eps; 489 boolean spec_case, denorm, k_check, try_quick, leftright; 490 491 if ((word0(d) & Sign_bit) != 0) { 492 493 sign[0] = true; 494 d = setWord0(d, word0(d) & ~Sign_bit); 496 } 497 else 498 sign[0] = false; 499 500 if ((word0(d) & Exp_mask) == Exp_mask) { 501 502 buf.append(((word1(d) == 0) && ((word0(d) & Frac_mask) == 0)) ? "Infinity" : "NaN"); 503 return 9999; 504 } 505 if (d == 0) { 506 buf.setLength(0); 508 buf.append('0'); 509 return 1; 510 } 511 512 b = d2b(d, be, bbits); 513 if ((i = (int)(word0(d) >>> Exp_shift1 & (Exp_mask>>Exp_shift1))) != 0) { 514 d2 = setWord0(d, (word0(d) & Frac_mask1) | Exp_11); 515 536 i -= Bias; 537 denorm = false; 538 } 539 else { 540 541 i = bbits[0] + be[0] + (Bias + (P-1) - 1); 542 x = (i > 32) ? word0(d) << (64 - i) | word1(d) >>> (i - 32) : word1(d) << (32 - i); 543 d2 = setWord0(x, word0(x) - 31*Exp_msk1); 546 i -= (Bias + (P-1) - 1) + 1; 547 denorm = true; 548 } 549 550 ds = (d2-1.5)*0.289529654602168 + 0.1760912590558 + i*0.301029995663981; 551 k = (int)ds; 552 if (ds < 0.0 && ds != k) 553 k--; 554 k_check = true; 555 if (k >= 0 && k <= Ten_pmax) { 556 if (d < tens[k]) 557 k--; 558 k_check = false; 559 } 560 562 j = bbits[0] - i - 1; 563 564 if (j >= 0) { 565 b2 = 0; 566 s2 = j; 567 } 568 else { 569 b2 = -j; 570 s2 = 0; 571 } 572 if (k >= 0) { 573 b5 = 0; 574 s5 = k; 575 s2 += k; 576 } 577 else { 578 b2 -= k; 579 b5 = -k; 580 s5 = 0; 581 } 582 584 if (mode < 0 || mode > 9) 585 mode = 0; 586 try_quick = true; 587 if (mode > 5) { 588 mode -= 4; 589 try_quick = false; 590 } 591 leftright = true; 592 ilim = ilim1 = 0; 593 switch(mode) { 594 case 0: 595 case 1: 596 ilim = ilim1 = -1; 597 i = 18; 598 ndigits = 0; 599 break; 600 case 2: 601 leftright = false; 602 603 case 4: 604 if (ndigits <= 0) 605 ndigits = 1; 606 ilim = ilim1 = i = ndigits; 607 break; 608 case 3: 609 leftright = false; 610 611 case 5: 612 i = ndigits + k + 1; 613 ilim = i; 614 ilim1 = i - 1; 615 if (i <= 0) 616 i = 1; 617 } 618 619 621 622 boolean fast_failed = false; 623 if (ilim >= 0 && ilim <= Quick_max && try_quick) { 624 625 626 627 i = 0; 628 d2 = d; 629 k0 = k; 630 ilim0 = ilim; 631 ieps = 2; 632 633 if (k > 0) { 634 ds = tens[k&0xf]; 635 j = k >> 4; 636 if ((j & Bletch) != 0) { 637 638 j &= Bletch - 1; 639 d /= bigtens[n_bigtens-1]; 640 ieps++; 641 } 642 for(; (j != 0); j >>= 1, i++) 643 if ((j & 1) != 0) { 644 ieps++; 645 ds *= bigtens[i]; 646 } 647 d /= ds; 648 } 649 else if ((j1 = -k) != 0) { 650 d *= tens[j1 & 0xf]; 651 for(j = j1 >> 4; (j != 0); j >>= 1, i++) 652 if ((j & 1) != 0) { 653 ieps++; 654 d *= bigtens[i]; 655 } 656 } 657 658 if (k_check && d < 1.0 && ilim > 0) { 659 if (ilim1 <= 0) 660 fast_failed = true; 661 else { 662 ilim = ilim1; 663 k--; 664 d *= 10.; 665 ieps++; 666 } 667 } 668 669 eps = ieps*d + 7.0; 672 eps = setWord0(eps, word0(eps) - (P-1)*Exp_msk1); 673 if (ilim == 0) { 674 S = mhi = null; 675 d -= 5.0; 676 if (d > eps) { 677 buf.append('1'); 678 k++; 679 return k + 1; 680 } 681 if (d < -eps) { 682 buf.setLength(0); 683 buf.append('0'); 684 return 1; 685 } 686 fast_failed = true; 687 } 688 if (!fast_failed) { 689 fast_failed = true; 690 if (leftright) { 691 694 eps = 0.5/tens[ilim-1] - eps; 695 for(i = 0;;) { 696 L = (long)d; 697 d -= L; 698 buf.append((char)('0' + L)); 699 if (d < eps) { 700 return k + 1; 701 } 702 if (1.0 - d < eps) { 703 char lastCh; 705 while (true) { 706 lastCh = buf.charAt(buf.length() - 1); 707 buf.setLength(buf.length() - 1); 708 if (lastCh != '9') break; 709 if (buf.length() == 0) { 710 k++; 711 lastCh = '0'; 712 break; 713 } 714 } 715 buf.append((char)(lastCh + 1)); 716 return k + 1; 717 } 718 if (++i >= ilim) 719 break; 720 eps *= 10.0; 721 d *= 10.0; 722 } 723 } 724 else { 725 726 eps *= tens[ilim-1]; 727 for(i = 1;; i++, d *= 10.0) { 728 L = (long)d; 729 d -= L; 730 buf.append((char)('0' + L)); 731 if (i == ilim) { 732 if (d > 0.5 + eps) { 733 char lastCh; 735 while (true) { 736 lastCh = buf.charAt(buf.length() - 1); 737 buf.setLength(buf.length() - 1); 738 if (lastCh != '9') break; 739 if (buf.length() == 0) { 740 k++; 741 lastCh = '0'; 742 break; 743 } 744 } 745 buf.append((char)(lastCh + 1)); 746 return k + 1; 747 } 748 else 749 if (d < 0.5 - eps) { 750 while (buf.charAt(buf.length() - 1) == '0') 751 buf.setLength(buf.length() - 1); 752 return k + 1; 755 } 756 break; 757 } 758 } 759 } 760 } 761 if (fast_failed) { 762 buf.setLength(0); 763 d = d2; 764 k = k0; 765 ilim = ilim0; 766 } 767 } 768 769 770 771 if (be[0] >= 0 && k <= Int_max) { 772 773 ds = tens[k]; 774 if (ndigits < 0 && ilim <= 0) { 775 S = mhi = null; 776 if (ilim < 0 || d < 5*ds || (!biasUp && d == 5*ds)) { 777 buf.setLength(0); 778 buf.append('0'); 779 return 1; 780 } 781 buf.append('1'); 782 k++; 783 return k + 1; 784 } 785 for(i = 1;; i++) { 786 L = (long) (d / ds); 787 d -= L*ds; 788 buf.append((char)('0' + L)); 789 if (i == ilim) { 790 d += d; 791 if ((d > ds) || (d == ds && (((L & 1) != 0) || biasUp))) { 792 char lastCh; 801 while (true) { 802 lastCh = buf.charAt(buf.length() - 1); 803 buf.setLength(buf.length() - 1); 804 if (lastCh != '9') break; 805 if (buf.length() == 0) { 806 k++; 807 lastCh = '0'; 808 break; 809 } 810 } 811 buf.append((char)(lastCh + 1)); 812 } 813 break; 814 } 815 d *= 10.0; 816 if (d == 0) 817 break; 818 } 819 return k + 1; 820 } 821 822 m2 = b2; 823 m5 = b5; 824 mhi = mlo = null; 825 if (leftright) { 826 if (mode < 2) { 827 i = (denorm) ? be[0] + (Bias + (P-1) - 1 + 1) : 1 + P - bbits[0]; 828 830 } 831 else { 832 j = ilim - 1; 833 if (m5 >= j) 834 m5 -= j; 835 else { 836 s5 += j -= m5; 837 b5 += j; 838 m5 = 0; 839 } 840 if ((i = ilim) < 0) { 841 m2 -= i; 842 i = 0; 843 } 844 845 } 846 b2 += i; 847 s2 += i; 848 mhi = BigInteger.valueOf(1); 849 851 } 852 854 if (m2 > 0 && s2 > 0) { 855 i = (m2 < s2) ? m2 : s2; 856 b2 -= i; 857 m2 -= i; 858 s2 -= i; 859 } 860 861 862 if (b5 > 0) { 863 if (leftright) { 864 if (m5 > 0) { 865 mhi = pow5mult(mhi, m5); 866 b1 = mhi.multiply(b); 867 b = b1; 868 } 869 if ((j = b5 - m5) != 0) 870 b = pow5mult(b, j); 871 } 872 else 873 b = pow5mult(b, b5); 874 } 875 877 878 S = BigInteger.valueOf(1); 879 if (s5 > 0) 880 S = pow5mult(S, s5); 881 883 884 885 spec_case = false; 886 if (mode < 2) { 887 if ( (word1(d) == 0) && ((word0(d) & Bndry_mask) == 0) 888 && ((word0(d) & (Exp_mask & Exp_mask << 1)) != 0) 889 ) { 890 892 b2 += Log2P; 893 s2 += Log2P; 894 spec_case = true; 895 } 896 } 897 898 905 byte [] S_bytes = S.toByteArray(); 906 int S_hiWord = 0; 907 for (int idx = 0; idx < 4; idx++) { 908 S_hiWord = (S_hiWord << 8); 909 if (idx < S_bytes.length) 910 S_hiWord |= (S_bytes[idx] & 0xFF); 911 } 912 if ((i = (((s5 != 0) ? 32 - hi0bits(S_hiWord) : 1) + s2) & 0x1f) != 0) 913 i = 32 - i; 914 915 if (i > 4) { 916 i -= 4; 917 b2 += i; 918 m2 += i; 919 s2 += i; 920 } 921 else if (i < 4) { 922 i += 28; 923 b2 += i; 924 m2 += i; 925 s2 += i; 926 } 927 928 if (b2 > 0) 929 b = b.shiftLeft(b2); 930 if (s2 > 0) 931 S = S.shiftLeft(s2); 932 934 if (k_check) { 935 if (b.compareTo(S) < 0) { 936 k--; 937 b = b.multiply(BigInteger.valueOf(10)); 938 if (leftright) 939 mhi = mhi.multiply(BigInteger.valueOf(10)); 940 ilim = ilim1; 941 } 942 } 943 944 945 if (ilim <= 0 && mode > 2) { 946 948 if ((ilim < 0 ) 949 || ((i = b.compareTo(S = S.multiply(BigInteger.valueOf(5)))) < 0) 950 || ((i == 0 && !biasUp))) { 951 953 956 buf.setLength(0); 957 buf.append('0'); 958 return 1; 959 } 961 buf.append('1'); 963 k++; 964 return k + 1; 965 } 966 if (leftright) { 967 if (m2 > 0) 968 mhi = mhi.shiftLeft(m2); 969 970 973 974 mlo = mhi; 975 if (spec_case) { 976 mhi = mlo; 977 mhi = mhi.shiftLeft(Log2P); 978 } 979 980 981 982 for(i = 1;;i++) { 983 BigInteger [] divResult = b.divideAndRemainder(S); 984 b = divResult[1]; 985 dig = (char)(divResult[0].intValue() + '0'); 986 989 j = b.compareTo(mlo); 990 991 delta = S.subtract(mhi); 992 j1 = (delta.signum() <= 0) ? 1 : b.compareTo(delta); 993 994 if ((j1 == 0) && (mode == 0) && ((word1(d) & 1) == 0)) { 995 if (dig == '9') { 996 buf.append('9'); 997 if (roundOff(buf)) { 998 k++; 999 buf.append('1'); 1000 } 1001 return k + 1; 1002 } 1004 if (j > 0) 1005 dig++; 1006 buf.append(dig); 1007 return k + 1; 1008 } 1009 if ((j < 0) 1010 || ((j == 0) 1011 && (mode == 0) 1012 && ((word1(d) & 1) == 0) 1013 )) { 1014 if (j1 > 0) { 1015 1017 b = b.shiftLeft(1); 1018 j1 = b.compareTo(S); 1019 if (((j1 > 0) || (j1 == 0 && (((dig & 1) == 1) || biasUp))) 1020 && (dig++ == '9')) { 1021 buf.append('9'); 1022 if (roundOff(buf)) { 1023 k++; 1024 buf.append('1'); 1025 } 1026 return k + 1; 1027 } 1029 } 1030 buf.append(dig); 1031 return k + 1; 1032 } 1033 if (j1 > 0) { 1034 if (dig == '9') { 1035 buf.append('9'); 1039 if (roundOff(buf)) { 1040 k++; 1041 buf.append('1'); 1042 } 1043 return k + 1; 1044 } 1045 buf.append((char)(dig + 1)); 1046 return k + 1; 1047 } 1048 buf.append(dig); 1049 if (i == ilim) 1050 break; 1051 b = b.multiply(BigInteger.valueOf(10)); 1052 if (mlo == mhi) 1053 mlo = mhi = mhi.multiply(BigInteger.valueOf(10)); 1054 else { 1055 mlo = mlo.multiply(BigInteger.valueOf(10)); 1056 mhi = mhi.multiply(BigInteger.valueOf(10)); 1057 } 1058 } 1059 } 1060 else 1061 for(i = 1;; i++) { 1062 BigInteger [] divResult = b.divideAndRemainder(S); 1064 b = divResult[1]; 1065 dig = (char)(divResult[0].intValue() + '0'); 1066 buf.append(dig); 1067 if (i >= ilim) 1068 break; 1069 b = b.multiply(BigInteger.valueOf(10)); 1070 } 1071 1072 1073 1074 b = b.shiftLeft(1); 1075 j = b.compareTo(S); 1076 if ((j > 0) || (j == 0 && (((dig & 1) == 1) || biasUp))) { 1077 if (roundOff(buf)) { 1086 k++; 1087 buf.append('1'); 1088 return k + 1; 1089 } 1090 } 1091 else { 1092 1093 while (buf.charAt(buf.length() - 1) == '0') 1094 buf.setLength(buf.length() - 1); 1095 } 1098 return k + 1; 1109 } 1110 1111 1112 private static final int dtoaModes[] = { 1113 0, 1114 0, 1115 3, 1116 2, 1117 2}; 1118 1119 static void 1120 JS_dtostr(StringBuffer buffer, int mode, int precision, double d) 1121 { 1122 int decPt; 1123 boolean[] sign = new boolean[1]; 1124 int nDigits; 1125 1126 1129 if (mode == DTOSTR_FIXED && (d >= 1e21 || d <= -1e21)) 1130 mode = DTOSTR_STANDARD; 1131 1132 decPt = JS_dtoa(d, dtoaModes[mode], mode >= DTOSTR_FIXED, precision, sign, buffer); 1133 nDigits = buffer.length(); 1134 1135 1136 if (decPt != 9999) { 1137 boolean exponentialNotation = false; 1138 int minNDigits = 0; 1139 int p; 1140 int q; 1141 1142 switch (mode) { 1143 case DTOSTR_STANDARD: 1144 if (decPt < -5 || decPt > 21) 1145 exponentialNotation = true; 1146 else 1147 minNDigits = decPt; 1148 break; 1149 1150 case DTOSTR_FIXED: 1151 if (precision >= 0) 1152 minNDigits = decPt + precision; 1153 else 1154 minNDigits = decPt; 1155 break; 1156 1157 case DTOSTR_EXPONENTIAL: 1158 minNDigits = precision; 1160 1161 case DTOSTR_STANDARD_EXPONENTIAL: 1162 exponentialNotation = true; 1163 break; 1164 1165 case DTOSTR_PRECISION: 1166 minNDigits = precision; 1168 if (decPt < -5 || decPt > precision) 1169 exponentialNotation = true; 1170 break; 1171 } 1172 1173 1174 if (nDigits < minNDigits) { 1175 p = minNDigits; 1176 nDigits = minNDigits; 1177 do { 1178 buffer.append('0'); 1179 } while (buffer.length() != p); 1180 } 1181 1182 if (exponentialNotation) { 1183 1184 if (nDigits != 1) { 1185 buffer.insert(1, '.'); 1186 } 1187 buffer.append('e'); 1188 if ((decPt - 1) >= 0) 1189 buffer.append('+'); 1190 buffer.append(decPt - 1); 1191 } else if (decPt != nDigits) { 1193 1194 if (decPt > 0) { 1196 1197 buffer.insert(decPt, '.'); 1198 } else { 1199 1200 for (int i = 0; i < 1 - decPt; i++) 1201 buffer.insert(0, '0'); 1202 buffer.insert(1, '.'); 1203 } 1204 } 1205 } 1206 1207 1208 if (sign[0] && 1209 !(word0(d) == Sign_bit && word1(d) == 0) && 1210 !((word0(d) & Exp_mask) == Exp_mask && 1211 ((word1(d) != 0) || ((word0(d) & Frac_mask) != 0)))) { 1212 buffer.insert(0, '-'); 1213 } 1214 } 1215 1216} 1217 | Popular Tags |