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
This commit is contained in:
@@ -3997,16 +3997,20 @@ public:
|
|||||||
{return !(__x == __y);}
|
{return !(__x == __y);}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
extern "C" double lgamma_r(double, int *);
|
||||||
|
|
||||||
template<class _IntType>
|
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)
|
: __t_(__t), __p_(__p)
|
||||||
{
|
{
|
||||||
if (0 < __p_ && __p_ < 1)
|
if (0 < __p_ && __p_ < 1)
|
||||||
{
|
{
|
||||||
|
int __sign;
|
||||||
__r0_ = static_cast<result_type>((__t_ + 1) * __p_);
|
__r0_ = static_cast<result_type>((__t_ + 1) * __p_);
|
||||||
__pr_ = _VSTD::exp(_VSTD::lgamma(__t_ + 1.) - _VSTD::lgamma(__r0_ + 1.) -
|
__pr_ = _VSTD::exp(lgamma_r(__t_ + 1., &__sign) -
|
||||||
_VSTD::lgamma(__t_ - __r0_ + 1.) + __r0_ * _VSTD::log(__p_) +
|
lgamma_r(__r0_ + 1., &__sign) -
|
||||||
(__t_ - __r0_) * _VSTD::log(1 - __p_));
|
lgamma_r(__t_ - __r0_ + 1., &__sign) + __r0_ * _VSTD::log(__p_) +
|
||||||
|
(__t_ - __r0_) * _VSTD::log(1 - __p_));
|
||||||
__odds_ratio_ = __p_ / (1 - __p_);
|
__odds_ratio_ = __p_ / (1 - __p_);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user