std::uniform_real_distribution<double>(0,1) return 的值可以大于 0.99999999999999994 吗?
Can std::uniform_real_distribution<double>(0,1) return a value greater than 0.99999999999999994?
从 C++11 header 开始,我想知道 std::uniform_real_distribution<double>
object 是否可以输出大于 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
std::uniform_real_distribution<double>(0, 1)
必须 return 一个严格小于 1.0
.
的值
但是,您对该值所做的操作会受到浮点运算的所有复杂性的影响,包括计算和输出中的舍入误差。
您的代码中的最大值 dist(engine)
可以 return 是 std::nextafter(1, 0)
。假设 double
的 IEEE-754 binary64 格式,这个数字是
0.99999999999999988897769753748434595763683319091796875
如果您的编译器将浮点文字舍入到最接近的可表示值,那么这也是您在代码中编写 0.99999999999999994
时实际获得的值(第二个最接近的可表示值当然是 1
).
从 C++11 header 开始,我想知道 std::uniform_real_distribution<double>
object 是否可以输出大于 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
std::uniform_real_distribution<double>(0, 1)
必须 return 一个严格小于 1.0
.
但是,您对该值所做的操作会受到浮点运算的所有复杂性的影响,包括计算和输出中的舍入误差。
您的代码中的最大值 dist(engine)
可以 return 是 std::nextafter(1, 0)
。假设 double
的 IEEE-754 binary64 格式,这个数字是
0.99999999999999988897769753748434595763683319091796875
如果您的编译器将浮点文字舍入到最接近的可表示值,那么这也是您在代码中编写 0.99999999999999994
时实际获得的值(第二个最接近的可表示值当然是 1
).