(long f, final int maxDecimalPlaces)
| 771 | } |
| 772 | |
| 773 | void grisu2(long f, final int maxDecimalPlaces) { // f = Double.doubleToRawLongBits(d) |
| 774 | // {f,e}.reset(d) |
| 775 | int e = (int)(f >>> DOUBLE_SIGNIFICAND_SIZE); // [0,0x3ff] |
| 776 | f &= DOUBLE_SIGNIFICAND_MASK; // [0,1e52) |
| 777 | if (e != 0) { |
| 778 | f += DOUBLE_HIDDEN_BIT; // [1e52,1e53) |
| 779 | e -= DOUBLE_EXP_BIAS; // [-0x432,-0x34] |
| 780 | } else |
| 781 | e = 1 - DOUBLE_EXP_BIAS; // -0x432 (1+DOUBLE_MIN_EXP) |
| 782 | // {f,e}.normalizedBoundaries(mf/me, pf/pe); |
| 783 | int pe = e - 1; // [-0x433,-0x35] |
| 784 | long pf = (f << 1) + 1; // [1,1e54) |
| 785 | //{ pf/e.normalizeBoundary(); // pf <<= Long.numberOfLeadingZeros(pf << DOUBLE_EXP_SIZE) + DOUBLE_EXP_SIZE; |
| 786 | while ((pf & (DOUBLE_HIDDEN_BIT << 1)) == 0) { // max loop count: 53 |
| 787 | pe--; |
| 788 | pf <<= 1; |
| 789 | } |
| 790 | pe -= DOUBLE_EXP_SIZE; // [-0x432-0x35-0xa=-0x3f3,-0x35-0xa=-0x3f] |
| 791 | pf <<= DOUBLE_EXP_SIZE; // highest bit == 1 |
| 792 | //} |
| 793 | long mf; |
| 794 | final int me; |
| 795 | if (f == DOUBLE_HIDDEN_BIT) { |
| 796 | mf = (f << 2) - 1; |
| 797 | me = e - 2; |
| 798 | } else { |
| 799 | mf = (f << 1) - 1; |
| 800 | me = e - 1; |
| 801 | } |
| 802 | mf <<= me - pe; |
| 803 | //} |
| 804 | f <<= Long.numberOfLeadingZeros(f); // f.normalize(), highest bit == 1 |
| 805 | |
| 806 | // getCachedPower(pe) |
| 807 | // int k = static_cast<int>(ceil((-61 - e) * 0.30102999566398114)) + 374; |
| 808 | final double dk = (-61 - pe) * 0.30102999566398114 + 347; // dk must be positive, so can do ceiling in positive |
| 809 | int kk = (int)dk; |
| 810 | if (dk - kk > 0) |
| 811 | kk++; |
| 812 | final int idx = (kk >> 3) + 1; |
| 813 | kk = 348 - (idx << 3); // decimal exponent no need lookup table |
| 814 | |
| 815 | final long cmkf = CACHED_POWERS_F[idx]; // highest bit == 1 |
| 816 | if (javaVersion >= 18) { // for JDK18+ |
| 817 | f = umulHigh18(f, cmkf) + ((f * cmkf) >>> 63); |
| 818 | pf = umulHigh18(pf, cmkf) + ((pf * cmkf) >>> 63); |
| 819 | mf = umulHigh18(mf, cmkf) + ((mf * cmkf) >>> 63); |
| 820 | } else if (javaVersion >= 9) { // for JDK9+ |
| 821 | f = umulHigh9(f, cmkf) + ((f * cmkf) >>> 63); |
| 822 | pf = umulHigh9(pf, cmkf) + ((pf * cmkf) >>> 63); |
| 823 | mf = umulHigh9(mf, cmkf) + ((mf * cmkf) >>> 63); |
| 824 | } else { // for JDK8- |
| 825 | f = umulHigh(f, cmkf) + ((f * cmkf) >>> 63); |
| 826 | pf = umulHigh(pf, cmkf) + ((pf * cmkf) >>> 63); |
| 827 | mf = umulHigh(mf, cmkf) + ((mf * cmkf) >>> 63); |
| 828 | } |
| 829 | e = -(pe + CACHED_POWERS_E[idx] + 64); |
| 830 | long delta = pf-- - mf - 2; |
no test coverage detected