From the C++11 header , I was wondering if a std::uniform_real_distribution<double>
object can spit out a double that's greater than 0.99999999999999994? If so, multiplying this value by 2 would equal 2.
Example:
std::default_random_engine engine;
std::uniform_real_distribution<double> dist(0,1);
double num = dist(engine);
if (num > 0.99999999999999994)
num = 0.99999999999999994;
int test1 = (int)(0.99999999999999994 * 2);
int test2 = (int)(0.99999999999999995 * 2);
std::cout << test1 << std::endl; // 1
std::cout << test2 << std::endl; // 2
The maximum value dist(engine)
in your code can return is std::nextafter(1, 0)
. Assuming IEEE-754 binary64 format for double
, this number is
0.99999999999999988897769753748434595763683319091796875
If your compiler rounds floating point literals to the nearest representable value, then this is also the value you actually get when you write 0.99999999999999994
in code (the second nearest representable value is, of course, 1
).