MCPcopy Create free account
hub / github.com/e2wugui/zeze / grisu2

Method grisu2

ZezeJava/ZezeJava/src/main/java/Zeze/Util/JsonWriter.java:773–965  ·  view source on GitHub ↗
(long f, final int maxDecimalPlaces)

Source from the content-addressed store, hash-verified

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;

Callers 1

writeMethod · 0.95

Calls 4

umulHigh18Method · 0.95
umulHigh9Method · 0.95
umulHighMethod · 0.95
grisuRoundMethod · 0.95

Tested by

no test coverage detected