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))`).

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

Commit messages:
 - Fix rounding error in computeNextExponential; use FMA

Changes: https://git.openjdk.java.net/jdk/pull/8131/files
 Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=8131&range=00
  Issue: https://bugs.openjdk.java.net/browse/JDK-8284493
  Stats: 43 lines in 1 file changed: 33 ins; 1 del; 9 mod
  Patch: https://git.openjdk.java.net/jdk/pull/8131.diff
  Fetch: git fetch https://git.openjdk.java.net/jdk pull/8131/head:pull/8131

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

Reply via email to