https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87527

            Bug ID: 87527
           Summary: uniform_real_distribution can't generate the full
                    range of finite floating point numbers
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libstdc++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: fergus.henderson at gmail dot com
  Target Milestone: ---

Created attachment 44795
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=44795&action=edit
Example program demonstrating the problem.

std::uniform_real_distribution doesn't work if you try to use it to cover the
whole range of available finite floating point numbers:

    ...
    double low = std::numeric_limits<double>::lowest();
    double high = std::numeric_limits<double>::max();
    std::uniform_real_distribution<> distribution(low, high);
    ... distribution(generator) ...

In that case, rather than returning a random finite float, it always returns
"inf".

The code in include/bits/random.h line 1862
 
https://github.com/gcc-mirror/gcc/blob/140696c847da5f27f6b8b6f321c426c932dd1592/libstdc%2B%2B-v3/include/bits/random.h#L1862
computes
  __p.b() - __p.a()
which in this case ends up being
   std::numeric_limits<double>::max() - std::numeric_limits<double>::lowest()
and that expression overflows to "inf", which then ends up propagating to the
return value from std::uniform_real_distribution<>::operator().

See the attached example program uniform_real.cc for a test case.

  g++ -Wall uniform_real.cc
  ./a.out

Expected behaviour: program runs successfully with no output.
Observed behaviour: 
a.out: uniform_real.cc:13: int main(): Assertion `x >= low && x < high' failed.

Observed with: gcc version 7.3.0 (Debian 7.3.0-5)
and libstdc++.so.6.0.25

Reply via email to