统一实际分布中的c ++错误?

Mat*_*vid 5 c++ gcc stl clang standard-library

我试图用来std::uniform_real_distribution<float>(a, b)生成随机浮点数,我发现输出等于上限的情况b.根据:http : //www.cplusplus.com/reference/random/uniform_real_distribution http://en.cppreference.com/w/cpp/numeric/random/uniform_real_distribution 这不应该发生.

gcc-4.9.2clang-3.5.0,下面的崩溃对我来说:

#include <iomanip>
#include <iostream>
#include <limits>
#include <random>

int main() {
    float a = 1.0f;
    float b = 1.001f;
    size_t seed = 293846;
    size_t n = 9830;
    std::mt19937 rg(seed);
    std::uniform_real_distribution< float > u(a, b);
    for (size_t i = 0; i < n; ++i) {
        float v = u(rg);
        if (not (v < b)) {
            std::cerr << "error: i=" << i
                      << " v=" << std::scientific << std::setprecision(std::numeric_limits< double >::max_digits10) << v
                      << " b=" << b << std::endl;
            abort();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我看到的输出是:

error: i=9829 v=1.00100004673004150e+00 b=1.00100004673004150e+00
Aborted (core dumped)
Run Code Online (Sandbox Code Playgroud)

这是标准库的错误吗?我错过了什么吗?

编辑.虽然不完全相同,但在这个问题中提出的问题确实涵盖了这里引用的另一个问题的答案.

关于这个问题的最新信息是这里的LLVM错误线程:https://llvm.org/bugs/show_bug.cgi?id = 18767

小智 0

虽然要求实数[rand.dist.uni.real]的半开区间均匀分布,但它不包含任何关于如何将它们舍入为浮点表示的语言。

因此,从我能找到的信息来看,对于一致的实现来说,生成比较等于上限的浮点数很可能是合法的(并且是必需的)。

  • 我喜欢你的答案,但是标准仍然说“a &lt;= x &lt; b”,这部分让我无法同意你的观点...... (2认同)