re PR libstdc++/48114 ([C++0x] binomial_distribution incorrect for p > .5 and geometric_distribution wrongly implements the TR1 definition)

2011-03-14  Andrey Zholos  <aaz@althenia.net>

	PR libstdc++/48114
	* include/bits/random.h (geometric_distribution): Correct formula
	in comment, per C++0x.
	(geometric_distribution<>::param_type::param_type(double)): Fix check.
	(geometric_distribution<>::param_type::_M_initialize):
	Store log(1 - p).
	* include/bits/random.tcc (geometric_distribution<>::operator()):
	Fix computation.
	(binomial_distribution<>::operator()): Likewise.

From-SVN: r170946
This commit is contained in:
Andrey Zholos 2011-03-14 17:57:48 +00:00 committed by Paolo Carlini
parent 7edc478cef
commit d8d4db3345
3 changed files with 20 additions and 8 deletions

View File

@ -1,3 +1,15 @@
2011-03-14 Andrey Zholos <aaz@althenia.net>
PR libstdc++/48114
* include/bits/random.h (geometric_distribution): Correct formula
in comment, per C++0x.
(geometric_distribution<>::param_type::param_type(double)): Fix check.
(geometric_distribution<>::param_type::_M_initialize):
Store log(1 - p).
* include/bits/random.tcc (geometric_distribution<>::operator()):
Fix computation.
(binomial_distribution<>::operator()): Likewise.
2011-03-09 Paolo Carlini <paolo.carlini@oracle.com> 2011-03-09 Paolo Carlini <paolo.carlini@oracle.com>
* testsuite/util/testsuite_rvalref.h: Minor tweaks. * testsuite/util/testsuite_rvalref.h: Minor tweaks.

View File

@ -1,6 +1,6 @@
// random number generation -*- C++ -*- // random number generation -*- C++ -*-
// Copyright (C) 2009, 2010 Free Software Foundation, Inc. // Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc.
// //
// This file is part of the GNU ISO C++ Library. This library is free // This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the // software; you can redistribute it and/or modify it under the
@ -3589,7 +3589,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
* @brief A discrete geometric random number distribution. * @brief A discrete geometric random number distribution.
* *
* The formula for the geometric probability density function is * The formula for the geometric probability density function is
* @f$p(i|p) = (1 - p)p^{i-1}@f$ where @f$p@f$ is the parameter of the * @f$p(i|p) = p(1 - p)^{i}@f$ where @f$p@f$ is the parameter of the
* distribution. * distribution.
*/ */
template<typename _IntType = int> template<typename _IntType = int>
@ -3611,8 +3611,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
param_type(double __p = 0.5) param_type(double __p = 0.5)
: _M_p(__p) : _M_p(__p)
{ {
_GLIBCXX_DEBUG_ASSERT((_M_p >= 0.0) _GLIBCXX_DEBUG_ASSERT((_M_p > 0.0)
&& (_M_p <= 1.0)); && (_M_p < 1.0));
_M_initialize(); _M_initialize();
} }
@ -3627,11 +3627,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
private: private:
void void
_M_initialize() _M_initialize()
{ _M_log_p = std::log(_M_p); } { _M_log_1_p = std::log(1.0 - _M_p); }
double _M_p; double _M_p;
double _M_log_p; double _M_log_1_p;
}; };
// constructors and member function // constructors and member function

View File

@ -1025,7 +1025,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
double __cand; double __cand;
do do
__cand = std::ceil(std::log(__aurng()) / __param._M_log_p); __cand = std::floor(std::log(__aurng()) / __param._M_log_1_p);
while (__cand >= __thr); while (__cand >= __thr);
return result_type(__cand + __naf); return result_type(__cand + __naf);
@ -1434,7 +1434,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ {
result_type __ret; result_type __ret;
const _IntType __t = __param.t(); const _IntType __t = __param.t();
const _IntType __p = __param.p(); const double __p = __param.p();
const double __p12 = __p <= 0.5 ? __p : 1.0 - __p; const double __p12 = __p <= 0.5 ? __p : 1.0 - __p;
__detail::_Adaptor<_UniformRandomNumberGenerator, double> __detail::_Adaptor<_UniformRandomNumberGenerator, double>
__aurng(__urng); __aurng(__urng);