RFR: 8366017: Extend the set of inputs handled by fast paths in FloatingDecimal

Shaojin Wen swen at openjdk.org
Tue Oct 14 17:57:10 UTC 2025


On Thu, 28 Aug 2025 15:24:21 GMT, Raffaello Giulietti <rgiulietti at openjdk.org> wrote:

> Yet another step in modernizing `FloatingDecimal`s floating-point parsing.

src/java.base/share/classes/jdk/internal/math/FloatingDecimal.java line 53:

> 51:     private static final int    SINGLE_EXP_SHIFT  = FloatConsts.SIGNIFICAND_WIDTH - 1;
> 52:     private static final int    SINGLE_FRACT_HOB  = 1 << SINGLE_EXP_SHIFT;
> 53:     private static final int    SINGLE_MAX_DECIMAL_DIGITS = 7;

Suggestion:

    private static final int
            EXP_SHIFT                 = DoubleConsts.SIGNIFICAND_WIDTH - 1,
            MAX_SMALL_BIN_EXP         = 62,
            MIN_SMALL_BIN_EXP         = -63 / 3,
            MAX_DECIMAL_DIGITS        = 15,  // max{n : 10^n <= 2^P}
            FLOG_10_MAX_LONG          = 18,  // max{i : 10^i ≤ Long.MAX_VALUE}
            SINGLE_EXP_SHIFT          = FloatConsts.SIGNIFICAND_WIDTH - 1,
            SINGLE_FRACT_HOB          = 1 << SINGLE_EXP_SHIFT,
            SINGLE_MAX_DECIMAL_DIGITS = 7;
    private static final long
            FRACT_HOB = 1L << EXP_SHIFT, // assumed High-Order bit
            EXP_ONE   = (long) DoubleConsts.EXP_BIAS << EXP_SHIFT; // exponent of 1.0

How about this style?

src/java.base/share/classes/jdk/internal/math/FloatingDecimal.java line 164:

> 162:     private static final BinaryToASCIIConverter B2AC_NOT_A_NUMBER = new ExceptionalBinaryToASCIIBuffer(NAN_REP);
> 163:     private static final BinaryToASCIIConverter B2AC_POSITIVE_ZERO = new BinaryToASCIIBuffer(false, new byte[] {'0'});
> 164:     private static final BinaryToASCIIConverter B2AC_NEGATIVE_ZERO = new BinaryToASCIIBuffer(true,  new byte[] {'0'});

Suggestion:

    private static final BinaryToASCIIConverter
            B2AC_POSITIVE_INFINITY = new ExceptionalBinaryToASCIIBuffer(INFINITY_REP),
            B2AC_NEGATIVE_INFINITY = new ExceptionalBinaryToASCIIBuffer("-" + INFINITY_REP),
            B2AC_NOT_A_NUMBER      = new ExceptionalBinaryToASCIIBuffer(NAN_REP),
            B2AC_POSITIVE_ZERO     = new BinaryToASCIIBuffer(false, new byte[] {'0'}),
            B2AC_NEGATIVE_ZERO     = new BinaryToASCIIBuffer(true,  new byte[] {'0'});

src/java.base/share/classes/jdk/internal/math/FloatingDecimal.java line 905:

> 903:             new PreparedASCIIToBinaryBuffer(0.0d, 0.0f);
> 904:     private static final PreparedASCIIToBinaryBuffer A2BC_NEGATIVE_ZERO =
> 905:             new PreparedASCIIToBinaryBuffer(-0.0d, -0.0f);

Suggestion:

    private static final PreparedASCIIToBinaryBuffer 
            A2BC_POSITIVE_INFINITY = new PreparedASCIIToBinaryBuffer(Double.POSITIVE_INFINITY, Float.POSITIVE_INFINITY),
            A2BC_NEGATIVE_INFINITY = new PreparedASCIIToBinaryBuffer(Double.NEGATIVE_INFINITY, Float.NEGATIVE_INFINITY),
            A2BC_NOT_A_NUMBER      = new PreparedASCIIToBinaryBuffer(Double.NaN, Float.NaN),
            A2BC_POSITIVE_ZERO     = new PreparedASCIIToBinaryBuffer(0.0d, 0.0f),
            A2BC_NEGATIVE_ZERO     = new PreparedASCIIToBinaryBuffer(-0.0d, -0.0f);

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/26990#discussion_r2347233355
PR Review Comment: https://git.openjdk.org/jdk/pull/26990#discussion_r2347234167
PR Review Comment: https://git.openjdk.org/jdk/pull/26990#discussion_r2347235787


More information about the core-libs-dev mailing list