From 482e4739cd916f149da266c6a9197f521363697b Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Tue, 15 Aug 2006 15:11:24 +0000 Subject: [PATCH] random (poisson_distribution<>::_M_initialize): Add. 2006-08-15 Paolo Carlini * include/tr1/random (poisson_distribution<>::_M_initialize): Add. (poisson_distribution<>::poisson_distribution(const _RealType&): Use it. (operator>>(std::basic_istream<>&, poisson_distribution<>&)): Likewise. (poisson_distribution<>::_M_large): Remove. * include/tr1/random.tcc (poisson_distribution<>::_M_initialize): Define. (operator<<(std::basic_ostream<>&, const poisson_distribution<>&)): Do not output the constants. * include/tr1/random (operator>>(std::basic_istream<>&, gamma_distribution&)): Minor tweak. * include/tr1/random.tcc (poisson_distribution<>::operator()): Minor tweak. * include/tr1/random: Consistently, all data members private. From-SVN: r116155 --- libstdc++-v3/ChangeLog | 21 +++++++++++ libstdc++-v3/include/tr1/random | 42 ++++++++++++---------- libstdc++-v3/include/tr1/random.tcc | 54 ++++++----------------------- 3 files changed, 56 insertions(+), 61 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 3998b7e1b40..a9556d7a951 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,24 @@ +2006-08-15 Paolo Carlini + + * include/tr1/random (poisson_distribution<>::_M_initialize): Add. + (poisson_distribution<>::poisson_distribution(const _RealType&): + Use it. + (operator>>(std::basic_istream<>&, poisson_distribution<>&)): + Likewise. + (poisson_distribution<>::_M_large): Remove. + * include/tr1/random.tcc (poisson_distribution<>::_M_initialize): + Define. + (operator<<(std::basic_ostream<>&, const poisson_distribution<>&)): + Do not output the constants. + + * include/tr1/random (operator>>(std::basic_istream<>&, + gamma_distribution&)): Minor tweak. + + * include/tr1/random.tcc (poisson_distribution<>::operator()): + Minor tweak. + + * include/tr1/random: Consistently, all data members private. + 2006-08-15 Paolo Carlini * include/tr1/random.tcc (mersenne_twister<>::operator()): Revert diff --git a/libstdc++-v3/include/tr1/random b/libstdc++-v3/include/tr1/random index b9934561c10..ef4390a0610 100644 --- a/libstdc++-v3/include/tr1/random +++ b/libstdc++-v3/include/tr1/random @@ -1556,7 +1556,7 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1) bernoulli_distribution& __x) { return __is >> __x._M_p; } - protected: + private: double _M_p; }; @@ -1643,7 +1643,7 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1) return __is; } - protected: + private: _RealType _M_p; _RealType _M_log_p; }; @@ -1665,12 +1665,6 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1) operator<<(std::basic_ostream<_CharT, _Traits>& __os, const poisson_distribution<_IntType, _RealType>& __x); - template - std::basic_istream<_CharT, _Traits>& - operator>>(std::basic_istream<_CharT, _Traits>& __is, - poisson_distribution<_IntType, _RealType>& __x); - template class poisson_distribution { @@ -1681,7 +1675,12 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1) // constructors and member function explicit - poisson_distribution(const _RealType& __mean = _RealType(1)); + poisson_distribution(const _RealType& __mean = _RealType(1)) + : _M_mean(__mean) + { + _GLIBCXX_DEBUG_ASSERT(_M_mean > 0.0); + _M_initialize(); + } /** * Gets the distribution parameter @p mean. @@ -1722,20 +1721,27 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1) * * @returns The input stream with @p __x extracted or in an error state. */ - template + template friend std::basic_istream<_CharT, _Traits>& operator>>(std::basic_istream<_CharT, _Traits>& __is, - poisson_distribution<_IntType1, _RealType1>& __x); + poisson_distribution& __x) + { + __is >> __x._M_mean; + __x._M_initialize(); + return __is; + } + + private: + void + _M_initialize(); - protected: _RealType _M_mean; - + // _M_lm_thr hosts either log(mean) or the threshold of the simple + // method. _RealType _M_lm_thr; #if _GLIBCXX_USE_C99_MATH_TR1 _RealType _M_lfm, _M_sm, _M_d, _M_scx4, _M_2cx, _M_c2b, _M_cb; #endif - bool _M_large; }; /* @} */ // group tr1_random_distributions_discrete @@ -1834,7 +1840,7 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1) operator>>(std::basic_istream<_CharT, _Traits>& __is, uniform_real<_RealType1>& __x); - protected: + private: _RealType _M_min; _RealType _M_max; }; @@ -2115,10 +2121,10 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1) * * @returns The input stream with @p __x extracted or in an error state. */ - template + template friend std::basic_istream<_CharT, _Traits>& operator>>(std::basic_istream<_CharT, _Traits>& __is, - gamma_distribution<_RealType1>& __x) + gamma_distribution& __x) { return __is >> __x._M_alpha; } private: diff --git a/libstdc++-v3/include/tr1/random.tcc b/libstdc++-v3/include/tr1/random.tcc index 5051a96a14f..abc4d3a3df8 100644 --- a/libstdc++-v3/include/tr1/random.tcc +++ b/libstdc++-v3/include/tr1/random.tcc @@ -656,16 +656,13 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1) template + void poisson_distribution<_IntType, _RealType>:: - poisson_distribution(const _RealType& __mean) - : _M_mean(__mean), _M_large(false) + _M_initialize() { - _GLIBCXX_DEBUG_ASSERT(_M_mean > 0.0); - #if _GLIBCXX_USE_C99_MATH_TR1 if (_M_mean >= 12) { - _M_large = true; const _RealType __m = std::floor(_M_mean); _M_lm_thr = std::log(_M_mean); _M_lfm = std::tr1::lgamma(__m + 1); @@ -708,20 +705,20 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1) operator()(_UniformRandomNumberGenerator& __urng) { #if _GLIBCXX_USE_C99_MATH_TR1 - if (_M_large) + if (_M_mean >= 12) { _RealType __x; const _RealType __m = std::floor(_M_mean); - // sqrt(mu * pi / 2) - const _RealType __c1 = (_M_sm - * 1.2533141373155002512078826424055226L); + // sqrt(pi / 2) + const _RealType __spi_2 = 1.2533141373155002512078826424055226L; + const _RealType __c1 = _M_sm * __spi_2; const _RealType __c2 = _M_c2b + __c1; const _RealType __c3 = __c2 + 1; const _RealType __c4 = __c3 + 1; - // c4 + e^(1 / 78) - const _RealType __c5 = (__c4 - + 1.0129030479320018583185514777512983L); + // e^(1 / 78) + const _RealType __e178 = 1.0129030479320018583185514777512983L; + const _RealType __c5 = __c4 + __e178; const _RealType __c = _M_cb + __c5; const _RealType __cx = 2 * (2 * __m + _M_d); @@ -801,20 +798,11 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1) const std::ios_base::fmtflags __flags = __os.flags(); const _CharT __fill = __os.fill(); const std::streamsize __precision = __os.precision(); - const _CharT __space = __os.widen(' '); __os.flags(std::ios_base::scientific | std::ios_base::left); - __os.fill(__space); + __os.fill(__os.widen(' ')); __os.precision(_Max_digits10<_RealType>::__value); - __os << __x._M_large << __space << __x.mean() - << __space << __x._M_lm_thr; -#if _GLIBCXX_USE_C99_MATH_TR1 - if (__x._M_large) - __os << __space << __x._M_lfm << __space << __x._M_sm - << __space << __x._M_d << __space << __x._M_scx4 - << __space << __x._M_2cx << __space << __x._M_c2b - << __space << __x._M_cb; -#endif + __os << __x.mean(); __os.flags(__flags); __os.fill(__fill); @@ -822,26 +810,6 @@ _GLIBCXX_BEGIN_NAMESPACE(tr1) return __os; } - template - std::basic_istream<_CharT, _Traits>& - operator>>(std::basic_istream<_CharT, _Traits>& __is, - poisson_distribution<_IntType, _RealType>& __x) - { - const std::ios_base::fmtflags __flags = __is.flags(); - __is.flags(std::ios_base::skipws); - - __is >> __x._M_large >> __x._M_mean >> __x._M_lm_thr; -#if _GLIBCXX_USE_C99_MATH_TR1 - if (__x._M_large) - __is >> __x._M_lfm >> __x._M_sm >> __x._M_d >> __x._M_scx4 - >> __x._M_2cx >> __x._M_c2b >> __x._M_cb; -#endif - - __is.flags(__flags); - return __is; - } - template std::basic_ostream<_CharT, _Traits>&