I want to create a random number within the numeric limits of the double floating point range. I thought this would be easy:
#include <random>
#include <cassert>
#include <math.h>
int main()
{
double a = std::numeric_limits<double>::lowest();
double b = std::numeric_limits<double>::max();
std::default_random_engine engine;
std::uniform_real_distribution<double> dist(a, b);
assert(std::isfinite(dist(engine))); // this triggers!
return 0;
}
The assert fails for both clang 3.8.0 and gcc 5.4.0. I tried using nextafter(a,0) and nextafter(b,0) instead of a and b when constructing dist but got the same result.
According to std::uniform_real_distribution, the methods min and max should be the answer to this question, but apparently that's not the case:
std::cout << dist.min() << ", " << dist.max() << std::endl;
The output of this is:
-1.79769e+308, 1.79769e+308
Again, same result for both compilers. The assert shouldn't be triggering. What's going on?
Aucun commentaire:
Enregistrer un commentaire