re PR libstdc++/55047 (operator() in std::exponential_distribution may call log(0))

2012-11-01   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: r193070
This commit is contained in:
Haakan Younes 2012-11-01 21:09:51 +00:00 committed by Paolo Carlini
parent 8a3094f6fd
commit 7174ef9327
3 changed files with 24 additions and 15 deletions

View File

@ -1,3 +1,11 @@
2012-11-01 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-29 Jonathan Wakely <jwakely.gcc@gmail.com>
PR libstdc++/55123

View File

@ -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
@ -4247,7 +4247,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();
}
private:

View File

@ -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
@ -1053,7 +1053,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);
@ -1258,7 +1258,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;
@ -1290,7 +1290,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);
@ -1434,7 +1434,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;
}
@ -1502,7 +1502,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;
}
@ -1514,15 +1514,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;
@ -1533,8 +1533,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;
@ -2136,7 +2136,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());
}
@ -2194,7 +2194,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, typename _CharT, typename _Traits>