2015-11-04 18 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.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(); 
     } 
    } 
} 

我看到的輸出是:

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

@Hyrkyl我不反對,實際上就像這裏它更可讀,但仍然。 –

回答

0

雖然[rand.dist.uni.real]任務上實數的半開區間均勻分佈的,它不包含任何有關語言這些應該如何四捨五入到浮點表示。

所以從我能找到的信息來看,它可能非常合法(並且要求),以使符合實現產生比較等於上限的浮點數。

+0

我喜歡你的答案,但是,standart說'a <= x