Re: [Boost-bugs] [Boost C++ Libraries] #10364: Release 1.56 broke random::uniform_real_distribution

Subject: Re: [Boost-bugs] [Boost C++ Libraries] #10364: Release 1.56 broke random::uniform_real_distribution
From: Boost C++ Libraries (noreply_at_[hidden])
Date: 2016-02-17 03:52:26


#10364: Release 1.56 broke random::uniform_real_distribution
-------------------------------+---------------------------
  Reporter: mouse008@… | Owner: no-maintainer
      Type: Bugs | Status: new
 Milestone: To Be Determined | Component: random
   Version: Boost 1.56.0 | Severity: Regression
Resolution: | Keywords:
-------------------------------+---------------------------

Comment (by Mouse <mouse008@…>):

> The example code is wrong (It's been updated in the docs for 1.60).

 Here's what I used to guide me:

 Boost-1.54 tutorial:
 [http://www.boost.org/doc/libs/1_54_0/libs/multiprecision/doc/html/boost_multiprecision/tut/random.html]


 Now the Boost-1.60 tutorial:
 [http://www.boost.org/doc/libs/1_60_0/libs/multiprecision/doc/html/boost_multiprecision/tut/random.html]
 suggests using `cpp_bin_float_50` instead of `mpf_float_50`, and
 `independent_bits_engine`. But it is unclear in this example how to
 specify a certain number of digits or bits for
 `uniform_real_distribution<cpp_bin_float_50>` that uses
 `independent_bits_engine<nt19937, ...>`. Perhaps you could point me at a
 description/tutorial?

 Thanks!


 P.S. I tried to replicate the last example from the above 1.60 tutorial,
 and here's the result. Am I doing something obviously wrong? This is with
 Boost-1.59.

 {{{
 #include <boost/multiprecision/cpp_bin_float.hpp>
 #include <boost/multiprecision/cpp_int.hpp>
 #include <boost/random.hpp>

 int main()
 {
    using namespace boost::multiprecision;
    using namespace boost::random;
    //
    // Generate some distruted values:
    //
    uniform_real_distribution<cpp_bin_float_50> ur(-20, 20);
    gamma_distribution<cpp_bin_float_50> gd(20);
    independent_bits_engine<mt19937,
 std::numeric_limits<cpp_bin_float_50>::digits, cpp_int> gen;
    //
    // Generate some values:
    //
    std::cout << std::setprecision(50);
    std::cout << "uniform_real_distribution<cpp_bin_float_50> ur(-20, 20):"
 << std::endl;
    for(unsigned i = 0; i < 20; ++i)
      std::cout << (i+1) << ": " << ur(gen) << std::endl;
    std::cout << std::endl;
    std::cout << "gamma_distribution<cpp_bin_float_50> gd(20):" <<
 std::endl;
    for(unsigned i = 0; i < 20; ++i)
      std::cout << (i+1) << ": " << gd(gen) << std::endl;
    std::cout << std::endl;
    return 0;
 }
 }}}


 {{{
 $ make b-r6b
 clang++-mp-3.7 -maes -mpclmul -mrdrnd -msse2 -mssse3 -msse4.2
 -mtune=native -Os -Ofast -std=c++11 -fPIC -m64 -msse4.2
 -I/opt/local/include -Wno-comment -c b-r6b.cpp
 In file included from b-r6b.cpp:1:
 In file included from
 /opt/local/include/boost/multiprecision/cpp_bin_float.hpp:9:
 In file included from
 /opt/local/include/boost/multiprecision/cpp_int.hpp:12:
 In file included from
 /opt/local/include/boost/multiprecision/number.hpp:22:
 In file included from
 /opt/local/include/boost/multiprecision/detail/generic_interconvert.hpp:9:
 In file included from
 /opt/local/include/boost/multiprecision/detail/default_ops.hpp:10:
 In file included from
 /opt/local/include/boost/multiprecision/detail/number_base.hpp:17:
 In file included from /opt/local/include/boost/lexical_cast.hpp:32:
 In file included from
 /opt/local/include/boost/lexical_cast/try_lexical_convert.hpp:35:
 In file included from
 /opt/local/include/boost/lexical_cast/detail/converter_lexical.hpp:54:
 In file included from
 /opt/local/include/boost/lexical_cast/detail/converter_lexical_streams.hpp:77:
 /opt/local/include/boost/integer.hpp:138:6: error: static_assert failed
 "No suitable
       unsigned integer type with the requested number of bits is
 available."
      BOOST_STATIC_ASSERT_MSG(Bits <= (int)(sizeof(boost::uintmax_t) *
 CHAR_BIT),
 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 /opt/local/include/boost/static_assert.hpp:31:45: note: expanded from
 macro
       'BOOST_STATIC_ASSERT_MSG'
 # define BOOST_STATIC_ASSERT_MSG( ... ) static_assert(__VA_ARGS__)
                                             ^ ~~~~~~~~~~~
 /opt/local/include/boost/integer/integer_mask.hpp:63:22: note: in
 instantiation of
       template class 'boost::uint_t<168>' requested here
     typedef typename uint_t<Bits>::least least;
                      ^
 /opt/local/include/boost/random/independent_bits.hpp:58:21: note: in
 instantiation
       of template class 'boost::low_bits_mask_t<168>' requested here
     { return boost::low_bits_mask_t<w>::sig_bits; }
                     ^
 /opt/local/include/boost/random/uniform_real_distribution.hpp:41:51: note:
 in
       instantiation of member function
 'boost::random::independent_bits_engine<boost::random::mersenne_twister_engine<unsigned
       int, 32, 624, 397, 31, 2567483615, 11, 4294967295, 7, 2636928640,
 15,
       4022730752, 18, 1812433253>, 168,
 boost::multiprecision::number<boost::multiprecision::backends::cpp_int_backend<0,
       0, boost::multiprecision::cpp_integer_type::signed_magnitude,
       boost::multiprecision::cpp_int_check_type::unchecked,
       std::__1::allocator<unsigned long long> >,
       boost::multiprecision::expression_template_option::et_on> >::max'
 requested
       here
         result_type divisor = static_cast<T>((eng.max)() - (eng.min)());
                                                   ^
 /opt/local/include/boost/random/uniform_real_distribution.hpp:72:12: note:
 in
       instantiation of function template specialization
 'boost::random::detail::generate_uniform_real<boost::random::independent_bits_engine<boost::random::mersenne_twister_engine<unsigned
       int, 32, 624, 397, 31, 2567483615, 11, 4294967295, 7, 2636928640,
 15,
       4022730752, 18, 1812433253>, 168,
 boost::multiprecision::number<boost::multiprecision::backends::cpp_int_backend<0,
       0, boost::multiprecision::cpp_integer_type::signed_magnitude,
       boost::multiprecision::cpp_int_check_type::unchecked,
       std::__1::allocator<unsigned long long> >,
       boost::multiprecision::expression_template_option::et_on> >,
 boost::multiprecision::number<boost::multiprecision::backends::cpp_bin_float<50,
       boost::multiprecision::backends::digit_base_type::digit_base_10,
 void, int, 0,
       0>, boost::multiprecision::expression_template_option::et_off> >'
 requested
       here
     return generate_uniform_real(eng, min_value, max_value,
            ^
 /opt/local/include/boost/random/uniform_real_distribution.hpp:193:22:
 note: in
       instantiation of function template specialization
 'boost::random::detail::generate_uniform_real<boost::random::independent_bits_engine<boost::random::mersenne_twister_engine<unsigned
       int, 32, 624, 397, 31, 2567483615, 11, 4294967295, 7, 2636928640,
 15,
       4022730752, 18, 1812433253>, 168,
 boost::multiprecision::number<boost::multiprecision::backends::cpp_int_backend<0,
       0, boost::multiprecision::cpp_integer_type::signed_magnitude,
       boost::multiprecision::cpp_int_check_type::unchecked,
       std::__1::allocator<unsigned long long> >,
       boost::multiprecision::expression_template_option::et_on> >,
 boost::multiprecision::number<boost::multiprecision::backends::cpp_bin_float<50,
       boost::multiprecision::backends::digit_base_type::digit_base_10,
 void, int, 0,
       0>, boost::multiprecision::expression_template_option::et_off> >'
 requested
       here
     { return detail::generate_uniform_real(eng, _min, _max); }
                      ^
 b-r6b.cpp:21:38: note: in instantiation of function template
 specialization
 'boost::random::uniform_real_distribution<boost::multiprecision::number<boost::multiprecision::backends::cpp_bin_float<50,
       boost::multiprecision::backends::digit_base_type::digit_base_10,
 void, int, 0,
       0>, boost::multiprecision::expression_template_option::et_off>
>::operator()<boost::random::independent_bits_engine<boost::random::mersenne_twister_engine<unsigned
       int, 32, 624, 397, 31, 2567483615, 11, 4294967295, 7, 2636928640,
 15,
       4022730752, 18, 1812433253>, 168,
 boost::multiprecision::number<boost::multiprecision::backends::cpp_int_backend<0,
       0, boost::multiprecision::cpp_integer_type::signed_magnitude,
       boost::multiprecision::cpp_int_check_type::unchecked,
       std::__1::allocator<unsigned long long> >,
       boost::multiprecision::expression_template_option::et_on> > >'
 requested here
      std::cout << (i+1) << ": " << ur(gen) << std::endl;
                                      ^
 In file included from b-r6b.cpp:3:
 In file included from /opt/local/include/boost/random.hpp:36:
 In file included from
 /opt/local/include/boost/random/additive_combine.hpp:27:
 In file included from
 /opt/local/include/boost/random/linear_congruential.hpp:32:
 In file included from
 /opt/local/include/boost/random/detail/seed_impl.hpp:20:
 /opt/local/include/boost/integer/integer_mask.hpp:64:36: error: no type
 named 'fast'
       in 'boost::uint_t<168>'
     typedef typename uint_t<Bits>::fast fast;
             ~~~~~~~~~~~~~~~~~~~~~~~^~~~
 /opt/local/include/boost/random/independent_bits.hpp:58:21: note: in
 instantiation
       of template class 'boost::low_bits_mask_t<168>' requested here
     { return boost::low_bits_mask_t<w>::sig_bits; }
                     ^
 /opt/local/include/boost/random/uniform_real_distribution.hpp:41:51: note:
 in
       instantiation of member function
 'boost::random::independent_bits_engine<boost::random::mersenne_twister_engine<unsigned
       int, 32, 624, 397, 31, 2567483615, 11, 4294967295, 7, 2636928640,
 15,
       4022730752, 18, 1812433253>, 168,
 boost::multiprecision::number<boost::multiprecision::backends::cpp_int_backend<0,
       0, boost::multiprecision::cpp_integer_type::signed_magnitude,
       boost::multiprecision::cpp_int_check_type::unchecked,
       std::__1::allocator<unsigned long long> >,
       boost::multiprecision::expression_template_option::et_on> >::max'
 requested
       here
         result_type divisor = static_cast<T>((eng.max)() - (eng.min)());
                                                   ^
 /opt/local/include/boost/random/uniform_real_distribution.hpp:72:12: note:
 in
       instantiation of function template specialization
 'boost::random::detail::generate_uniform_real<boost::random::independent_bits_engine<boost::random::mersenne_twister_engine<unsigned
       int, 32, 624, 397, 31, 2567483615, 11, 4294967295, 7, 2636928640,
 15,
       4022730752, 18, 1812433253>, 168,
 boost::multiprecision::number<boost::multiprecision::backends::cpp_int_backend<0,
       0, boost::multiprecision::cpp_integer_type::signed_magnitude,
       boost::multiprecision::cpp_int_check_type::unchecked,
       std::__1::allocator<unsigned long long> >,
       boost::multiprecision::expression_template_option::et_on> >,
 boost::multiprecision::number<boost::multiprecision::backends::cpp_bin_float<50,
       boost::multiprecision::backends::digit_base_type::digit_base_10,
 void, int, 0,
       0>, boost::multiprecision::expression_template_option::et_off> >'
 requested
       here
     return generate_uniform_real(eng, min_value, max_value,
            ^
 /opt/local/include/boost/random/uniform_real_distribution.hpp:193:22:
 note: in
       instantiation of function template specialization
 'boost::random::detail::generate_uniform_real<boost::random::independent_bits_engine<boost::random::mersenne_twister_engine<unsigned
       int, 32, 624, 397, 31, 2567483615, 11, 4294967295, 7, 2636928640,
 15,
       4022730752, 18, 1812433253>, 168,
 boost::multiprecision::number<boost::multiprecision::backends::cpp_int_backend<0,
       0, boost::multiprecision::cpp_integer_type::signed_magnitude,
       boost::multiprecision::cpp_int_check_type::unchecked,
       std::__1::allocator<unsigned long long> >,
       boost::multiprecision::expression_template_option::et_on> >,
 boost::multiprecision::number<boost::multiprecision::backends::cpp_bin_float<50,
       boost::multiprecision::backends::digit_base_type::digit_base_10,
 void, int, 0,
       0>, boost::multiprecision::expression_template_option::et_off> >'
 requested
       here
     { return detail::generate_uniform_real(eng, _min, _max); }
                      ^
 b-r6b.cpp:21:38: note: in instantiation of function template
 specialization
 'boost::random::uniform_real_distribution<boost::multiprecision::number<boost::multiprecision::backends::cpp_bin_float<50,
       boost::multiprecision::backends::digit_base_type::digit_base_10,
 void, int, 0,
       0>, boost::multiprecision::expression_template_option::et_off>
>::operator()<boost::random::independent_bits_engine<boost::random::mersenne_twister_engine<unsigned
       int, 32, 624, 397, 31, 2567483615, 11, 4294967295, 7, 2636928640,
 15,
       4022730752, 18, 1812433253>, 168,
 boost::multiprecision::number<boost::multiprecision::backends::cpp_int_backend<0,
       0, boost::multiprecision::cpp_integer_type::signed_magnitude,
       boost::multiprecision::cpp_int_check_type::unchecked,
       std::__1::allocator<unsigned long long> >,
       boost::multiprecision::expression_template_option::et_on> > >'
 requested here
      std::cout << (i+1) << ": " << ur(gen) << std::endl;
                                      ^
 In file included from b-r6b.cpp:3:
 In file included from /opt/local/include/boost/random.hpp:40:
 In file included from
 /opt/local/include/boost/random/lagged_fibonacci.hpp:30:
 /opt/local/include/boost/random/uniform_01.hpp:177:40: error: no type
 named
       'result_type' in
 'boost::multiprecision::number<boost::multiprecision::backends::cpp_bin_float<50,
       boost::multiprecision::backends::digit_base_type::digit_base_10,
 void, int, 0,
       0>, boost::multiprecision::expression_template_option::et_off>'
   typedef typename traits::value_type::result_type base_result;
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~
 /opt/local/include/boost/random/uniform_01.hpp:235:12: note: in
 instantiation of
       template class
 'boost::random::detail::backward_compatible_uniform_01<boost::multiprecision::number<boost::multiprecision::backends::cpp_bin_float<50,
       boost::multiprecision::backends::digit_base_type::digit_base_10,
 void, int, 0,
       0>, boost::multiprecision::expression_template_option::et_off>,
 double>'
       requested here
   : public
 detail::select_uniform_01<UniformRandomNumberGenerator>::BOOST_NE...
            ^
 /opt/local/include/boost/random/gamma_distribution.hpp:175:42: note: in
       instantiation of template class
 'boost::random::uniform_01<boost::multiprecision::number<boost::multiprecision::backends::cpp_bin_float<50,
       boost::multiprecision::backends::digit_base_type::digit_base_10,
 void, int, 0,
       0>, boost::multiprecision::expression_template_option::et_off>,
 double>'
       requested here
                 result_type y = tan(pi * uniform_01<RealType>()(eng));
                                          ^
 b-r6b.cpp:25:38: note: in instantiation of function template
 specialization
 'boost::random::gamma_distribution<boost::multiprecision::number<boost::multiprecision::backends::cpp_bin_float<50,
       boost::multiprecision::backends::digit_base_type::digit_base_10,
 void, int, 0,
       0>, boost::multiprecision::expression_template_option::et_off>
>::operator()<boost::random::independent_bits_engine<boost::random::mersenne_twister_engine<unsigned
       int, 32, 624, 397, 31, 2567483615, 11, 4294967295, 7, 2636928640,
 15,
       4022730752, 18, 1812433253>, 168,
 boost::multiprecision::number<boost::multiprecision::backends::cpp_int_backend<0,
       0, boost::multiprecision::cpp_integer_type::signed_magnitude,
       boost::multiprecision::cpp_int_check_type::unchecked,
       std::__1::allocator<unsigned long long> >,
       boost::multiprecision::expression_template_option::et_on> > >'
 requested here
      std::cout << (i+1) << ": " << gd(gen) << std::endl;
                                      ^
 In file included from b-r6b.cpp:3:
 In file included from /opt/local/include/boost/random.hpp:61:
 In file included from
 /opt/local/include/boost/random/chi_squared_distribution.hpp:20:
 /opt/local/include/boost/random/gamma_distribution.hpp:180:20: error: type
 'uniform_01<boost::multiprecision::number<boost::multiprecision::backends::cpp_bin_float<50,
       boost::multiprecision::backends::digit_base_type::digit_base_10,
 void, int, 0,
       0>, boost::multiprecision::expression_template_option::et_off> >'
 does not
       provide a call operator
                 if(uniform_01<RealType>()(eng) >
                    ^~~~~~~~~~~~~~~~~~~~~~
 b-r6b.cpp:25:38: note: in instantiation of function template
 specialization
 'boost::random::gamma_distribution<boost::multiprecision::number<boost::multiprecision::backends::cpp_bin_float<50,
       boost::multiprecision::backends::digit_base_type::digit_base_10,
 void, int, 0,
       0>, boost::multiprecision::expression_template_option::et_off>
>::operator()<boost::random::independent_bits_engine<boost::random::mersenne_twister_engine<unsigned
       int, 32, 624, 397, 31, 2567483615, 11, 4294967295, 7, 2636928640,
 15,
       4022730752, 18, 1812433253>, 168,
 boost::multiprecision::number<boost::multiprecision::backends::cpp_int_backend<0,
       0, boost::multiprecision::cpp_integer_type::signed_magnitude,
       boost::multiprecision::cpp_int_check_type::unchecked,
       std::__1::allocator<unsigned long long> >,
       boost::multiprecision::expression_template_option::et_on> > >'
 requested here
      std::cout << (i+1) << ": " << gd(gen) << std::endl;
                                      ^
 In file included from b-r6b.cpp:3:
 In file included from /opt/local/include/boost/random.hpp:61:
 In file included from
 /opt/local/include/boost/random/chi_squared_distribution.hpp:20:
 In file included from
 /opt/local/include/boost/random/gamma_distribution.hpp:25:
 /opt/local/include/boost/random/exponential_distribution.hpp:132:42:
 error: type
 'uniform_01<boost::multiprecision::number<boost::multiprecision::backends::cpp_bin_float<50,
       boost::multiprecision::backends::digit_base_type::digit_base_10,
 void, int, 0,
       0>, boost::multiprecision::expression_template_option::et_off> >'
 does not
       provide a call operator
             _lambda * log(result_type(1)-uniform_01<RealType>()(eng));
                                          ^~~~~~~~~~~~~~~~~~~~~~
 /opt/local/include/boost/random/gamma_distribution.hpp:170:20: note: in
       instantiation of function template specialization
 'boost::random::exponential_distribution<boost::multiprecision::number<boost::multiprecision::backends::cpp_bin_float<50,
       boost::multiprecision::backends::digit_base_type::digit_base_10,
 void, int, 0,
       0>, boost::multiprecision::expression_template_option::et_off>
>::operator()<boost::random::independent_bits_engine<boost::random::mersenne_twister_engine<unsigned
       int, 32, 624, 397, 31, 2567483615, 11, 4294967295, 7, 2636928640,
 15,
       4022730752, 18, 1812433253>, 168,
 boost::multiprecision::number<boost::multiprecision::backends::cpp_int_backend<0,
       0, boost::multiprecision::cpp_integer_type::signed_magnitude,
       boost::multiprecision::cpp_int_check_type::unchecked,
       std::__1::allocator<unsigned long long> >,
       boost::multiprecision::expression_template_option::et_on> > >'
 requested here
             return _exp(eng) * _beta;
                    ^
 b-r6b.cpp:25:38: note: in instantiation of function template
 specialization
 'boost::random::gamma_distribution<boost::multiprecision::number<boost::multiprecision::backends::cpp_bin_float<50,
       boost::multiprecision::backends::digit_base_type::digit_base_10,
 void, int, 0,
       0>, boost::multiprecision::expression_template_option::et_off>
>::operator()<boost::random::independent_bits_engine<boost::random::mersenne_twister_engine<unsigned
       int, 32, 624, 397, 31, 2567483615, 11, 4294967295, 7, 2636928640,
 15,
       4022730752, 18, 1812433253>, 168,
 boost::multiprecision::number<boost::multiprecision::backends::cpp_int_backend<0,
       0, boost::multiprecision::cpp_integer_type::signed_magnitude,
       boost::multiprecision::cpp_int_check_type::unchecked,
       std::__1::allocator<unsigned long long> >,
       boost::multiprecision::expression_template_option::et_on> > >'
 requested here
      std::cout << (i+1) << ": " << gd(gen) << std::endl;
                                      ^
 5 errors generated.
 make: *** [b-r6b.o] Error 1
 }}}

-- 
Ticket URL: <https://svn.boost.org/trac/boost/ticket/10364#comment:10>
Boost C++ Libraries <http://www.boost.org/>
Boost provides free peer-reviewed portable C++ source libraries.

This archive was generated by hypermail 2.1.7 : 2017-02-16 18:50:19 UTC