代码之家  ›  专栏  ›  技术社区  ›  HolyBlackCat

为什么std::uniform_real_distribution::max()返回独占上限?

c++
  •  9
  • HolyBlackCat  · 技术社区  · 6 年前

    我问这个问题主要是出于学术兴趣。

    这个 documentation 这么说的 std::uniform_real_distribution [a,b) a b 是构造函数参数。

    .max() 返回 最大可表示值小于 .b() .

    但我却得到了 .b() == .max() 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
    }
    

    我发现了 this note 说一些常见的实现用途 [a,b] 范围 浮动 只有。它可以解释 .b()=.max() 对于 浮动 但不是为了 双重的 长双倍


    我想也可以打印出来 std::nextafter(d.b(), d.a()) . 说书人

    为了 它的计算结果是 0.9999999999999999999457898913757247782996273599565029144287109375 ,这正是我希望从中得到的 .max() .

    0 回复  |  直到 6 年前
        1
  •  0
  •   A M    5 年前

    这是一个已知的错误,是实数二进制格式表示的结果。可能存在舍入错误。

    你自己已经给了答案。

    您正在链接到引用。这里,在笔记中,还有一个链接 LWG issue 2524

    这再次链接到 P0952

    请检查结果值。如果为1,则再次调用函数。这将给一个完美分布一个小的统计偏差。但总比通过计算1/(1-r)得到inf并撞毁下一个月球火箭的问题要好。