RFR: 8341470: BigDecimal.stripTrailingZeros() optimization [v44]

fabioromano1 duke at openjdk.org
Thu Oct 17 13:03:15 UTC 2024


On Thu, 17 Oct 2024 12:38:29 GMT, Raffaello Giulietti <rgiulietti at openjdk.org> wrote:

> The comments are OK. However, there seems to be no explicit relation between the "running" vars used in the reasoning and the expected outcome.
> 
> To clarify what I mean, let v0, z0 and s0 be the initial values at method entry of intVal, z and scale, resp. At the exit of the method, the following is supposed to hold by contract:
> 
> v0 = intVal * 10^z0, s0 = scale + z0.
> 
> At least to me, this is not apparent from the comments.

@rgiulietti Starting from the facts `min(scale - preferredScale, powsOf2) >= remainingZeros` and `remainingZeros >= 2^i`, if `intVal % 5^(2^i) == 0`, then `(intVal * 2^powsOf2) % 10^(2^i) == 0`, so dividing `intVal` by `5^(2^i)` is legit (in the sense that we don't remove powers of 2 and we don't reduce the scale more than allowed) and exactly mimics the division `(intVal * 2^powsOf2) / 10^n` subtracting `2^i` from `powsOf2`. This allows to reduce the initial problem to the new values of the "running" vars after an iteration. So, I don't see the reason why it should not be apparent from the comments onestly...

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

PR Review Comment: https://git.openjdk.org/jdk/pull/21323#discussion_r1804743139


More information about the core-libs-dev mailing list