diff options
author | Haakan Younes <hyounes@google.com> | 2012-10-24 12:20:19 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2012-10-24 12:20:19 +0000 |
commit | c2d9083df222456f5d0f15d5a6ceca7a97ded8b9 (patch) | |
tree | 0c8ee68c0703de1fab83e2d0e6acb422847fc01e /libstdc++-v3 | |
parent | c6c084858c967229e5366b7e1ee45820e7e3ba4d (diff) | |
download | gcc-c2d9083df222456f5d0f15d5a6ceca7a97ded8b9.zip gcc-c2d9083df222456f5d0f15d5a6ceca7a97ded8b9.tar.gz gcc-c2d9083df222456f5d0f15d5a6ceca7a97ded8b9.tar.bz2 |
re PR libstdc++/55047 (operator() in std::exponential_distribution may call log(0))
2012-10-24 Haakan Younes <hyounes@google.com>
Paolo Carlini <paolo.carlini@oracle.com>
PR libstdc++/55047
* include/bits/random.h (exponential_distribution<>::operator):
Fix formula to std::log(result_type(1) - __aurng()).
* include/bits/random.tcc: Likewise, everywhere.
Co-Authored-By: Paolo Carlini <paolo.carlini@oracle.com>
From-SVN: r192762
Diffstat (limited to 'libstdc++-v3')
-rw-r--r-- | libstdc++-v3/ChangeLog | 8 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/random.h | 4 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/random.tcc | 40 |
3 files changed, 32 insertions, 20 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index d837164..0c8061f 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,11 @@ +2012-10-24 Haakan Younes <hyounes@google.com> + Paolo Carlini <paolo.carlini@oracle.com> + + PR libstdc++/55047 + * include/bits/random.h (exponential_distribution<>::operator): + Fix formula to std::log(result_type(1) - __aurng()). + * include/bits/random.tcc: Likewise, everywhere. + 2012-10-23 Yufeng Zhang <yufeng.zhang@arm.com> * config/cpu/aarch64/cxxabi_tweaks.h: New file. diff --git a/libstdc++-v3/include/bits/random.h b/libstdc++-v3/include/bits/random.h index 3db6916..f31f553 100644 --- a/libstdc++-v3/include/bits/random.h +++ b/libstdc++-v3/include/bits/random.h @@ -1,6 +1,6 @@ // random number generation -*- C++ -*- -// Copyright (C) 2009, 2010, 2011, 2012 Free Software Foundation, Inc. +// Copyright (C) 2009-2012 Free Software Foundation, Inc. // // 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 @@ -4748,7 +4748,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { __detail::_Adaptor<_UniformRandomNumberGenerator, result_type> __aurng(__urng); - return -std::log(__aurng()) / __p.lambda(); + return -std::log(result_type(1) - __aurng()) / __p.lambda(); } template<typename _ForwardIterator, diff --git a/libstdc++-v3/include/bits/random.tcc b/libstdc++-v3/include/bits/random.tcc index 463b965..f2edc3e 100644 --- a/libstdc++-v3/include/bits/random.tcc +++ b/libstdc++-v3/include/bits/random.tcc @@ -1,6 +1,6 @@ // random number generation (out of line) -*- C++ -*- -// Copyright (C) 2009, 2010, 2011, 2012 Free Software Foundation, Inc. +// Copyright (C) 2009-2012 Free Software Foundation, Inc. // // 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 @@ -1187,7 +1187,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION double __cand; do - __cand = std::floor(std::log(__aurng()) / __param._M_log_1_p); + __cand = std::floor(std::log(1.0 - __aurng()) / __param._M_log_1_p); while (__cand >= __thr); return result_type(__cand + __naf); @@ -1217,7 +1217,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { double __cand; do - __cand = std::floor(std::log(__aurng()) / __param._M_log_1_p); + __cand = std::floor(std::log(1.0 - __aurng()) + / __param._M_log_1_p); while (__cand >= __thr); *__f++ = __cand + __naf; @@ -1464,7 +1465,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION do { const double __u = __c * __aurng(); - const double __e = -std::log(__aurng()); + const double __e = -std::log(1.0 - __aurng()); double __w = 0.0; @@ -1496,7 +1497,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __x = 1; else { - const double __v = -std::log(__aurng()); + const double __v = -std::log(1.0 - __aurng()); const double __y = __param._M_d + __v * __2cx / __param._M_d; __x = std::ceil(__y); @@ -1655,7 +1656,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION do { - const double __e = -std::log(__aurng()); + const double __e = -std::log(1.0 - __aurng()); __sum += __e / (__t - __x); __x += 1; } @@ -1723,7 +1724,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __reject = __y >= __param._M_d1; if (!__reject) { - const double __e = -std::log(__aurng()); + const double __e = -std::log(1.0 - __aurng()); __x = std::floor(__y); __v = -__e - __n * __n / 2 + __param._M_c; } @@ -1735,15 +1736,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __reject = __y >= __param._M_d2; if (!__reject) { - const double __e = -std::log(__aurng()); + const double __e = -std::log(1.0 - __aurng()); __x = std::floor(-__y); __v = -__e - __n * __n / 2; } } else if (__u <= __a123) { - const double __e1 = -std::log(__aurng()); - const double __e2 = -std::log(__aurng()); + const double __e1 = -std::log(1.0 - __aurng()); + const double __e2 = -std::log(1.0 - __aurng()); const double __y = __param._M_d1 + 2 * __s1s * __e1 / __param._M_d1; @@ -1754,8 +1755,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION } else { - const double __e1 = -std::log(__aurng()); - const double __e2 = -std::log(__aurng()); + const double __e1 = -std::log(1.0 - __aurng()); + const double __e2 = -std::log(1.0 - __aurng()); const double __y = __param._M_d2 + 2 * __s2s * __e1 / __param._M_d2; @@ -1869,7 +1870,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __detail::_Adaptor<_UniformRandomNumberGenerator, result_type> __aurng(__urng); while (__f != __t) - *__f++ = -std::log(__aurng()) / __p.lambda(); + *__f++ = -std::log(result_type(1) - __aurng()) / __p.lambda(); } template<typename _RealType, typename _CharT, typename _Traits> @@ -2628,7 +2629,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { __detail::_Adaptor<_UniformRandomNumberGenerator, result_type> __aurng(__urng); - return __p.b() * std::pow(-std::log(__aurng()), + return __p.b() * std::pow(-std::log(result_type(1) - __aurng()), result_type(1) / __p.a()); } @@ -2644,10 +2645,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __glibcxx_function_requires(_ForwardIteratorConcept<_ForwardIterator>) __detail::_Adaptor<_UniformRandomNumberGenerator, result_type> __aurng(__urng); - auto inv_a = result_type(1) / __p.a(); + auto __inv_a = result_type(1) / __p.a(); while (__f != __t) - *__f++ = __p.b() * std::pow(-std::log(__aurng()), inv_a); + *__f++ = __p.b() * std::pow(-std::log(result_type(1) - __aurng()), + __inv_a); } template<typename _RealType, typename _CharT, typename _Traits> @@ -2704,7 +2706,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION { __detail::_Adaptor<_UniformRandomNumberGenerator, result_type> __aurng(__urng); - return __p.a() - __p.b() * std::log(-std::log(__aurng())); + return __p.a() - __p.b() * std::log(-std::log(result_type(1) + - __aurng())); } template<typename _RealType> @@ -2721,7 +2724,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION __aurng(__urng); while (__f != __t) - *__f++ = __p.a() - __p.b() * std::log(-std::log(__aurng())); + *__f++ = __p.a() - __p.b() * std::log(-std::log(result_type(1) + - __aurng())); } template<typename _RealType, typename _CharT, typename _Traits> |