|
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