Hi,

tested x86_64-linux, committed mainline and 4_8-branch.

Thanks,
Paolo.

///////////////////////
2013-06-22  Paolo Carlini  <paolo.carl...@oracle.com>

        PR libstdc++/57674
        * include/bits/random.h (binomial_distribution<>::_M_waiting):
        Add double parameter.
        * include/bits/random.tcc (binomial_distribution<>::operator()
        (_UniformRandomNumberGenerator&, const param_type&)): Pass
        __param._M_q to _M_waiting.
        (_M_waiting): Adjust.
        * testsuite/26_numerics/random/binomial_distribution/
        operators/values.cc: Add tests.
Index: include/bits/random.h
===================================================================
--- include/bits/random.h       (revision 200317)
+++ include/bits/random.h       (working copy)
@@ -3978,7 +3978,8 @@
 
       template<typename _UniformRandomNumberGenerator>
        result_type
-       _M_waiting(_UniformRandomNumberGenerator& __urng, _IntType __t);
+       _M_waiting(_UniformRandomNumberGenerator& __urng,
+                  _IntType __t, double __q);
 
       param_type _M_param;
 
Index: include/bits/random.tcc
===================================================================
--- include/bits/random.tcc     (revision 200317)
+++ include/bits/random.tcc     (working copy)
@@ -1648,7 +1648,8 @@
     template<typename _UniformRandomNumberGenerator>
       typename binomial_distribution<_IntType>::result_type
       binomial_distribution<_IntType>::
-      _M_waiting(_UniformRandomNumberGenerator& __urng, _IntType __t)
+      _M_waiting(_UniformRandomNumberGenerator& __urng,
+                _IntType __t, double __q)
       {
        _IntType __x = 0;
        double __sum = 0.0;
@@ -1663,7 +1664,7 @@
            __sum += __e / (__t - __x);
            __x += 1;
          }
-       while (__sum <= _M_param._M_q);
+       while (__sum <= __q);
 
        return __x - 1;
       }
@@ -1784,12 +1785,13 @@
 
            __x += __np + __naf;
 
-           const _IntType __z = _M_waiting(__urng, __t - _IntType(__x));
+           const _IntType __z = _M_waiting(__urng, __t - _IntType(__x),
+                                           __param._M_q);
            __ret = _IntType(__x) + __z;
          }
        else
 #endif
-         __ret = _M_waiting(__urng, __t);
+         __ret = _M_waiting(__urng, __t, __param._M_q);
 
        if (__p12 != __p)
          __ret = __t - __ret;
Index: testsuite/26_numerics/random/binomial_distribution/operators/values.cc
===================================================================
--- testsuite/26_numerics/random/binomial_distribution/operators/values.cc      
(revision 200317)
+++ testsuite/26_numerics/random/binomial_distribution/operators/values.cc      
(working copy)
@@ -43,6 +43,17 @@
   std::binomial_distribution<> bd3(10, 0.75);
   auto bbd3 = std::bind(bd3, eng);
   testDiscreteDist(bbd3, [](int n) { return binomial_pdf(n, 10, 0.75); } );
+
+  // libstdc++/57674
+  std::binomial_distribution<> bd4(1, 0.8);
+  const std::binomial_distribution<>::param_type pm4(1, 0.3);
+  auto bbd4 = std::bind(bd4, eng, pm4);
+  testDiscreteDist(bbd4, [](int n) { return binomial_pdf(n, 1, 0.3); } );
+
+  std::binomial_distribution<> bd5(100, 0.3);
+  const std::binomial_distribution<>::param_type pm5(100, 0.8);
+  auto bbd5 = std::bind(bd5, eng, pm5);
+  testDiscreteDist(bbd5, [](int n) { return binomial_pdf(n, 100, 0.8); } );
 }
 
 int main()

Reply via email to