Jonathan Wakely <jwak...@redhat.com> writes:

> On 23/07/14 11:58 +0200, Marc Glisse wrote:
> As an aside, we already have divide-by-zero bugs in <ext/random>, it
> would be nice if someone could look at that.
>
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60037

Sorry, it took a while to get back to tihs and now the referenced bug is
already fixed.  Good.  Now also for a fix of the sphere distribution.
Unless someone objects I'll check in the patch below.


2014-08-08  Ulrich Drepper  <drep...@gmail.com>

        * include/ext/random.tcc
        (uniform_on_sphere_distribution::__generate_impl): Reject
        vectors with norm zero.


diff --git a/libstdc++-v3/include/ext/random.tcc 
b/libstdc++-v3/include/ext/random.tcc
index 05361d8..d1f0b9c 100644
--- a/libstdc++-v3/include/ext/random.tcc
+++ b/libstdc++-v3/include/ext/random.tcc
@@ -1548,13 +1548,21 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
                 const param_type& __p)
       {
        result_type __ret;
-       _RealType __sum = _RealType(0);
+       _RealType __norm;
+
+       do
+         {
+           _RealType __sum = _RealType(0);
+
+           std::generate(__ret.begin(), __ret.end(),
+                         [&__urng, &__sum, this](){
+                           _RealType __t = _M_nd(__urng);
+                           __sum += __t * __t;
+                           return __t; });
+           __norm = std::sqrt(__sum);
+         }
+       while (__norm == _RealType(0));
 
-       std::generate(__ret.begin(), __ret.end(),
-                     [&__urng, &__sum, this](){ _RealType __t = _M_nd(__urng);
-                                                __sum += __t * __t;
-                                                return __t; });
-       auto __norm = std::sqrt(__sum);
        std::transform(__ret.begin(), __ret.end(), __ret.begin(),
                       [__norm](_RealType __val){ return __val / __norm; });
 

Reply via email to