You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Alex D Herbert (JIRA)" <ji...@apache.org> on 2019/03/04 00:14:00 UTC

[jira] [Created] (RNG-79) Benchmark methods for producing nextDouble

Alex D Herbert created RNG-79:
---------------------------------

             Summary: Benchmark methods for producing nextDouble
                 Key: RNG-79
                 URL: https://issues.apache.org/jira/browse/RNG-79
             Project: Commons RNG
          Issue Type: Task
          Components: core
    Affects Versions: 1.3
            Reporter: Alex D Herbert
            Assignee: Alex D Herbert


Benchmark the speed of methods for producing a {{double}} from a {{long}}:
{code:java}
long v;

double d1 = Double.longBitsToDouble(0x3FFL << 52 | v >>> 12) - 1.0;
double d2 = (v >>> 12) * 0x1.0p-52d; // 1.0 / (1L << 52);
double d3 = (v >>> 11) * 0x1.0p-53d; // 1.0 / (1L << 53);
{code}
Method d1 and d2 are both currently employed in the {{NumberFactory}} (makeDouble(int,int) and makeDouble(long)). However they suffer from producing a double whose least significant bit is always 0, i.e. they produce half of all possible double values from 0-1. This is discussed in the reference for the [XorShiRo generators|http://xoshiro.di.unimi.it/].

This task will benchmark the methods using JMH. A switch to method d3 may be appropriate as it generates more values. This is the method employed in JDK 1.7 ThreadLocalRandom.

A similar analysis can be made for producing a float:
{code:java}
int v;

double f1 = ...; // TBC if a float equivalent is valid?
double f2 = (v >>> 9) * 0x1.0p-23f; // 1.0f / (1 << 23);
double f3 = (v >>> 8) * 0x1.0p-24f; // 1.0f / (1 << 24)
{code}
Method f2 is currently used in the {{NumberFactory}}.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)