On Wed, 6 Apr 2022 17:47:53 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); 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))`).

Should we extract a computeWinsorizedNextExponential that can compute a smaller 
value for line 1216 to compare the output to, so that line 1218 can 
realistically be covered in a unit test? Such a method might even be worth 
exposing in the RandomGenerator interface, in case an approximately exponential 
distribution is ever needed in a hard real-time system.


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

Reply via email to