aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@gmail.com>2013-03-04 16:24:58 +0000
committerUlrich Drepper <drepper@gcc.gnu.org>2013-03-04 16:24:58 +0000
commit0388c91350e82bf7ad3738566b7d084a3e5e5691 (patch)
treea8571b02b28ae402687c0df4ce4ec791559ec26b
parent91c4e421067811331f49352160047fa6bf221583 (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--libstdc++-v3/include/ext/random26
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)