random.tcc(GCC 6.1.0)中的无限循环(可能是犰狳中的错误)

时间:2016-07-13 11:40:48

标签: c++11 gcc random armadillo libstdc++

我发现GCC 6.1.0中的C ++ 11随机数生成器导致代码卡在Mac OS X 10.11.5中,一个简单的代码片段如下:

#include <iostream>
#include <armadillo>

using namespace std;
using namespace arma;

int main(int argc, char const* argv[])
{
    cout << "check 1" << endl;
    cout << arma_rng::randn<double>() << endl;
    cout << "check 2" << endl;
    return 0;
}

我使用lldb调试了此代码,并将可疑部分锁定在random.tcc的{​​{1}}文件中:

libstdc++

其中/** * Polar method due to Marsaglia. * * Devroye, L. Non-Uniform Random Variates Generation. Springer-Verlag, * New York, 1986, Ch. V, Sect. 4.4. */ template<typename _RealType> template<typename _UniformRandomNumberGenerator> typename normal_distribution<_RealType>::result_type normal_distribution<_RealType>:: operator()(_UniformRandomNumberGenerator& __urng, const param_type& __param) { result_type __ret; __detail::_Adaptor<_UniformRandomNumberGenerator, result_type> __aurng(__urng); if (_M_saved_available) { _M_saved_available = false; __ret = _M_saved; } else { result_type __x, __y, __r2; do { __x = result_type(2.0) * __aurng() - 1.0; __y = result_type(2.0) * __aurng() - 1.0; __r2 = __x * __x + __y * __y; } while (__r2 > 1.0 || __r2 == 0.0); const result_type __mult = std::sqrt(-2 * std::log(__r2) / __r2); _M_saved = __x * __mult; _M_saved_available = true; __ret = __y * __mult; } __ret = __ret * __param.stddev() + __param.mean(); return __ret; } 始终返回0,因此永远不会遇到__aurng()

更新:

我发现它可能是Armadillo库中的一个错误,因为我尝试了以下代码,这是正常的:

__r2 > 1.0 || __r2 == 0.0

0 个答案:

没有答案