On Thu, 10 Oct 2024 20:36:26 GMT, fabioromano1 <[email protected]> wrote:
>> An optimized algorithm for `BigDecimal.stripTrailingZeros()` that uses
>> repeated squares trick.
>
> fabioromano1 has updated the pull request incrementally with one additional
> commit since the last revision:
>
> Refining mathematical definition of remainingZeros
src/java.base/share/classes/java/math/BigDecimal.java line 5221:
> 5219: * {@code FIVE_TO_2_TO[n] == 5^(2^n)}
> 5220: */
> 5221: private static final BigInteger[] FIVE_TO_2_TO = new BigInteger[20];
As discussed before, the benchmarks show no significant performance regressions
even for a million of trailing zeros if this cache is reduced to save resident
memory footprint.
Suggestion:
private static final BigInteger[] FIVE_TO_2_TO = new BigInteger[16 + 1];
src/java.base/share/classes/java/math/BigDecimal.java line 5259:
> 5257: preferredScale = Math.clamp(preferredScale, Integer.MIN_VALUE -
> 1L, Integer.MAX_VALUE);
> 5258: int powsOf2 = intVal.getLowestSetBit();
> 5259: // scale - preferredScale >= remainingZeros >= max{n : (intVal
> % 10^n) == 0 && scale - n >= preferredScale}
Suggestion:
// scale - preferredScale >= remainingZeros >= max{n : (intVal % 10^n)
== 0 && n <= scale - preferredScale}
is clearer IMO.
src/java.base/share/classes/java/math/BigDecimal.java line 5274:
> 5272: remainingZeros = Math.min(remainingZeros, maxPowsOf5);
> 5273:
> 5274: BigInteger[] qr; // quotient-remainder pair
The algorithm is clever, but it took me some time to "reverse-engineer" to
understand how it works.
If this is described somewhere in the literature, please add a reference.
Otherwise, it needs an explanation in form of comments.
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/21323#discussion_r1797255797
PR Review Comment: https://git.openjdk.org/jdk/pull/21323#discussion_r1797255851
PR Review Comment: https://git.openjdk.org/jdk/pull/21323#discussion_r1797256459