summaryrefslogtreecommitdiff
path: root/include/random
diff options
context:
space:
mode:
authorMarshall Clow <mclow.lists@gmail.com>2017-05-04 16:36:39 +0000
committerMarshall Clow <mclow.lists@gmail.com>2017-05-04 16:36:39 +0000
commit3320e88ab4c8afe55bf9a71ded2ccc6c2220b8c9 (patch)
treeefac58b454bebb119de98ce06f1eeae4a8f6f49e /include/random
parent49abbf545e0fdb36b4686f4b09c09a41d844c34f (diff)
Use lgamma_r instead of lgamma in binomial_distribution, because freakin' POSIX took a perfectly fine call and made it not thread safe.
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@302168 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/random')
-rw-r--r--include/random12
1 files changed, 8 insertions, 4 deletions
diff --git a/include/random b/include/random
index 83fff90a4..c83db12af 100644
--- a/include/random
+++ b/include/random
@@ -3997,16 +3997,20 @@ public:
{return !(__x == __y);}
};
+extern "C" double lgamma_r(double, int *);
+
template<class _IntType>
-binomial_distribution<_IntType>::param_type::param_type(result_type __t, double __p)
+binomial_distribution<_IntType>::param_type::param_type(const result_type __t, const double __p)
: __t_(__t), __p_(__p)
{
if (0 < __p_ && __p_ < 1)
{
+ int __sign;
__r0_ = static_cast<result_type>((__t_ + 1) * __p_);
- __pr_ = _VSTD::exp(_VSTD::lgamma(__t_ + 1.) - _VSTD::lgamma(__r0_ + 1.) -
- _VSTD::lgamma(__t_ - __r0_ + 1.) + __r0_ * _VSTD::log(__p_) +
- (__t_ - __r0_) * _VSTD::log(1 - __p_));
+ __pr_ = _VSTD::exp(lgamma_r(__t_ + 1., &__sign) -
+ lgamma_r(__r0_ + 1., &__sign) -
+ lgamma_r(__t_ - __r0_ + 1., &__sign) + __r0_ * _VSTD::log(__p_) +
+ (__t_ - __r0_) * _VSTD::log(1 - __p_));
__odds_ratio_ = __p_ / (1 - __p_);
}
}