sta*_*pax 4 c++ random double double-precision c++11
从C++ 11标题,我想知道一个std::uniform_real_distribution<double>对象是否可以吐出一个大于0.99999999999999994的双精度?如果是这样,将该值乘以2将等于2.
例:
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
Run Code Online (Sandbox Code Playgroud)
dist(engine)代码中的最大值可以返回std::nextafter(1, 0).假设为IEEE-754二进制64格式double,这个数字是
0.99999999999999988897769753748434595763683319091796875
Run Code Online (Sandbox Code Playgroud)
如果您的编译器将浮点文字舍入到最接近的可表示值,那么这也是您0.99999999999999994在代码中写入时实际获得的值(当然,第二个最接近的可表示值1).