可以std :: uniform_real_distribution <double>(0,1)返回大于0.99999999999999994的值吗?

时间:2015-06-11 01:31:55

标签: c++ c++11 random double double-precision

从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

2 个答案:

答案 0 :(得分:8)

代码中的最大值dist(engine)可以返回std::nextafter(1, 0)。假设double的IEEE-754二进制64格式,此数字为

0.99999999999999988897769753748434595763683319091796875

如果您的编译器将浮点文字舍入到最接近的可表示值,那么这也是您在代码中编写0.99999999999999994时实际获得的值(第二个最接近的可表示值当然是1 })。

答案 1 :(得分:1)

std::uniform_real_distribution<double>(0, 1)必须返回严格小于1.0的值。

但是,对该值执行的操作会受到浮点运算的许多复杂性的影响,包括计算和输出中的舍入误差。