RFR: 8284493: Fix rounding error in computeNextExponential [v2]

Chris Hennick duke at openjdk.java.net
Wed Jun 1 22:53:14 UTC 2022


> 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

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

Changes:
  - all: https://git.openjdk.java.net/jdk/pull/8131/files
  - new: https://git.openjdk.java.net/jdk/pull/8131/files/1fd959cc..fa340fb4

Webrevs:
 - full: https://webrevs.openjdk.java.net/?repo=jdk&pr=8131&range=01
 - incr: https://webrevs.openjdk.java.net/?repo=jdk&pr=8131&range=00-01

  Stats: 5 lines in 1 file changed: 2 ins; 0 del; 3 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


More information about the core-libs-dev mailing list