RFR: 8284493: Fix rounding error in computeNextExponential; use Math.fma(); use bounded version in computeNextGaussian [v2]

Chris Hennick duke at openjdk.java.net
Thu Jun 2 03:05:36 UTC 2022


On Wed, 1 Jun 2022 22:53:14 GMT, Chris Hennick <duke at openjdk.java.net> wrote:

>> Repeatedly adding DoubleZigguratTables.exponentialX0 to extra causes a rounding error to accumulate at the tail of the distribution (probably starting around 2*exponentialX0 == 0x1.e46eff20739afp3 ~ 15.1); this fixes that by tracking the multiple of exponentialX0 as a long. (This changes the maximum possible output to `1.0p63 * DoubleZigguratTables.exponentialX0 == 0x1.e46eff20739afp65`; previously it would have been `0x1.0p56` because once `extra` reaches that amount, `x + extra == extra` due to the rounding error. This lowers the probability of reaching the maximum with an ideal PRNG from about `1.3877787807814488E-17` to about `1.4323726067488646E-20` (calculated using the identity `ln(x) == Math.log10(x)/Math.log10(Math.exp(1))`).
>
> Chris Hennick has refreshed the contents of this pull request, and previous commits have been removed. The incremental views will show differences compared to the previous content of the PR. The pull request contains one new commit since the last revision:
> 
>   Fix rounding error in computeNextExponential; use FMA
>   
>   Repeatedly adding DoubleZigguratTables.exponentialX0 to extra causes a rounding error to accumulate at the tail of the distribution; this fixes that by tracking the multiple of exponentialX0 as a long.
>   
>   Add computeWinsorizedNextExponential for testability

In addition to the changes discussed heretofore, I've also changed line 1382 to eliminate unneeded tail exploration; this should make `nextGaussian` faster at high percentiles (probably measurable at 99%ile; should definitely be measurable at  at 99.99%ile).

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

PR: https://git.openjdk.java.net/jdk/pull/8131


More information about the core-libs-dev mailing list