Я пытаюсь использовать 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 этого не должно быть.ошибка C++ в равномерном реальном распространении?
С обеих gcc-4.9.2
и clang-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();
}
}
}
Выход я вижу:
error: i=9829 v=1.00100004673004150e+00 b=1.00100004673004150e+00
Aborted (core dumped)
Является ли это ошибка стандартной библиотеки? Я что-то упускаю?
Редактировать. Хотя это не точный дубликат, вопрос, поднятый в этом вопросе, действительно покрывается ответом на другой вопрос, упомянутый здесь.
Наиболее информативный о состоянии этого вопроса является LLVM ошибки нити здесь: https://llvm.org/bugs/show_bug.cgi?id=18767
Не каждый день я вижу программиста C, использующего 'not' вместо'! ';) –
@ Lapshin: Я разделяю мнение о практике. С одной стороны, логики ключевых слов хороши, но, с другой стороны, десятилетие не использования их заставляет их казаться неуместными. – Hurkyl
@ Hurkyl Я не против, на самом деле, как здесь, это более читаемо, но все же. –