public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [v3] libstdc++/48114
@ 2011-03-14 18:27 Paolo Carlini
  0 siblings, 0 replies; only message in thread
From: Paolo Carlini @ 2011-03-14 18:27 UTC (permalink / raw)
  To: gcc-patches; +Cc: libstdc++

[-- Attachment #1: Type: text/plain, Size: 396 bytes --]

Hi,

a couple of issues with the C++0x <random>, very easy to fix but very 
serious from the user point of view: due to a stupid thinko of mine we 
have been computing the binomial distribution incorrectly for p > 0.5 + 
we had the TR1 != C++0x definition for the geometric_distribution.

Both fixes applied to mainline and 4_6-branch, only the first one to 
4_5-branch.

Paolo.

///////////////

[-- Attachment #2: CL_48114 --]
[-- Type: text/plain, Size: 440 bytes --]

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.

[-- Attachment #3: patch_48114 --]
[-- Type: text/plain, Size: 2085 bytes --]

Index: include/bits/random.tcc
===================================================================
--- include/bits/random.tcc	(revision 170943)
+++ include/bits/random.tcc	(working copy)
@@ -1025,7 +1025,7 @@
 
 	double __cand;
 	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);
 
 	return result_type(__cand + __naf);
@@ -1434,7 +1434,7 @@
       {
 	result_type __ret;
 	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;
 	__detail::_Adaptor<_UniformRandomNumberGenerator, double>
 	  __aurng(__urng);
Index: include/bits/random.h
===================================================================
--- include/bits/random.h	(revision 170943)
+++ include/bits/random.h	(working copy)
@@ -1,6 +1,6 @@
 // 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
 // software; you can redistribute it and/or modify it under the
@@ -3589,7 +3589,7 @@
    * @brief A discrete geometric random number distribution.
    *
    * 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.
    */
   template<typename _IntType = int>
@@ -3611,8 +3611,8 @@
 	param_type(double __p = 0.5)
 	: _M_p(__p)
 	{
-	  _GLIBCXX_DEBUG_ASSERT((_M_p >= 0.0)
-			     && (_M_p <= 1.0));
+	  _GLIBCXX_DEBUG_ASSERT((_M_p > 0.0)
+			     && (_M_p < 1.0));
 	  _M_initialize();
 	}
 
@@ -3627,11 +3627,11 @@
       private:
 	void
 	_M_initialize()
-	{ _M_log_p = std::log(_M_p); }
+	{ _M_log_1_p = std::log(1.0 - _M_p); }
 
 	double _M_p;
 
-	double _M_log_p;
+	double _M_log_1_p;
       };
 
       // constructors and member function

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2011-03-14 18:27 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-03-14 18:27 [v3] libstdc++/48114 Paolo Carlini

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).