diff options
author | Ulrich Drepper <drepper@gmail.com> | 2013-03-04 16:24:58 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@gcc.gnu.org> | 2013-03-04 16:24:58 +0000 |
commit | 0388c91350e82bf7ad3738566b7d084a3e5e5691 (patch) | |
tree | a8571b02b28ae402687c0df4ce4ec791559ec26b | |
parent | 91c4e421067811331f49352160047fa6bf221583 (diff) | |
download | gcc-0388c91350e82bf7ad3738566b7d084a3e5e5691.zip gcc-0388c91350e82bf7ad3738566b7d084a3e5e5691.tar.gz gcc-0388c91350e82bf7ad3738566b7d084a3e5e5691.tar.bz2 |
Fix and optimize von_mises_distribution class.
From-SVN: r196436
-rw-r--r-- | libstdc++-v3/ChangeLog | 7 | ||||
-rw-r--r-- | libstdc++-v3/include/ext/random | 26 |
2 files changed, 20 insertions, 13 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index cbba5e2..4068530 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,10 @@ +2013-03-04 Ulrich Drepper <drepper@gmail.com> + + * include/ext/random (__gnu_cxx::von_mises_distribution<>): + Optimize generation function by pulling computation of __r into the + constructor for param_type. Also compare _M_mu in operator==. + Fix comment. + 2013-03-02 Ulrich Drepper <drepper@gmail.com> Add triangular and von Mises distributions. diff --git a/libstdc++-v3/include/ext/random b/libstdc++-v3/include/ext/random index 51d332b..7af3130 100644 --- a/libstdc++-v3/include/ext/random +++ b/libstdc++-v3/include/ext/random @@ -2621,6 +2621,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION const _RealType __pi = __gnu_cxx::__math_constants<_RealType>::__pi; _GLIBCXX_DEBUG_ASSERT(_M_mu >= -__pi && _M_mu <= __pi); _GLIBCXX_DEBUG_ASSERT(_M_kappa >= _RealType(0)); + + auto __tau = std::sqrt(_RealType(4) * _M_kappa * _M_kappa + + _RealType(1)) + _RealType(1); + auto __rho = ((__tau - std::sqrt(_RealType(2) * __tau)) + / (_RealType(2) * _M_kappa)); + _M_r = (_RealType(1) + __rho * __rho) / (_RealType(2) * __rho); } _RealType @@ -2633,16 +2639,17 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION friend bool operator==(const param_type& __p1, const param_type& __p2) - { return __p1._M_kappa == __p2._M_kappa; } + { return (__p1._M_mu == __p2._M_mu + && __p1._M_kappa == __p2._M_kappa); } private: - _RealType _M_mu; _RealType _M_kappa; + _RealType _M_r; }; /** - * @brief Constructs a beta distribution with parameters + * @brief Constructs a von Mises distribution with parameters * @f$\mu@f$ and @f$\kappa@f$. */ explicit @@ -2727,20 +2734,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION = __gnu_cxx::__math_constants<result_type>::__pi; std::__detail::_Adaptor<_UniformRandomNumberGenerator, result_type> __aurng(__urng); - result_type __tau = (std::sqrt(result_type(4) * this->kappa() - * this->kappa() + result_type(1)) - + result_type(1)); - result_type __rho = ((__tau - std::sqrt(result_type(2) * __tau)) - / (result_type(2) * this->kappa())); - result_type __r = ((result_type(1) + __rho * __rho) - / (result_type(2) * __rho)); result_type __f; while (1) { result_type __rnd = std::cos(__pi * __aurng()); - __f = (result_type(1) + __r * __rnd) / (__r + __rnd); - result_type __c = this->kappa() * (__r - __f); + __f = (result_type(1) + __p._M_r * __rnd) / (__p._M_r + __rnd); + result_type __c = __p._M_kappa * (__p._M_r - __f); result_type __rnd2 = __aurng(); if (__c * (result_type(2) - __c) > __rnd2) @@ -2756,7 +2756,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION if (__aurng() < result_type(0.5)) __res = -__res; #endif - __res += this->mu(); + __res += __p._M_mu; if (__res > __pi) __res -= result_type(2) * __pi; else if (__res < -__pi) |