2015-11-04 3 views
4

Я пытаюсь использовать 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

+1

Не каждый день я вижу программиста C, использующего 'not' вместо'! ';) –

+0

@ Lapshin: Я разделяю мнение о практике. С одной стороны, логики ключевых слов хороши, но, с другой стороны, десятилетие не использования их заставляет их казаться неуместными. – Hurkyl

+0

@ Hurkyl Я не против, на самом деле, как здесь, это более читаемо, но все же. –

ответ

0

Хотя [rand.dist.uni.real] мандатов равномерного распределения на полуоткрытом интервале действительных чисел, он не содержит ни одного языка в отношении как они должны быть округлены до представлений с плавающей запятой.

Таким образом, из информации, которую я мог найти, вполне может быть законным (и требуется) для соответствующей реализации для создания чисел с плавающей запятой, которые сравниваются с верхней границей.

+0

Мне нравится ваш ответ, но, тем не менее, стандарт говорит 'a <= x