RFR: 8205592: BigDecimal.doubleValue() is depressingly slow
Raffaello Giulietti
rgiulietti at openjdk.org
Wed Apr 26 08:16:53 UTC 2023
On Wed, 26 Apr 2023 01:41:09 GMT, Joe Darcy <darcy at openjdk.org> wrote:
>> A reimplementation of `BigDecimal.[double|float]Value()` to enhance performance, avoiding an intermediate string and its subsequent parsing on the slow path.
>
> src/java.base/share/classes/java/math/BigDecimal.java line 308:
>
>> 306: /*
>> 307: * Let l = log_2(10).
>> 308: * Then, L < l < L + ulp(L) / 2, that is, L = roundTiesToEven(l).
>
> It doesn't matter in terms of the code, but shouldn't this be something like:
>
> L - (ulp(L)) < l < L ulp(L)
>
> In other words, without further checking, it isn't clear that L is the lower-bound of the two double value bracketing l.
>
> (If the ulp function being discussed were the real-valued version than L +/- ulp(l) would also be a reasonable formulation.)
While it isn't obvious from the definition, high precision computations reveal that the inequalities `L < l < L + ulp(L) / 2` do indeed hold.
But as noted, this is not really relevant for the rest of the analysis.
> src/java.base/share/classes/java/math/BigDecimal.java line 3777:
>
>> 3775: return 0.0f;
>> 3776: }
>> 3777: BigInteger d = unscaledValue().abs();
>
> I'd prefer a name other than "d" be used for the BigInteger significand's magnitude.
I have no objections as long as it is a 1 letter name that does not conflict with others.
Have you a preferred one?
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/9410#discussion_r1177496610
PR Review Comment: https://git.openjdk.org/jdk/pull/9410#discussion_r1177500421
More information about the core-libs-dev
mailing list