RFR: 8341402: BigDecimal's square root optimization

Raffaello Giulietti rgiulietti at openjdk.org
Wed Oct 2 14:16:34 UTC 2024


On Wed, 2 Oct 2024 10:31:09 GMT, fabioromano1 <duke at openjdk.org> wrote:

> After changing `BigInteger.sqrt()` algorithm, this can be also used to speed up `BigDecimal.sqrt()` implementation. Here is how I made it.
> 
> The main steps of the algorithm are as follows:
> first argument reduce the value to an integer using the following relations:
> 
> x = y * 10 ^ exp
> sqrt(x) = sqrt(y) * 10^(exp / 2) if exp is even
> sqrt(x) = sqrt(y*10) * 10^((exp-1)/2) is exp is odd
> 
> Then use BigInteger.sqrt() on the reduced value to compute the numerical digits of the desired result.
> 
> Finally, scale back to the desired exponent range and perform any adjustment to get the preferred scale in the representation.

Sure, but that does not explain the slow running times.

Naïvely, this takes around 1s for the required precision of 1_000_000 decimal digits.
`new BigDecimal(BigInteger.valueOf(121).multiply(BigInteger.TEN.pow(2_000_000)).sqrt(), 1_000_000).shortValue()`

Of course, this is just a special case.

Do I miss something?

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

PR Comment: https://git.openjdk.org/jdk/pull/21301#issuecomment-2388759527


More information about the core-libs-dev mailing list