On Wed, 1 Jun 2022 22:53:14 GMT, Chris Hennick <d...@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

Reply via email to