c++ - 为什么 std::uniform_real_distribution::max() 返回独占上限?
问题描述
我问主要是出于学术兴趣。
文档说std::uniform_real_distribution
生成范围内的数字,[a,b)
其中a
和b
是构造函数参数。
由于上限是独占的,我希望.max()
返回小于的最大可表示值.b()
。
但相反,我.b() == .max()
同时使用 GCC、Clang 和 MSVC。(对于float
、double
和long double
。)为什么?
#include <iostream>
#include <iomanip>
#include <random>
int main()
{
auto d = std::uniform_real_distribution<long double>(0, 1);
std::cout << std::setprecision(1000);
std::cout << d.min() << '\n'; // 0
std::cout << d.a() << '\n'; // 0
std::cout << d.max() << '\n'; // 1 <- Here I expect 0.99999...
std::cout << d.b() << '\n'; // 1
}
我发现这个注释说一些常见的实现仅使用[a,b]
范围float
。它可以解释.b() == .max()
,float
但不能解释double
和long double
。
我认为 print 也可能具有教育意义
std::nextafter(d.b(), d.a())
。- 说故事的人
因为long double
它评估为0.9999999999999999999457898913757247782996273599565029144287109375
,这是我期望从中得到的.max()
。
解决方案
我不认为这个错误是关于浮点数的,而是关于浮点数的。
该错误已在 VS-Dev-Community中提到, 其中针对doubles解决了此问题。但是,他们声称自 2021 年 1 月 26 日起将其修复。
附带说明:另外,我无法重现您在 long double 中获得的 max() 值。在所有其他情况下,我得到 1。如前所述,它只是随机噪声,因为 setprecision(n) 似乎会在 n > numeric_limits::max_digits10 时产生噪声。
推荐阅读
- python-3.x - 如何在 python 中重塑矩阵?
- html - 如何在输入中添加 ::before 元素
- r - R中地图包的等价物
- python - 如何将一维数组转换为单列二维数组
- jasper-reports - JRHtmlExporter 现在已弃用 6.15.X jasper。如何定义 IS_USING_IMAGES_TO_ALIGN?
- jquery - jQuery - 动态删除和添加新的轮播项目后,数字应该重新排序
- reactjs - useState 不会在 websocket 回调处理程序中触发重新渲染
- ios - 调用 setVisibleXRangeMaximum 后,条形图未按预期工作
- java - 使用 Regex 在 JSON 对象中查找密码值
- python - 根、画布和矩形的 Tkinter 大小