Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r75485 - in sandbox/big_number: boost/multiprecision boost/multiprecision/detail libs/multiprecision/test
From: john_at_[hidden]
Date: 2011-11-14 07:19:18


Author: johnmaddock
Date: 2011-11-14 07:19:17 EST (Mon, 14 Nov 2011)
New Revision: 75485
URL: http://svn.boost.org/trac/boost/changeset/75485

Log:
Fix remaining cpp_float bugs.
Fix use of expression templates in conditional expressions.
Text files modified:
   sandbox/big_number/boost/multiprecision/cpp_float.hpp | 14 +++++++++++
   sandbox/big_number/boost/multiprecision/detail/mp_number_base.hpp | 44 ++++++++++++++++++++++++++-------------
   sandbox/big_number/libs/multiprecision/test/test_round.cpp | 2
   3 files changed, 43 insertions(+), 17 deletions(-)

Modified: sandbox/big_number/boost/multiprecision/cpp_float.hpp
==============================================================================
--- sandbox/big_number/boost/multiprecision/cpp_float.hpp (original)
+++ sandbox/big_number/boost/multiprecision/cpp_float.hpp 2011-11-14 07:19:17 EST (Mon, 14 Nov 2011)
@@ -1112,7 +1112,7 @@
 
    static const boost::int32_t double_digits10_minus_one = std::numeric_limits<double>::digits10 - 1;
 
- for(boost::uint32_t digits = double_digits10_minus_one; digits <= cpp_float_max_digits10; digits *= static_cast<boost::int32_t>(2))
+ for(boost::int32_t digits = double_digits10_minus_one; digits <= cpp_float_max_digits10; digits *= static_cast<boost::int32_t>(2))
    {
       // Adjust precision of the terms.
       precision(static_cast<boost::int32_t>(digits * static_cast<boost::int32_t>(2)));
@@ -2655,6 +2655,18 @@
    *e = static_cast<int>(t);
 }
 
+template <unsigned Digits10>
+inline bool is_zero(const cpp_float<Digits10>& val)
+{
+ return val.iszero();
+}
+template <unsigned Digits10>
+inline int get_sign(const cpp_float<Digits10>& val)
+{
+ return val.iszero() ? 0 : val.isneg() ? -1 : 1;
+}
+
+
 typedef mp_number<cpp_float<50> > cpp_float_50;
 typedef mp_number<cpp_float<100> > cpp_float_100;
 

Modified: sandbox/big_number/boost/multiprecision/detail/mp_number_base.hpp
==============================================================================
--- sandbox/big_number/boost/multiprecision/detail/mp_number_base.hpp (original)
+++ sandbox/big_number/boost/multiprecision/detail/mp_number_base.hpp 2011-11-14 07:19:17 EST (Mon, 14 Nov 2011)
@@ -218,7 +218,7 @@
    typedef typename left_type::result_type result_type;
    typedef tag tag_type;
 
- mp_exp(const Arg1& a) : arg(a) {}
+ explicit mp_exp(const Arg1& a) : arg(a) {}
 
    left_type left()const { return left_type(arg); }
 
@@ -504,7 +504,8 @@
 inline detail::mp_exp<detail::negate, detail::mp_exp<detail::plus, mp_number<B>, typename detail::mp_exp<detail::negate, Arg1, Arg2, Arg3>::left_type > >
    operator - (const detail::mp_exp<detail::negate, Arg1, Arg2, Arg3>& a, const mp_number<B>& b)
 {
- return detail::mp_exp<detail::plus, mp_number<B>, typename detail::mp_exp<detail::negate, Arg1, Arg2, Arg3>::left_type >(b, a.left_ref());
+ return detail::mp_exp<detail::negate, detail::mp_exp<detail::plus, mp_number<B>, typename detail::mp_exp<detail::negate, Arg1, Arg2, Arg3>::left_type > >(
+ detail::mp_exp<detail::plus, mp_number<B>, typename detail::mp_exp<detail::negate, Arg1, Arg2, Arg3>::left_type >(b, a.left_ref()));
 }
 template <class B>
 inline detail::mp_exp<detail::add_immediates, mp_number<B>, mp_number<B> >
@@ -516,7 +517,8 @@
 inline detail::mp_exp<detail::negate, detail::mp_exp<detail::add_immediates, mp_number<B>, mp_number<B> > >
    operator - (const detail::mp_exp<detail::negate, mp_number<B> >& a, const mp_number<B>& b)
 {
- return detail::mp_exp<detail::add_immediates, mp_number<B>, mp_number<B> >(b, a.left_ref());
+ return detail::mp_exp<detail::negate, detail::mp_exp<detail::add_immediates, mp_number<B>, mp_number<B> > >(
+ detail::mp_exp<detail::add_immediates, mp_number<B>, mp_number<B> >(b, a.left_ref()));
 }
 template <class B, class V>
 inline typename enable_if<is_arithmetic<V>, detail::mp_exp<detail::negate, detail::mp_exp<detail::add_immediates, mp_number<B>, V > > >::type
@@ -588,37 +590,43 @@
 inline detail::mp_exp<detail::negate, detail::mp_exp<detail::multiplies, mp_number<B>, typename detail::mp_exp<detail::negate, Arg1, Arg2, Arg3>::left_type > >
    operator * (const mp_number<B>& a, const detail::mp_exp<detail::negate, Arg1, Arg2, Arg3>& b)
 {
- return detail::mp_exp<detail::multiplies, mp_number<B>, typename detail::mp_exp<detail::negate, Arg1, Arg2, Arg3>::left_type > (a, b.left_ref());
+ return detail::mp_exp<detail::negate, detail::mp_exp<detail::multiplies, mp_number<B>, typename detail::mp_exp<detail::negate, Arg1, Arg2, Arg3>::left_type > >(
+ detail::mp_exp<detail::multiplies, mp_number<B>, typename detail::mp_exp<detail::negate, Arg1, Arg2, Arg3>::left_type > (a, b.left_ref()));
 }
 template <class Arg1, class Arg2, class Arg3, class B>
 inline detail::mp_exp<detail::negate, detail::mp_exp<detail::multiplies, mp_number<B>, typename detail::mp_exp<detail::negate, Arg1, Arg2, Arg3>::left_type > >
    operator * (const detail::mp_exp<detail::negate, Arg1, Arg2, Arg3>& a, const mp_number<B>& b)
 {
- return detail::mp_exp<detail::multiplies, mp_number<B>, typename detail::mp_exp<detail::negate, Arg1, Arg2, Arg3>::left_type >(b, a.left_ref());
+ return detail::mp_exp<detail::negate, detail::mp_exp<detail::multiplies, mp_number<B>, typename detail::mp_exp<detail::negate, Arg1, Arg2, Arg3>::left_type > >(
+ detail::mp_exp<detail::multiplies, mp_number<B>, typename detail::mp_exp<detail::negate, Arg1, Arg2, Arg3>::left_type >(b, a.left_ref()));
 }
 template <class B>
 inline detail::mp_exp<detail::negate, detail::mp_exp<detail::multiply_immediates, mp_number<B>, mp_number<B> > >
    operator * (const mp_number<B>& a, const detail::mp_exp<detail::negate, mp_number<B> >& b)
 {
- return detail::mp_exp<detail::multiply_immediates, mp_number<B>, mp_number<B> >(a, b.left_ref());
+ return detail::mp_exp<detail::negate, detail::mp_exp<detail::multiply_immediates, mp_number<B>, mp_number<B> > >(
+ detail::mp_exp<detail::multiply_immediates, mp_number<B>, mp_number<B> >(a, b.left_ref()));
 }
 template <class B>
 inline detail::mp_exp<detail::negate, detail::mp_exp<detail::multiply_immediates, mp_number<B>, mp_number<B> > >
    operator * (const detail::mp_exp<detail::negate, mp_number<B> >& a, const mp_number<B>& b)
 {
- return detail::mp_exp<detail::multiply_immediates, mp_number<B>, mp_number<B> >(b, a.left_ref());
+ return detail::mp_exp<detail::negate, detail::mp_exp<detail::multiply_immediates, mp_number<B>, mp_number<B> > >(
+ detail::mp_exp<detail::multiply_immediates, mp_number<B>, mp_number<B> >(b, a.left_ref()));
 }
 template <class B, class V>
 inline typename enable_if<is_arithmetic<V>, detail::mp_exp<detail::negate, detail::mp_exp<detail::multiply_immediates, mp_number<B>, V > > >::type
    operator * (const detail::mp_exp<detail::negate, mp_number<B> >& a, const V& b)
 {
- return detail::mp_exp<detail::multiply_immediates, mp_number<B>, V >(a.left_ref(), b);
+ return detail::mp_exp<detail::negate, detail::mp_exp<detail::multiply_immediates, mp_number<B>, V > > (
+ detail::mp_exp<detail::multiply_immediates, mp_number<B>, V >(a.left_ref(), b));
 }
 template <class V, class B>
 inline typename enable_if<is_arithmetic<V>, detail::mp_exp<detail::negate, detail::mp_exp<detail::multiply_immediates, mp_number<B>, V > > >::type
    operator * (const V& a, const detail::mp_exp<detail::negate, mp_number<B> >& b)
 {
- return detail::mp_exp<detail::multiply_immediates, mp_number<B>, V >(b.left_ref(), a);
+ return detail::mp_exp<detail::negate, detail::mp_exp<detail::multiply_immediates, mp_number<B>, V > >(
+ detail::mp_exp<detail::multiply_immediates, mp_number<B>, V >(b.left_ref(), a));
 }
 //
 // Division:
@@ -678,37 +686,43 @@
 inline detail::mp_exp<detail::negate, detail::mp_exp<detail::divides, mp_number<B>, typename detail::mp_exp<detail::negate, Arg1, Arg2, Arg3>::left_type > >
    operator / (const mp_number<B>& a, const detail::mp_exp<detail::negate, Arg1, Arg2, Arg3>& b)
 {
- return detail::mp_exp<detail::divides, mp_number<B>, typename detail::mp_exp<detail::negate, Arg1, Arg2, Arg3>::left_type >(a, b.left_ref());
+ return detail::mp_exp<detail::negate, detail::mp_exp<detail::divides, mp_number<B>, typename detail::mp_exp<detail::negate, Arg1, Arg2, Arg3>::left_type > >(
+ detail::mp_exp<detail::divides, mp_number<B>, typename detail::mp_exp<detail::negate, Arg1, Arg2, Arg3>::left_type >(a, b.left_ref()));
 }
 template <class Arg1, class Arg2, class Arg3, class B>
 inline detail::mp_exp<detail::negate, detail::mp_exp<detail::divides, typename detail::mp_exp<detail::negate, Arg1, Arg2, Arg3>::left_type, mp_number<B> > >
    operator / (const detail::mp_exp<detail::negate, Arg1, Arg2, Arg3>& a, const mp_number<B>& b)
 {
- return detail::mp_exp<detail::divides, typename detail::mp_exp<detail::negate, Arg1, Arg2, Arg3>::left_type, mp_number<B> >(a.left_ref(), b);
+ return detail::mp_exp<detail::negate, detail::mp_exp<detail::divides, typename detail::mp_exp<detail::negate, Arg1, Arg2, Arg3>::left_type, mp_number<B> > >(
+ detail::mp_exp<detail::divides, typename detail::mp_exp<detail::negate, Arg1, Arg2, Arg3>::left_type, mp_number<B> >(a.left_ref(), b));
 }
 template <class B>
 inline detail::mp_exp<detail::negate, detail::mp_exp<detail::divide_immediates, mp_number<B>, mp_number<B> > >
    operator / (const mp_number<B>& a, const detail::mp_exp<detail::negate, mp_number<B> >& b)
 {
- return detail::mp_exp<detail::divide_immediates, mp_number<B>, mp_number<B> >(a, b.left_ref());
+ return detail::mp_exp<detail::negate, detail::mp_exp<detail::divide_immediates, mp_number<B>, mp_number<B> > >(
+ detail::mp_exp<detail::divide_immediates, mp_number<B>, mp_number<B> >(a, b.left_ref()));
 }
 template <class B>
 inline detail::mp_exp<detail::negate, detail::mp_exp<detail::divide_immediates, mp_number<B>, mp_number<B> > >
    operator / (const detail::mp_exp<detail::negate, mp_number<B> >& a, const mp_number<B>& b)
 {
- return detail::mp_exp<detail::divide_immediates, mp_number<B>, mp_number<B> >(a.left_ref(), b);
+ return detail::mp_exp<detail::negate, detail::mp_exp<detail::divide_immediates, mp_number<B>, mp_number<B> > >(
+ detail::mp_exp<detail::divide_immediates, mp_number<B>, mp_number<B> >(a.left_ref(), b));
 }
 template <class B, class V>
 inline typename enable_if<is_arithmetic<V>, detail::mp_exp<detail::negate, detail::mp_exp<detail::divide_immediates, mp_number<B>, V > > >::type
    operator / (const detail::mp_exp<detail::negate, mp_number<B> >& a, const V& b)
 {
- return detail::mp_exp<detail::divide_immediates, mp_number<B>, V>(a.left_ref(), b);
+ return detail::mp_exp<detail::negate, detail::mp_exp<detail::divide_immediates, mp_number<B>, V > >(
+ detail::mp_exp<detail::divide_immediates, mp_number<B>, V>(a.left_ref(), b));
 }
 template <class V, class B>
 inline typename enable_if<is_arithmetic<V>, detail::mp_exp<detail::negate, detail::mp_exp<detail::divide_immediates, V, mp_number<B> > > >::type
    operator / (const V& a, const detail::mp_exp<detail::negate, mp_number<B> >& b)
 {
- return detail::mp_exp<detail::divide_immediates, V, mp_number<B> >(a, b.left_ref());
+ return detail::mp_exp<detail::negate, detail::mp_exp<detail::divide_immediates, V, mp_number<B> > >(
+ detail::mp_exp<detail::divide_immediates, V, mp_number<B> >(a, b.left_ref()));
 }
 //
 // Modulus:

Modified: sandbox/big_number/libs/multiprecision/test/test_round.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/test_round.cpp (original)
+++ sandbox/big_number/libs/multiprecision/test/test_round.cpp 2011-11-14 07:19:17 EST (Mon, 14 Nov 2011)
@@ -65,7 +65,7 @@
       shift += std::numeric_limits<int>::digits;
       bits -= std::numeric_limits<int>::digits;
    }
- return rng() & 1u ? -ldexp(frexp(result, &bits), exponent) : ldexp(frexp(result, &bits), exponent);
+ return rng() & 1u ? T(-ldexp(frexp(result, &bits), exponent)) : T(ldexp(frexp(result, &bits), exponent));
 }
 
 template <class T, class U>


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk