Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r80058 - in sandbox/big_number: boost/multiprecision boost/multiprecision/concepts boost/multiprecision/detail libs/multiprecision/test libs/multiprecision/test/compile_fail libs/multiprecision/test/math
From: john_at_[hidden]
Date: 2012-08-16 04:14:09


Author: johnmaddock
Date: 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
New Revision: 80058
URL: http://svn.boost.org/trac/boost/changeset/80058

Log:
Big breaking change - make lossy construction explicit.
Added:
   sandbox/big_number/libs/multiprecision/test/compile_fail/
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_1.cpp (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_10.cpp (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_11.cpp (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_12.cpp (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_13.cpp (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_14.cpp (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_15.cpp (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_16.cpp (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_17.cpp (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_18.cpp (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_19.cpp (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_2.cpp (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_20.cpp (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_21.cpp (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_22.cpp (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_23.cpp (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_24.cpp (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_25.cpp (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_26.cpp (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_27.cpp (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_28.cpp (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_29.cpp (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_3.cpp (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_30.cpp (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_31.cpp (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_32.cpp (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_33.cpp (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_34.cpp (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_35.cpp (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_36.cpp (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_37.cpp (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_38.cpp (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_39.cpp (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_4.cpp (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_40.cpp (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_41.cpp (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_42.cpp (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_43.cpp (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_44.cpp (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_5.cpp (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_6.cpp (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_7.cpp (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_8.cpp (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_9.cpp (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/math/table_type.hpp (contents, props changed)
Text files modified:
   sandbox/big_number/boost/multiprecision/concepts/mp_number_archetypes.hpp | 7
   sandbox/big_number/boost/multiprecision/cpp_dec_float.hpp | 10 +
   sandbox/big_number/boost/multiprecision/cpp_int.hpp | 2
   sandbox/big_number/boost/multiprecision/detail/integer_ops.hpp | 9 +
   sandbox/big_number/boost/multiprecision/detail/no_et_ops.hpp | 60 ++++----
   sandbox/big_number/boost/multiprecision/detail/number_base.hpp | 100 ++++++++-----
   sandbox/big_number/boost/multiprecision/gmp.hpp | 39 +++--
   sandbox/big_number/boost/multiprecision/mpfr.hpp | 23 ++-
   sandbox/big_number/boost/multiprecision/number.hpp | 166 ++++++++++++++++------
   sandbox/big_number/boost/multiprecision/rational_adapter.hpp | 28 +++
   sandbox/big_number/libs/multiprecision/test/Jamfile.v2 | 12 +
   sandbox/big_number/libs/multiprecision/test/math/log1p_expm1_test.cpp | 2
   sandbox/big_number/libs/multiprecision/test/math/powm1_sqrtp1m1_test.cpp | 2
   sandbox/big_number/libs/multiprecision/test/math/test_bessel_i.cpp | 2
   sandbox/big_number/libs/multiprecision/test/math/test_bessel_j.cpp | 2
   sandbox/big_number/libs/multiprecision/test/math/test_bessel_k.cpp | 2
   sandbox/big_number/libs/multiprecision/test/math/test_bessel_y.cpp | 2
   sandbox/big_number/libs/multiprecision/test/math/test_beta.cpp | 2
   sandbox/big_number/libs/multiprecision/test/math/test_binomial_coeff.cpp | 2
   sandbox/big_number/libs/multiprecision/test/math/test_carlson.cpp | 2
   sandbox/big_number/libs/multiprecision/test/math/test_cbrt.cpp | 2
   sandbox/big_number/libs/multiprecision/test/math/test_digamma.cpp | 2
   sandbox/big_number/libs/multiprecision/test/math/test_ellint_1.cpp | 2
   sandbox/big_number/libs/multiprecision/test/math/test_ellint_2.cpp | 2
   sandbox/big_number/libs/multiprecision/test/math/test_ellint_3.cpp | 2
   sandbox/big_number/libs/multiprecision/test/math/test_erf.cpp | 2
   sandbox/big_number/libs/multiprecision/test/math/test_expint.cpp | 2
   sandbox/big_number/libs/multiprecision/test/math/test_gamma.cpp | 2
   sandbox/big_number/libs/multiprecision/test/math/test_hermite.cpp | 2
   sandbox/big_number/libs/multiprecision/test/math/test_ibeta.cpp | 2
   sandbox/big_number/libs/multiprecision/test/math/test_ibeta_2.cpp | 2
   sandbox/big_number/libs/multiprecision/test/math/test_ibeta_3.cpp | 2
   sandbox/big_number/libs/multiprecision/test/math/test_ibeta_4.cpp | 2
   sandbox/big_number/libs/multiprecision/test/math/test_ibeta_inv_1.cpp | 2
   sandbox/big_number/libs/multiprecision/test/math/test_ibeta_inv_ab_4.cpp | 2
   sandbox/big_number/libs/multiprecision/test/math/test_igamma.cpp | 2
   sandbox/big_number/libs/multiprecision/test/math/test_igamma_inv.cpp | 2
   sandbox/big_number/libs/multiprecision/test/math/test_igamma_inva.cpp | 2
   sandbox/big_number/libs/multiprecision/test/math/test_laguerre.cpp | 2
   sandbox/big_number/libs/multiprecision/test/math/test_legendre.cpp | 2
   sandbox/big_number/libs/multiprecision/test/math/test_tgamma_ratio.cpp | 2
   sandbox/big_number/libs/multiprecision/test/math/test_zeta.cpp | 2
   sandbox/big_number/libs/multiprecision/test/test_acos.cpp | 30 ++--
   sandbox/big_number/libs/multiprecision/test/test_arithmetic.cpp | 290 ++++++++++++++++++++++-----------------
   sandbox/big_number/libs/multiprecision/test/test_asin.cpp | 12
   sandbox/big_number/libs/multiprecision/test/test_atan.cpp | 4
   sandbox/big_number/libs/multiprecision/test/test_constants.cpp | 6
   sandbox/big_number/libs/multiprecision/test/test_cos.cpp | 22 +-
   sandbox/big_number/libs/multiprecision/test/test_cosh.cpp | 2
   sandbox/big_number/libs/multiprecision/test/test_cpp_int.cpp | 8
   sandbox/big_number/libs/multiprecision/test/test_exp.cpp | 22 +-
   sandbox/big_number/libs/multiprecision/test/test_float_io.cpp | 12
   sandbox/big_number/libs/multiprecision/test/test_generic_conv.cpp | 12
   sandbox/big_number/libs/multiprecision/test/test_gmp_conversions.cpp | 6
   sandbox/big_number/libs/multiprecision/test/test_int_io.cpp | 4
   sandbox/big_number/libs/multiprecision/test/test_log.cpp | 2
   sandbox/big_number/libs/multiprecision/test/test_rational_io.cpp | 14 +
   sandbox/big_number/libs/multiprecision/test/test_sin.cpp | 20 +-
   sandbox/big_number/libs/multiprecision/test/test_sinh.cpp | 2
   sandbox/big_number/libs/multiprecision/test/test_sqrt.cpp | 2
   sandbox/big_number/libs/multiprecision/test/test_tanh.cpp | 2
   61 files changed, 594 insertions(+), 396 deletions(-)

Modified: sandbox/big_number/boost/multiprecision/concepts/mp_number_archetypes.hpp
==============================================================================
--- sandbox/big_number/boost/multiprecision/concepts/mp_number_archetypes.hpp (original)
+++ sandbox/big_number/boost/multiprecision/concepts/mp_number_archetypes.hpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -197,7 +197,12 @@
 
 typedef boost::multiprecision::number<mp_number_backend_float_architype> mp_number_float_architype;
 
-}}} // namespaces
+} // namespace
+
+template<>
+struct number_category<concepts::mp_number_backend_float_architype> : public mpl::int_<number_kind_floating_point>{};
+
+}} // namespaces
 
 namespace std{
 

Modified: sandbox/big_number/boost/multiprecision/cpp_dec_float.hpp
==============================================================================
--- sandbox/big_number/boost/multiprecision/cpp_dec_float.hpp (original)
+++ sandbox/big_number/boost/multiprecision/cpp_dec_float.hpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -27,6 +27,16 @@
 namespace backends{
 
 template <unsigned Digits10>
+class cpp_dec_float;
+
+} // namespace
+
+template <unsigned Digits10>
+struct number_category<backends::cpp_dec_float<Digits10> > : public mpl::int_<number_kind_floating_point>{};
+
+namespace backends{
+
+template <unsigned Digits10>
 class cpp_dec_float
 {
 private:

Modified: sandbox/big_number/boost/multiprecision/cpp_int.hpp
==============================================================================
--- sandbox/big_number/boost/multiprecision/cpp_int.hpp (original)
+++ sandbox/big_number/boost/multiprecision/cpp_int.hpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -1943,7 +1943,7 @@
    //
    if(r_order <= y_order)
    {
- if((r_order < y_order) || (r.compare(y) < 0))
+ if((r_order < y_order) || (r.compare_unsigned(y) < 0))
       {
          return;
       }

Modified: sandbox/big_number/boost/multiprecision/detail/integer_ops.hpp
==============================================================================
--- sandbox/big_number/boost/multiprecision/detail/integer_ops.hpp (original)
+++ sandbox/big_number/boost/multiprecision/detail/integer_ops.hpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -38,6 +38,11 @@
    return maybe_abs(result);
 }
 
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4127)
+#endif
+
 template <class B>
 inline void eval_gcd(B& result, const B& a, const B& b)
 {
@@ -100,6 +105,10 @@
    eval_left_shift(result, shift);
 }
 
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
 template <class B>
 inline void eval_lcm(B& result, const B& a, const B& b)
 {

Modified: sandbox/big_number/boost/multiprecision/detail/no_et_ops.hpp
==============================================================================
--- sandbox/big_number/boost/multiprecision/detail/no_et_ops.hpp (original)
+++ sandbox/big_number/boost/multiprecision/detail/no_et_ops.hpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -40,7 +40,7 @@
    return BOOST_MP_MOVE(result);
 }
 template <class B, class V>
-inline typename enable_if<is_arithmetic<V>, number<B, false> >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, false> >, number<B, false> >::type
    operator + (const number<B, false>& a, const V& b)
 {
    typedef typename detail::canonical<V, B>::type canonical_type;
@@ -50,7 +50,7 @@
    return BOOST_MP_MOVE(result);
 }
 template <class V, class B>
-inline typename enable_if<is_arithmetic<V>, number<B, false> >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, false> >, number<B, false> >::type
    operator + (const V& a, const number<B, false>& b)
 {
    typedef typename detail::canonical<V, B>::type canonical_type;
@@ -71,7 +71,7 @@
    return BOOST_MP_MOVE(result);
 }
 template <class B, class V>
-inline typename enable_if<is_arithmetic<V>, number<B, false> >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, false> >, number<B, false> >::type
    operator - (const number<B, false>& a, const V& b)
 {
    typedef typename detail::canonical<V, B>::type canonical_type;
@@ -81,7 +81,7 @@
    return BOOST_MP_MOVE(result);
 }
 template <class V, class B>
-inline typename enable_if<is_arithmetic<V>, number<B, false> >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, false> >, number<B, false> >::type
    operator - (const V& a, const number<B, false>& b)
 {
    typedef typename detail::canonical<V, B>::type canonical_type;
@@ -102,7 +102,7 @@
    return BOOST_MP_MOVE(result);
 }
 template <class B, class V>
-inline typename enable_if<is_arithmetic<V>, number<B, false> >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, false> >, number<B, false> >::type
    operator * (const number<B, false>& a, const V& b)
 {
    typedef typename detail::canonical<V, B>::type canonical_type;
@@ -112,7 +112,7 @@
    return BOOST_MP_MOVE(result);
 }
 template <class V, class B>
-inline typename enable_if<is_arithmetic<V>, number<B, false> >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, false> >, number<B, false> >::type
    operator * (const V& a, const number<B, false>& b)
 {
    typedef typename detail::canonical<V, B>::type canonical_type;
@@ -133,7 +133,7 @@
    return BOOST_MP_MOVE(result);
 }
 template <class B, class V>
-inline typename enable_if<is_arithmetic<V>, number<B, false> >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, false> >, number<B, false> >::type
    operator / (const number<B, false>& a, const V& b)
 {
    typedef typename detail::canonical<V, B>::type canonical_type;
@@ -143,7 +143,7 @@
    return BOOST_MP_MOVE(result);
 }
 template <class V, class B>
-inline typename enable_if<is_arithmetic<V>, number<B, false> >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, false> >, number<B, false> >::type
    operator / (const V& a, const number<B, false>& b)
 {
    typedef typename detail::canonical<V, B>::type canonical_type;
@@ -164,7 +164,7 @@
    return BOOST_MP_MOVE(result);
 }
 template <class B, class V>
-inline typename enable_if<is_arithmetic<V>, number<B, false> >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, false> >, number<B, false> >::type
    operator % (const number<B, false>& a, const V& b)
 {
    typedef typename detail::canonical<V, B>::type canonical_type;
@@ -174,7 +174,7 @@
    return BOOST_MP_MOVE(result);
 }
 template <class V, class B>
-inline typename enable_if<is_arithmetic<V>, number<B, false> >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, false> >, number<B, false> >::type
    operator % (const V& a, const number<B, false>& b)
 {
    typedef typename detail::canonical<V, B>::type canonical_type;
@@ -195,7 +195,7 @@
    return BOOST_MP_MOVE(result);
 }
 template <class B, class V>
-inline typename enable_if<is_arithmetic<V>, number<B, false> >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, false> >, number<B, false> >::type
    operator | (const number<B, false>& a, const V& b)
 {
    typedef typename detail::canonical<V, B>::type canonical_type;
@@ -205,7 +205,7 @@
    return BOOST_MP_MOVE(result);
 }
 template <class V, class B>
-inline typename enable_if<is_arithmetic<V>, number<B, false> >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, false> >, number<B, false> >::type
    operator | (const V& a, const number<B, false>& b)
 {
    typedef typename detail::canonical<V, B>::type canonical_type;
@@ -226,7 +226,7 @@
    return BOOST_MP_MOVE(result);
 }
 template <class B, class V>
-inline typename enable_if<is_arithmetic<V>, number<B, false> >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, false> >, number<B, false> >::type
    operator ^ (const number<B, false>& a, const V& b)
 {
    typedef typename detail::canonical<V, B>::type canonical_type;
@@ -236,7 +236,7 @@
    return BOOST_MP_MOVE(result);
 }
 template <class V, class B>
-inline typename enable_if<is_arithmetic<V>, number<B, false> >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, false> >, number<B, false> >::type
    operator ^ (const V& a, const number<B, false>& b)
 {
    typedef typename detail::canonical<V, B>::type canonical_type;
@@ -257,7 +257,7 @@
    return BOOST_MP_MOVE(result);
 }
 template <class B, class V>
-inline typename enable_if<is_arithmetic<V>, number<B, false> >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, false> >, number<B, false> >::type
    operator & (const number<B, false>& a, const V& b)
 {
    typedef typename detail::canonical<V, B>::type canonical_type;
@@ -267,7 +267,7 @@
    return BOOST_MP_MOVE(result);
 }
 template <class V, class B>
-inline typename enable_if<is_arithmetic<V>, number<B, false> >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, false> >, number<B, false> >::type
    operator & (const V& a, const number<B, false>& b)
 {
    typedef typename detail::canonical<V, B>::type canonical_type;
@@ -347,7 +347,7 @@
    return static_cast<number<B, false>&&>(a);
 }
 template <class B, class V>
-inline typename enable_if<is_arithmetic<V>, number<B, false> >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, false> >, number<B, false> >::type
    operator + (number<B, false>&& a, const V& b)
 {
    typedef typename detail::canonical<V, B>::type canonical_type;
@@ -356,7 +356,7 @@
    return static_cast<number<B, false>&&>(a);
 }
 template <class V, class B>
-inline typename enable_if<is_arithmetic<V>, number<B, false> >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, false> >, number<B, false> >::type
    operator + (const V& a, number<B, false>&& b)
 {
    typedef typename detail::canonical<V, B>::type canonical_type;
@@ -390,7 +390,7 @@
    return static_cast<number<B, false>&&>(a);
 }
 template <class B, class V>
-inline typename enable_if<is_arithmetic<V>, number<B, false> >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, false> >, number<B, false> >::type
    operator - (number<B, false>&& a, const V& b)
 {
    typedef typename detail::canonical<V, B>::type canonical_type;
@@ -399,7 +399,7 @@
    return static_cast<number<B, false>&&>(a);
 }
 template <class V, class B>
-inline typename enable_if<is_arithmetic<V>, number<B, false> >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, false> >, number<B, false> >::type
    operator - (const V& a, number<B, false>&& b)
 {
    typedef typename detail::canonical<V, B>::type canonical_type;
@@ -433,7 +433,7 @@
    return static_cast<number<B, false>&&>(a);
 }
 template <class B, class V>
-inline typename enable_if<is_arithmetic<V>, number<B, false> >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, false> >, number<B, false> >::type
    operator * (number<B, false>&& a, const V& b)
 {
    typedef typename detail::canonical<V, B>::type canonical_type;
@@ -442,7 +442,7 @@
    return static_cast<number<B, false>&&>(a);
 }
 template <class V, class B>
-inline typename enable_if<is_arithmetic<V>, number<B, false> >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, false> >, number<B, false> >::type
    operator * (const V& a, number<B, false>&& b)
 {
    typedef typename detail::canonical<V, B>::type canonical_type;
@@ -461,7 +461,7 @@
    return static_cast<number<B, false>&&>(a);
 }
 template <class B, class V>
-inline typename enable_if<is_arithmetic<V>, number<B, false> >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, false> >, number<B, false> >::type
    operator / (number<B, false>&& a, const V& b)
 {
    typedef typename detail::canonical<V, B>::type canonical_type;
@@ -480,7 +480,7 @@
    return static_cast<number<B, false>&&>(a);
 }
 template <class B, class V>
-inline typename enable_if<is_arithmetic<V>, number<B, false> >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, false> >, number<B, false> >::type
    operator % (number<B, false>&& a, const V& b)
 {
    typedef typename detail::canonical<V, B>::type canonical_type;
@@ -513,7 +513,7 @@
    return static_cast<number<B, false>&&>(a);
 }
 template <class B, class V>
-inline typename enable_if<is_arithmetic<V>, number<B, false> >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, false> >, number<B, false> >::type
    operator | (number<B, false>&& a, const V& b)
 {
    typedef typename detail::canonical<V, B>::type canonical_type;
@@ -522,7 +522,7 @@
    return static_cast<number<B, false>&&>(a);
 }
 template <class V, class B>
-inline typename enable_if<is_arithmetic<V>, number<B, false> >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, false> >, number<B, false> >::type
    operator | (const V& a, number<B, false>&& b)
 {
    typedef typename detail::canonical<V, B>::type canonical_type;
@@ -555,7 +555,7 @@
    return static_cast<number<B, false>&&>(a);
 }
 template <class B, class V>
-inline typename enable_if<is_arithmetic<V>, number<B, false> >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, false> >, number<B, false> >::type
    operator ^ (number<B, false>&& a, const V& b)
 {
    typedef typename detail::canonical<V, B>::type canonical_type;
@@ -564,7 +564,7 @@
    return static_cast<number<B, false>&&>(a);
 }
 template <class V, class B>
-inline typename enable_if<is_arithmetic<V>, number<B, false> >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, false> >, number<B, false> >::type
    operator ^ (const V& a, number<B, false>&& b)
 {
    typedef typename detail::canonical<V, B>::type canonical_type;
@@ -597,7 +597,7 @@
    return static_cast<number<B, false>&&>(a);
 }
 template <class B, class V>
-inline typename enable_if<is_arithmetic<V>, number<B, false> >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, false> >, number<B, false> >::type
    operator & (number<B, false>&& a, const V& b)
 {
    typedef typename detail::canonical<V, B>::type canonical_type;
@@ -606,7 +606,7 @@
    return static_cast<number<B, false>&&>(a);
 }
 template <class V, class B>
-inline typename enable_if<is_arithmetic<V>, number<B, false> >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, false> >, number<B, false> >::type
    operator & (const V& a, number<B, false>&& b)
 {
    typedef typename detail::canonical<V, B>::type canonical_type;

Modified: sandbox/big_number/boost/multiprecision/detail/number_base.hpp
==============================================================================
--- sandbox/big_number/boost/multiprecision/detail/number_base.hpp (original)
+++ sandbox/big_number/boost/multiprecision/detail/number_base.hpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -9,6 +9,7 @@
 #include <limits>
 #include <boost/utility/enable_if.hpp>
 #include <boost/type_traits/is_convertible.hpp>
+#include <boost/type_traits/decay.hpp>
 #include <boost/lexical_cast.hpp>
 
 namespace boost{ namespace multiprecision{
@@ -36,6 +37,14 @@
 template<class tag, class Arg1, class Arg2, class Arg3, class Arg4>
 struct is_mp_number_expression<detail::expression<tag, Arg1, Arg2, Arg3, Arg4> > : public mpl::true_ {};
 
+template <class T, class Num>
+struct is_compatible_arithmetic_type
+ : public mpl::bool_<
+ is_convertible<T, Num>::value
+ && !is_mp_number<T>::value
+ && !is_mp_number_expression<T>::value>
+{};
+
 namespace detail{
 //
 // Workaround for missing abs(long long) on some compilers:
@@ -67,7 +76,7 @@
 template <class Val, class Backend, class Tag>
 struct canonical_imp
 {
- typedef Val type;
+ typedef typename decay<Val>::type type;
 };
 template <class Val, class Backend>
 struct canonical_imp<Val, Backend, mpl::int_<0> >
@@ -604,13 +613,13 @@
    return detail::expression<detail::add_immediates, number<B, true>, number<B, true> >(a, b);
 }
 template <class B, class V>
-inline typename enable_if<is_arithmetic<V>, detail::expression<detail::add_immediates, number<B, true>, V > >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, true> >, detail::expression<detail::add_immediates, number<B, true>, V > >::type
    operator + (const number<B, true>& a, const V& b)
 {
    return detail::expression<detail::add_immediates, number<B, true>, V >(a, b);
 }
 template <class V, class B>
-inline typename enable_if<is_arithmetic<V>, detail::expression<detail::add_immediates, V, number<B, true> > >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, true> >, detail::expression<detail::add_immediates, V, number<B, true> > >::type
    operator + (const V& a, const number<B, true>& b)
 {
    return detail::expression<detail::add_immediates, V, number<B, true> >(a, b);
@@ -634,13 +643,13 @@
    return detail::expression<detail::plus, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, detail::expression<tag2, Arg1b, Arg2b, Arg3b, Arg4b> >(a, b);
 }
 template <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class V>
-inline typename enable_if<is_arithmetic<V>, detail::expression<detail::plus, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, V > >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>, detail::expression<detail::plus, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, V > >::type
    operator + (const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& a, const V& b)
 {
    return detail::expression<detail::plus, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, V >(a, b);
 }
 template <class V, class tag, class Arg1, class Arg2, class Arg3, class Arg4>
-inline typename enable_if<is_arithmetic<V>, detail::expression<detail::plus, V, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> > >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>, detail::expression<detail::plus, V, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> > >::type
    operator + (const V& a, const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& b)
 {
    return detail::expression<detail::plus, V, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >(a, b);
@@ -673,17 +682,23 @@
    return detail::expression<detail::subtract_immediates, number<B, true>, number<B, true> >(b, a.left_ref());
 }
 template <class B, class V>
-inline typename enable_if<is_arithmetic<V>, detail::expression<detail::subtract_immediates, V, number<B, true> > >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, true> >, detail::expression<detail::subtract_immediates, V, number<B, true> > >::type
    operator + (const detail::expression<detail::negate, number<B, true> >& a, const V& b)
 {
    return detail::expression<detail::subtract_immediates, V, number<B, true> >(b, a.left_ref());
 }
 template <class V, class B>
-inline typename enable_if<is_arithmetic<V>, detail::expression<detail::subtract_immediates, V, number<B, true> > >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, true> >, detail::expression<detail::subtract_immediates, V, number<B, true> > >::type
    operator + (const V& a, const detail::expression<detail::negate, number<B, true> >& b)
 {
    return detail::expression<detail::subtract_immediates, number<B, true>, number<B, true> >(a, b.left_ref());
 }
+template <class B>
+inline detail::expression<detail::negate, detail::expression<detail::add_immediates, number<B, true>, number<B, true> > >
+ operator + (const detail::expression<detail::negate, number<B, true> >& a, const detail::expression<detail::negate, number<B, true> >& b)
+{
+ return detail::expression<detail::negate, detail::expression<detail::add_immediates, number<B, true>, number<B, true> > >(detail::expression<detail::add_immediates, number<B, true>, number<B, true> >(a.left_ref(), b.left_ref()));
+}
 //
 // Subtraction:
 //
@@ -694,13 +709,13 @@
    return detail::expression<detail::subtract_immediates, number<B, true>, number<B, true> >(a, b);
 }
 template <class B, class V>
-inline typename enable_if<is_arithmetic<V>, detail::expression<detail::subtract_immediates, number<B, true>, V > >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, true> >, detail::expression<detail::subtract_immediates, number<B, true>, V > >::type
    operator - (const number<B, true>& a, const V& b)
 {
    return detail::expression<detail::subtract_immediates, number<B, true>, V >(a, b);
 }
 template <class V, class B>
-inline typename enable_if<is_arithmetic<V>, detail::expression<detail::subtract_immediates, V, number<B, true> > >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, true> >, detail::expression<detail::subtract_immediates, V, number<B, true> > >::type
    operator - (const V& a, const number<B, true>& b)
 {
    return detail::expression<detail::subtract_immediates, V, number<B, true> >(a, b);
@@ -724,13 +739,13 @@
    return detail::expression<detail::minus, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, detail::expression<tag2, Arg1b, Arg2b, Arg3b, Arg4b> >(a, b);
 }
 template <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class V>
-inline typename enable_if<is_arithmetic<V>, detail::expression<detail::minus, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, V > >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>, detail::expression<detail::minus, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, V > >::type
    operator - (const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& a, const V& b)
 {
    return detail::expression<detail::minus, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, V >(a, b);
 }
 template <class V, class tag, class Arg1, class Arg2, class Arg3, class Arg4>
-inline typename enable_if<is_arithmetic<V>, detail::expression<detail::minus, V, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> > >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>, detail::expression<detail::minus, V, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> > >::type
    operator - (const V& a, const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& b)
 {
    return detail::expression<detail::minus, V, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >(a, b);
@@ -765,13 +780,13 @@
       detail::expression<detail::add_immediates, number<B, true>, number<B, true> >(b, a.left_ref()));
 }
 template <class B, class V>
-inline typename enable_if<is_arithmetic<V>, detail::expression<detail::negate, detail::expression<detail::add_immediates, number<B, true>, V > > >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, true> >, detail::expression<detail::negate, detail::expression<detail::add_immediates, number<B, true>, V > > >::type
    operator - (const detail::expression<detail::negate, number<B, true> >& a, const V& b)
 {
    return detail::expression<detail::negate, detail::expression<detail::add_immediates, number<B, true>, V > >(detail::expression<detail::add_immediates, number<B, true>, V >(a.left_ref(), b));
 }
 template <class V, class B>
-inline typename enable_if<is_arithmetic<V>, detail::expression<detail::add_immediates, V, number<B, true> > >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, true> >, detail::expression<detail::add_immediates, V, number<B, true> > >::type
    operator - (const V& a, const detail::expression<detail::negate, number<B, true> >& b)
 {
    return detail::expression<detail::add_immediates, V, number<B, true> >(a, b.left_ref());
@@ -786,13 +801,13 @@
    return detail::expression<detail::multiply_immediates, number<B, true>, number<B, true> >(a, b);
 }
 template <class B, class V>
-inline typename enable_if<is_arithmetic<V>, detail::expression<detail::multiply_immediates, number<B, true>, V > >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, true> >, detail::expression<detail::multiply_immediates, number<B, true>, V > >::type
    operator * (const number<B, true>& a, const V& b)
 {
    return detail::expression<detail::multiply_immediates, number<B, true>, V >(a, b);
 }
 template <class V, class B>
-inline typename enable_if<is_arithmetic<V>, detail::expression<detail::multiply_immediates, V, number<B, true> > >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, true> >, detail::expression<detail::multiply_immediates, V, number<B, true> > >::type
    operator * (const V& a, const number<B, true>& b)
 {
    return detail::expression<detail::multiply_immediates, V, number<B, true> >(a, b);
@@ -816,13 +831,13 @@
    return detail::expression<detail::multiplies, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, detail::expression<tag2, Arg1b, Arg2b, Arg3b, Arg4b> >(a, b);
 }
 template <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class V>
-inline typename enable_if<is_arithmetic<V>, detail::expression<detail::multiplies, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, V > >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>, detail::expression<detail::multiplies, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, V > >::type
    operator * (const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& a, const V& b)
 {
    return detail::expression<detail::multiplies, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, V >(a, b);
 }
 template <class V, class tag, class Arg1, class Arg2, class Arg3, class Arg4>
-inline typename enable_if<is_arithmetic<V>, detail::expression<detail::multiplies, V, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> > >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>, detail::expression<detail::multiplies, V, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> > >::type
    operator * (const V& a, const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& b)
 {
    return detail::expression<detail::multiplies, V, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >(a, b);
@@ -859,14 +874,14 @@
       detail::expression<detail::multiply_immediates, number<B, true>, number<B, true> >(b, a.left_ref()));
 }
 template <class B, class V>
-inline typename enable_if<is_arithmetic<V>, detail::expression<detail::negate, detail::expression<detail::multiply_immediates, number<B, true>, V > > >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, true> >, detail::expression<detail::negate, detail::expression<detail::multiply_immediates, number<B, true>, V > > >::type
    operator * (const detail::expression<detail::negate, number<B, true> >& a, const V& b)
 {
    return detail::expression<detail::negate, detail::expression<detail::multiply_immediates, number<B, true>, V > > (
       detail::expression<detail::multiply_immediates, number<B, true>, V >(a.left_ref(), b));
 }
 template <class V, class B>
-inline typename enable_if<is_arithmetic<V>, detail::expression<detail::negate, detail::expression<detail::multiply_immediates, number<B, true>, V > > >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, true> >, detail::expression<detail::negate, detail::expression<detail::multiply_immediates, number<B, true>, V > > >::type
    operator * (const V& a, const detail::expression<detail::negate, number<B, true> >& b)
 {
    return detail::expression<detail::negate, detail::expression<detail::multiply_immediates, number<B, true>, V > >(
@@ -882,13 +897,13 @@
    return detail::expression<detail::divide_immediates, number<B, true>, number<B, true> >(a, b);
 }
 template <class B, class V>
-inline typename enable_if<is_arithmetic<V>, detail::expression<detail::divide_immediates, number<B, true>, V > >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, true> >, detail::expression<detail::divide_immediates, number<B, true>, V > >::type
    operator / (const number<B, true>& a, const V& b)
 {
    return detail::expression<detail::divide_immediates, number<B, true>, V >(a, b);
 }
 template <class V, class B>
-inline typename enable_if<is_arithmetic<V>, detail::expression<detail::divide_immediates, V, number<B, true> > >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, true> >, detail::expression<detail::divide_immediates, V, number<B, true> > >::type
    operator / (const V& a, const number<B, true>& b)
 {
    return detail::expression<detail::divide_immediates, V, number<B, true> >(a, b);
@@ -912,13 +927,13 @@
    return detail::expression<detail::divides, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, detail::expression<tag2, Arg1b, Arg2b, Arg3b, Arg4b> >(a, b);
 }
 template <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class V>
-inline typename enable_if<is_arithmetic<V>, detail::expression<detail::divides, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, V > >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>, detail::expression<detail::divides, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, V > >::type
    operator / (const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& a, const V& b)
 {
    return detail::expression<detail::divides, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, V >(a, b);
 }
 template <class V, class tag, class Arg1, class Arg2, class Arg3, class Arg4>
-inline typename enable_if<is_arithmetic<V>, detail::expression<detail::divides, V, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> > >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>, detail::expression<detail::divides, V, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> > >::type
    operator / (const V& a, const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& b)
 {
    return detail::expression<detail::divides, V, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >(a, b);
@@ -955,14 +970,14 @@
       detail::expression<detail::divide_immediates, number<B, true>, number<B, true> >(a.left_ref(), b));
 }
 template <class B, class V>
-inline typename enable_if<is_arithmetic<V>, detail::expression<detail::negate, detail::expression<detail::divide_immediates, number<B, true>, V > > >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, true> >, detail::expression<detail::negate, detail::expression<detail::divide_immediates, number<B, true>, V > > >::type
    operator / (const detail::expression<detail::negate, number<B, true> >& a, const V& b)
 {
    return detail::expression<detail::negate, detail::expression<detail::divide_immediates, number<B, true>, V > >(
       detail::expression<detail::divide_immediates, number<B, true>, V>(a.left_ref(), b));
 }
 template <class V, class B>
-inline typename enable_if<is_arithmetic<V>, detail::expression<detail::negate, detail::expression<detail::divide_immediates, V, number<B, true> > > >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, true> >, detail::expression<detail::negate, detail::expression<detail::divide_immediates, V, number<B, true> > > >::type
    operator / (const V& a, const detail::expression<detail::negate, number<B, true> >& b)
 {
    return detail::expression<detail::negate, detail::expression<detail::divide_immediates, V, number<B, true> > >(
@@ -978,13 +993,13 @@
    return detail::expression<detail::modulus_immediates, number<B, true>, number<B, true> >(a, b);
 }
 template <class B, class V>
-inline typename enable_if<is_arithmetic<V>, detail::expression<detail::modulus_immediates, number<B, true>, V > >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, true> >, detail::expression<detail::modulus_immediates, number<B, true>, V > >::type
    operator % (const number<B, true>& a, const V& b)
 {
    return detail::expression<detail::modulus_immediates, number<B, true>, V >(a, b);
 }
 template <class V, class B>
-inline typename enable_if<is_arithmetic<V>, detail::expression<detail::modulus_immediates, V, number<B, true> > >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, true> >, detail::expression<detail::modulus_immediates, V, number<B, true> > >::type
    operator % (const V& a, const number<B, true>& b)
 {
    return detail::expression<detail::modulus_immediates, V, number<B, true> >(a, b);
@@ -1008,13 +1023,13 @@
    return detail::expression<detail::modulus, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, detail::expression<tag2, Arg1b, Arg2b, Arg3b, Arg4b> >(a, b);
 }
 template <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class V>
-inline typename enable_if<is_arithmetic<V>, detail::expression<detail::modulus, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, V > >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>, detail::expression<detail::modulus, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, V > >::type
    operator % (const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& a, const V& b)
 {
    return detail::expression<detail::modulus, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, V >(a, b);
 }
 template <class V, class tag, class Arg1, class Arg2, class Arg3, class Arg4>
-inline typename enable_if<is_arithmetic<V>, detail::expression<detail::modulus, V, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> > >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>, detail::expression<detail::modulus, V, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> > >::type
    operator % (const V& a, const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& b)
 {
    return detail::expression<detail::modulus, V, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >(a, b);
@@ -1059,13 +1074,13 @@
    return detail::expression<detail::bitwise_and_immediates, number<B, true>, number<B, true> >(a, b);
 }
 template <class B, class V>
-inline typename enable_if<is_arithmetic<V>, detail::expression<detail::bitwise_and_immediates, number<B, true>, V > >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, true> >, detail::expression<detail::bitwise_and_immediates, number<B, true>, V > >::type
    operator & (const number<B, true>& a, const V& b)
 {
    return detail::expression<detail::bitwise_and_immediates, number<B, true>, V >(a, b);
 }
 template <class V, class B>
-inline typename enable_if<is_arithmetic<V>, detail::expression<detail::bitwise_and_immediates, V, number<B, true> > >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, true> >, detail::expression<detail::bitwise_and_immediates, V, number<B, true> > >::type
    operator & (const V& a, const number<B, true>& b)
 {
    return detail::expression<detail::bitwise_and_immediates, V, number<B, true> >(a, b);
@@ -1089,13 +1104,13 @@
    return detail::expression<detail::bitwise_and, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, detail::expression<tag2, Arg1b, Arg2b, Arg3b, Arg4b> >(a, b);
 }
 template <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class V>
-inline typename enable_if<is_arithmetic<V>, detail::expression<detail::bitwise_and, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, V > >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>, detail::expression<detail::bitwise_and, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, V > >::type
    operator & (const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& a, const V& b)
 {
    return detail::expression<detail::bitwise_and, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, V >(a, b);
 }
 template <class V, class tag, class Arg1, class Arg2, class Arg3, class Arg4>
-inline typename enable_if<is_arithmetic<V>, detail::expression<detail::bitwise_and, V, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> > >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>, detail::expression<detail::bitwise_and, V, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> > >::type
    operator & (const V& a, const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& b)
 {
    return detail::expression<detail::bitwise_and, V, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >(a, b);
@@ -1110,13 +1125,13 @@
    return detail::expression<detail::bitwise_or_immediates, number<B, true>, number<B, true> >(a, b);
 }
 template <class B, class V>
-inline typename enable_if<is_arithmetic<V>, detail::expression<detail::bitwise_or_immediates, number<B, true>, V > >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, true> >, detail::expression<detail::bitwise_or_immediates, number<B, true>, V > >::type
    operator| (const number<B, true>& a, const V& b)
 {
    return detail::expression<detail::bitwise_or_immediates, number<B, true>, V >(a, b);
 }
 template <class V, class B>
-inline typename enable_if<is_arithmetic<V>, detail::expression<detail::bitwise_or_immediates, V, number<B, true> > >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, true> >, detail::expression<detail::bitwise_or_immediates, V, number<B, true> > >::type
    operator| (const V& a, const number<B, true>& b)
 {
    return detail::expression<detail::bitwise_or_immediates, V, number<B, true> >(a, b);
@@ -1140,13 +1155,13 @@
    return detail::expression<detail::bitwise_or, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, detail::expression<tag2, Arg1b, Arg2b, Arg3b, Arg4b> >(a, b);
 }
 template <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class V>
-inline typename enable_if<is_arithmetic<V>, detail::expression<detail::bitwise_or, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, V > >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>, detail::expression<detail::bitwise_or, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, V > >::type
    operator| (const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& a, const V& b)
 {
    return detail::expression<detail::bitwise_or, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, V >(a, b);
 }
 template <class V, class tag, class Arg1, class Arg2, class Arg3, class Arg4>
-inline typename enable_if<is_arithmetic<V>, detail::expression<detail::bitwise_or, V, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> > >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>, detail::expression<detail::bitwise_or, V, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> > >::type
    operator| (const V& a, const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& b)
 {
    return detail::expression<detail::bitwise_or, V, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >(a, b);
@@ -1161,13 +1176,13 @@
    return detail::expression<detail::bitwise_xor_immediates, number<B, true>, number<B, true> >(a, b);
 }
 template <class B, class V>
-inline typename enable_if<is_arithmetic<V>, detail::expression<detail::bitwise_xor_immediates, number<B, true>, V > >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, true> >, detail::expression<detail::bitwise_xor_immediates, number<B, true>, V > >::type
    operator^ (const number<B, true>& a, const V& b)
 {
    return detail::expression<detail::bitwise_xor_immediates, number<B, true>, V >(a, b);
 }
 template <class V, class B>
-inline typename enable_if<is_arithmetic<V>, detail::expression<detail::bitwise_xor_immediates, V, number<B, true> > >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, number<B, true> >, detail::expression<detail::bitwise_xor_immediates, V, number<B, true> > >::type
    operator^ (const V& a, const number<B, true>& b)
 {
    return detail::expression<detail::bitwise_xor_immediates, V, number<B, true> >(a, b);
@@ -1191,13 +1206,13 @@
    return detail::expression<detail::bitwise_xor, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, detail::expression<tag2, Arg1b, Arg2b, Arg3b, Arg4b> >(a, b);
 }
 template <class tag, class Arg1, class Arg2, class Arg3, class Arg4, class V>
-inline typename enable_if<is_arithmetic<V>, detail::expression<detail::bitwise_xor, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, V > >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>, detail::expression<detail::bitwise_xor, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, V > >::type
    operator^ (const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& a, const V& b)
 {
    return detail::expression<detail::bitwise_xor, detail::expression<tag, Arg1, Arg2, Arg3, Arg4>, V >(a, b);
 }
 template <class V, class tag, class Arg1, class Arg2, class Arg3, class Arg4>
-inline typename enable_if<is_arithmetic<V>, detail::expression<detail::bitwise_xor, V, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> > >::type
+inline typename enable_if<is_compatible_arithmetic_type<V, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>, detail::expression<detail::bitwise_xor, V, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> > >::type
    operator^ (const V& a, const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& b)
 {
    return detail::expression<detail::bitwise_xor, V, detail::expression<tag, Arg1, Arg2, Arg3, Arg4> >(a, b);
@@ -1208,6 +1223,7 @@
 //
 enum number_category_type
 {
+ number_kind_unknown = -1,
    number_kind_integer = 0,
    number_kind_floating_point = 1,
    number_kind_rational = 2,
@@ -1215,7 +1231,7 @@
 };
 
 template <class Num>
-struct number_category : public mpl::int_<number_kind_floating_point> {};
+struct number_category : public mpl::int_<std::numeric_limits<Num>::is_integer ? number_kind_integer : (std::numeric_limits<Num>::max_exponent ? number_kind_floating_point : number_kind_unknown)> {};
 template <class Backend, bool ExpressionTemplates>
 struct number_category<number<Backend, ExpressionTemplates> > : public number_category<Backend>{};
 template <class tag, class A1, class A2, class A3, class A4>

Modified: sandbox/big_number/boost/multiprecision/gmp.hpp
==============================================================================
--- sandbox/big_number/boost/multiprecision/gmp.hpp (original)
+++ sandbox/big_number/boost/multiprecision/gmp.hpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -29,7 +29,19 @@
 
 template <unsigned digits10>
 struct gmp_float;
+struct gmp_int;
+struct gmp_rational;
+
+} // namespace backends
+
+template<>
+struct number_category<backends::gmp_int> : public mpl::int_<number_kind_integer>{};
+template<>
+struct number_category<backends::gmp_rational> : public mpl::int_<number_kind_rational>{};
+template <unsigned digits10>
+struct number_category<backends::gmp_float<digits10> > : public mpl::int_<number_kind_floating_point>{};
 
+namespace backends{
 //
 // Within this file, the only functions we mark as noexcept are those that manipulate
 // (but don't create) an mpf_t. All other types may allocate at pretty much any time
@@ -394,21 +406,21 @@
    gmp_float& operator=(const gmp_float<D>& o);
    gmp_float& operator=(const gmp_int& o);
    gmp_float& operator=(const gmp_rational& o);
- gmp_float& operator=(const mpf_t& val) BOOST_NOEXCEPT
+ gmp_float& operator=(const mpf_t val) BOOST_NOEXCEPT
    {
       if(this->m_data[0]._mp_d == 0)
          mpf_init2(this->m_data, ((digits10 + 1) * 1000L) / 301L);
       mpf_set(this->m_data, val);
       return *this;
    }
- gmp_float& operator=(const mpz_t& val) BOOST_NOEXCEPT
+ gmp_float& operator=(const mpz_t val) BOOST_NOEXCEPT
    {
       if(this->m_data[0]._mp_d == 0)
          mpf_init2(this->m_data, ((digits10 + 1) * 1000L) / 301L);
       mpf_set_z(this->m_data, val);
       return *this;
    }
- gmp_float& operator=(const mpq_t& val) BOOST_NOEXCEPT
+ gmp_float& operator=(const mpq_t val) BOOST_NOEXCEPT
    {
       if(this->m_data[0]._mp_d == 0)
          mpf_init2(this->m_data, ((digits10 + 1) * 1000L) / 301L);
@@ -485,21 +497,21 @@
    }
    gmp_float& operator=(const gmp_int& o);
    gmp_float& operator=(const gmp_rational& o);
- gmp_float& operator=(const mpf_t& val)
+ gmp_float& operator=(const mpf_t val)
    {
       if(this->m_data[0]._mp_d == 0)
          mpf_init2(this->m_data, ((get_default_precision() + 1) * 1000L) / 301L);
       mpf_set(this->m_data, val);
       return *this;
    }
- gmp_float& operator=(const mpz_t& val)
+ gmp_float& operator=(const mpz_t val)
    {
       if(this->m_data[0]._mp_d == 0)
          mpf_init2(this->m_data, ((get_default_precision() + 1) * 1000L) / 301L);
       mpf_set_z(this->m_data, val);
       return *this;
    }
- gmp_float& operator=(const mpq_t& val)
+ gmp_float& operator=(const mpq_t val)
    {
       if(this->m_data[0]._mp_d == 0)
          mpf_init2(this->m_data, ((get_default_precision() + 1) * 1000L) / 301L);
@@ -1130,21 +1142,21 @@
          mpz_set_ui(m_data, 0);
       return *this;
    }
- gmp_int& operator=(const mpf_t& val)
+ gmp_int& operator=(const mpf_t val)
    {
       if(m_data[0]._mp_d == 0)
          mpz_init(this->m_data);
       mpz_set_f(this->m_data, val);
       return *this;
    }
- gmp_int& operator=(const mpz_t& val)
+ gmp_int& operator=(const mpz_t val)
    {
       if(m_data[0]._mp_d == 0)
          mpz_init(this->m_data);
       mpz_set(this->m_data, val);
       return *this;
    }
- gmp_int& operator=(const mpq_t& val)
+ gmp_int& operator=(const mpq_t val)
    {
       if(m_data[0]._mp_d == 0)
          mpz_init(this->m_data);
@@ -1789,14 +1801,14 @@
       mpq_set_z(m_data, o.data());
       return *this;
    }
- gmp_rational& operator=(const mpq_t& o)
+ gmp_rational& operator=(const mpq_t o)
    {
       if(m_data[0]._mp_den._mp_d == 0)
          mpq_init(m_data);
       mpq_set(m_data, o);
       return *this;
    }
- gmp_rational& operator=(const mpz_t& o)
+ gmp_rational& operator=(const mpz_t o)
    {
       if(m_data[0]._mp_den._mp_d == 0)
          mpq_init(m_data);
@@ -2077,11 +2089,6 @@
    typedef number<gmp_int> type;
 };
 
-template<>
-struct number_category<gmp_int> : public mpl::int_<number_kind_integer>{};
-template<>
-struct number_category<gmp_rational> : public mpl::int_<number_kind_rational>{};
-
 typedef number<gmp_float<50> > mpf_float_50;
 typedef number<gmp_float<100> > mpf_float_100;
 typedef number<gmp_float<500> > mpf_float_500;

Modified: sandbox/big_number/boost/multiprecision/mpfr.hpp
==============================================================================
--- sandbox/big_number/boost/multiprecision/mpfr.hpp (original)
+++ sandbox/big_number/boost/multiprecision/mpfr.hpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -23,6 +23,13 @@
 template <unsigned digits10>
 struct mpfr_float_backend;
 
+} // namespace backends
+
+template <unsigned digits10>
+struct number_category<backends::mpfr_float_backend<digits10> > : public mpl::int_<number_kind_floating_point>{};
+
+namespace backends{
+
 namespace detail{
 
 inline long get_default_precision() { return 50; }
@@ -387,22 +394,22 @@
       *static_cast<detail::mpfr_float_imp<digits10>*>(this) = v;
       return *this;
    }
- mpfr_float_backend& operator=(const mpfr_t& val)BOOST_NOEXCEPT
+ mpfr_float_backend& operator=(const mpfr_t val)BOOST_NOEXCEPT
    {
       mpfr_set(this->m_data, val, GMP_RNDN);
       return *this;
    }
- mpfr_float_backend& operator=(const mpf_t& val)BOOST_NOEXCEPT
+ mpfr_float_backend& operator=(const mpf_t val)BOOST_NOEXCEPT
    {
       mpfr_set_f(this->m_data, val, GMP_RNDN);
       return *this;
    }
- mpfr_float_backend& operator=(const mpz_t& val)BOOST_NOEXCEPT
+ mpfr_float_backend& operator=(const mpz_t val)BOOST_NOEXCEPT
    {
       mpfr_set_z(this->m_data, val, GMP_RNDN);
       return *this;
    }
- mpfr_float_backend& operator=(const mpq_t& val)BOOST_NOEXCEPT
+ mpfr_float_backend& operator=(const mpq_t val)BOOST_NOEXCEPT
    {
       mpfr_set_q(this->m_data, val, GMP_RNDN);
       return *this;
@@ -508,22 +515,22 @@
       *static_cast<detail::mpfr_float_imp<0>*>(this) = v;
       return *this;
    }
- mpfr_float_backend& operator=(const mpfr_t& val) BOOST_NOEXCEPT
+ mpfr_float_backend& operator=(const mpfr_t val) BOOST_NOEXCEPT
    {
       mpfr_set(this->m_data, val, GMP_RNDN);
       return *this;
    }
- mpfr_float_backend& operator=(const mpf_t& val) BOOST_NOEXCEPT
+ mpfr_float_backend& operator=(const mpf_t val) BOOST_NOEXCEPT
    {
       mpfr_set_f(this->m_data, val, GMP_RNDN);
       return *this;
    }
- mpfr_float_backend& operator=(const mpz_t& val) BOOST_NOEXCEPT
+ mpfr_float_backend& operator=(const mpz_t val) BOOST_NOEXCEPT
    {
       mpfr_set_z(this->m_data, val, GMP_RNDN);
       return *this;
    }
- mpfr_float_backend& operator=(const mpq_t& val) BOOST_NOEXCEPT
+ mpfr_float_backend& operator=(const mpq_t val) BOOST_NOEXCEPT
    {
       mpfr_set_q(this->m_data, val, GMP_RNDN);
       return *this;

Modified: sandbox/big_number/boost/multiprecision/number.hpp
==============================================================================
--- sandbox/big_number/boost/multiprecision/number.hpp (original)
+++ sandbox/big_number/boost/multiprecision/number.hpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -21,6 +21,7 @@
 #include <boost/throw_exception.hpp>
 #include <boost/multiprecision/detail/generic_interconvert.hpp>
 #include <boost/multiprecision/detail/number_compare.hpp>
+#include <boost/multiprecision/traits/is_restricted_conversion.hpp>
 #include <istream> // stream operators
 #include <cstdio> // EOF
 
@@ -43,18 +44,38 @@
    BOOST_FORCEINLINE BOOST_CONSTEXPR number(const number& e) BOOST_NOEXCEPT_IF(noexcept(Backend(static_cast<const Backend&>(std::declval<Backend>())))) : m_backend(e.m_backend){}
    template <class V>
    BOOST_FORCEINLINE number(V v, typename enable_if_c<
- (boost::is_arithmetic<V>::value || is_same<std::string, V>::value || is_convertible<V, const char*>::value)
- && !is_convertible<typename detail::canonical<V, Backend>::type, Backend>::value >::type* = 0)
+ (boost::is_arithmetic<V>::value || is_same<std::string, V>::value || is_convertible<V, const char*>::value)
+ && !is_convertible<typename detail::canonical<V, Backend>::type, Backend>::value
+ && !detail::is_restricted_conversion<typename detail::canonical<V, Backend>::type, Backend>::value
+ >::type* = 0)
    {
       m_backend = canonical_value(v);
    }
    template <class V>
    BOOST_FORCEINLINE BOOST_CONSTEXPR number(V v, typename enable_if_c<
- (boost::is_arithmetic<V>::value || is_same<std::string, V>::value || is_convertible<V, const char*>::value)
- && is_convertible<typename detail::canonical<V, Backend>::type, Backend>::value >::type* = 0)
+ (boost::is_arithmetic<V>::value || is_same<std::string, V>::value || is_convertible<V, const char*>::value)
+ && is_convertible<typename detail::canonical<V, Backend>::type, Backend>::value
+ && !detail::is_restricted_conversion<typename detail::canonical<V, Backend>::type, Backend>::value
+ >::type* = 0)
       : m_backend(canonical_value(v)) {}
    BOOST_FORCEINLINE BOOST_CONSTEXPR number(const number& e, unsigned digits10)
       : m_backend(e.m_backend, digits10){}
+ template <class V>
+ explicit BOOST_FORCEINLINE number(V v, typename enable_if_c<
+ (boost::is_arithmetic<V>::value || is_same<std::string, V>::value || is_convertible<V, const char*>::value)
+ && !is_convertible<typename detail::canonical<V, Backend>::type, Backend>::value
+ && detail::is_restricted_conversion<typename detail::canonical<V, Backend>::type, Backend>::value
+ >::type* = 0)
+ {
+ m_backend = canonical_value(v);
+ }
+ template <class V>
+ explicit BOOST_FORCEINLINE BOOST_CONSTEXPR number(V v, typename enable_if_c<
+ (boost::is_arithmetic<V>::value || is_same<std::string, V>::value || is_convertible<V, const char*>::value)
+ && is_convertible<typename detail::canonical<V, Backend>::type, Backend>::value
+ && detail::is_restricted_conversion<typename detail::canonical<V, Backend>::type, Backend>::value
+ >::type* = 0)
+ : m_backend(canonical_value(v)) {}
    /*
    //
    // This conflicts with component based initialization (for rational and complex types)
@@ -71,12 +92,25 @@
    BOOST_FORCEINLINE BOOST_CONSTEXPR number(const number<Backend, ET>& val) BOOST_NOEXCEPT_IF(noexcept(Backend(static_cast<const Backend&>(std::declval<Backend>())))) : m_backend(val.m_backend) {}
 
    template <class Other, bool ET>
- BOOST_FORCEINLINE number(const number<Other, ET>& val, typename enable_if<boost::is_convertible<Other, Backend> >::type* = 0) BOOST_NOEXCEPT_IF(noexcept(std::declval<Backend>() = std::declval<Other>()))
+ BOOST_FORCEINLINE number(const number<Other, ET>& val, typename enable_if_c<(boost::is_convertible<Other, Backend>::value && !detail::is_restricted_conversion<Other, Backend>::value)>::type* = 0) BOOST_NOEXCEPT_IF(noexcept(std::declval<Backend>() = std::declval<Other>()))
+ {
+ m_backend = val.backend();
+ }
+ template <class Other, bool ET>
+ number(const number<Other, ET>& val, typename enable_if_c<(!boost::is_convertible<Other, Backend>::value && !detail::is_restricted_conversion<Other, Backend>::value)>::type* = 0)
+ {
+ //
+ // Attempt a generic interconvertion:
+ //
+ detail::generic_interconvert(backend(), val.backend(), number_category<Backend>(), number_category<Other>());
+ }
+ template <class Other, bool ET>
+ explicit BOOST_FORCEINLINE number(const number<Other, ET>& val, typename enable_if_c<(boost::is_convertible<Other, Backend>::value && detail::is_restricted_conversion<Other, Backend>::value)>::type* = 0) BOOST_NOEXCEPT_IF(noexcept(std::declval<Backend>() = std::declval<Other>()))
    {
       m_backend = val.backend();
    }
    template <class Other, bool ET>
- number(const number<Other, ET>& val, typename disable_if<boost::is_convertible<Other, Backend> >::type* = 0)
+ explicit number(const number<Other, ET>& val, typename enable_if_c<(!boost::is_convertible<Other, Backend>::value && detail::is_restricted_conversion<Other, Backend>::value)>::type* = 0)
    {
       //
       // Attempt a generic interconvertion:
@@ -102,27 +136,40 @@
       : m_backend(v){}
 
    template <class tag, class Arg1, class Arg2, class Arg3, class Arg4>
- number& operator=(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& e)
+ typename enable_if<is_convertible<typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type, self_type>, number&>::type operator=(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& e)
    {
       typedef typename is_same<number, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>::type tag_type;
       do_assign(e, tag_type());
       return *this;
    }
-
+ template <class tag, class Arg1, class Arg2, class Arg3, class Arg4>
+ number& assign(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& e)
+ {
+ typedef typename is_same<number, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type>::type tag_type;
+ do_assign(e, tag_type());
+ return *this;
+ }
+/*
    BOOST_FORCEINLINE number& operator=(const number& e) BOOST_NOEXCEPT_IF(noexcept(std::declval<Backend>() = static_cast<const Backend&>(std::declval<Backend>())))
    {
       m_backend = e.m_backend;
       return *this;
    }
-
+ */
    template <class V>
- BOOST_FORCEINLINE typename enable_if<mpl::or_<boost::is_arithmetic<V>, is_same<std::string, V>, is_convertible<V, const char*> >, number<Backend, ExpressionTemplates>& >::type
+ BOOST_FORCEINLINE typename enable_if<is_convertible<V, self_type>, number<Backend, ExpressionTemplates>& >::type
       operator=(const V& v) BOOST_NOEXCEPT_IF(noexcept(std::declval<Backend>() = std::declval<typename boost::multiprecision::detail::canonical<V, Backend>::type>()))
    {
       m_backend = canonical_value(v);
       return *this;
    }
-
+ template <class V>
+ BOOST_FORCEINLINE number<Backend, ExpressionTemplates>& assign(const V& v) BOOST_NOEXCEPT_IF(noexcept(std::declval<Backend>() = std::declval<typename boost::multiprecision::detail::canonical<V, Backend>::type>()))
+ {
+ m_backend = canonical_value(v);
+ return *this;
+ }
+ /*
    template <class V>
    BOOST_FORCEINLINE typename enable_if<mpl::and_<is_convertible<V, Backend>, mpl::not_<mpl::or_<boost::is_arithmetic<V>, is_same<std::string, V>, is_convertible<V, const char*> > > >, number<Backend, ExpressionTemplates>& >::type
       operator=(const V& v) BOOST_NOEXCEPT_IF(noexcept(std::declval<Backend>() = static_cast<const V&>(std::declval<V>())))
@@ -130,7 +177,6 @@
       m_backend = v;
       return *this;
    }
-
    template <bool ET>
    BOOST_FORCEINLINE number& operator=(const number<Backend, ET>& v) BOOST_NOEXCEPT_IF(noexcept(std::declval<Backend>() = static_cast<const Backend&>(std::declval<Backend>())))
    {
@@ -145,6 +191,14 @@
       m_backend = v.backend();
       return *this;
    }
+ template <class Other>
+ BOOST_FORCEINLINE typename enable_if<is_convertible<Other, Backend>, number<Backend, ExpressionTemplates>& >::type
+ assign(const number<Other>& v) BOOST_NOEXCEPT_IF(noexcept(std::declval<Backend>() = static_cast<const Other&>(std::declval<Other>())))
+ {
+ m_backend = v.backend();
+ return *this;
+ }
+ */
 
    template <class Other>
    typename disable_if<is_convertible<Other, Backend>, number<Backend, ExpressionTemplates>& >::type
@@ -156,9 +210,19 @@
       detail::generic_interconvert(backend(), v.backend(), number_category<Backend>(), number_category<Other>());
       return *this;
    }
+ template <class Other>
+ typename disable_if<is_convertible<Other, Backend>, number<Backend, ExpressionTemplates>& >::type
+ assign(const number<Other>& v)
+ {
+ //
+ // Attempt a generic interconvertion:
+ //
+ detail::generic_interconvert(backend(), v.backend(), number_category<Backend>(), number_category<Other>());
+ return *this;
+ }
 
    template <class tag, class Arg1, class Arg2, class Arg3, class Arg4>
- number(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& e)
+ number(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& e, typename enable_if_c<is_convertible<typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type, self_type>::value>::type* = 0)
    {
       *this = e;
    }
@@ -196,7 +260,7 @@
    }
 
    template <class V>
- typename enable_if<boost::is_arithmetic<V>, number<Backend, ExpressionTemplates>& >::type
+ typename enable_if<boost::is_convertible<V, self_type>, number<Backend, ExpressionTemplates>& >::type
       operator+=(const V& v)
    {
       using default_ops::eval_add;
@@ -210,24 +274,24 @@
       return *this;
    }
 
- template <class Exp>
- number& operator-=(const detail::expression<Exp>& e)
+ template <class tag, class Arg1, class Arg2, class Arg3, class Arg4>
+ number& operator-=(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& e)
    {
       // Create a copy if e contains this:
       if(contains_self(e))
       {
          self_type temp(e);
- do_subtract(temp, detail::terminal());
+ do_subtract(detail::expression<detail::terminal, self_type>(temp), detail::terminal());
       }
       else
       {
- do_subtract(e, typename Exp::tag_type());
+ do_subtract(e, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::tag_type());
       }
       return *this;
    }
 
    template <class V>
- typename enable_if<boost::is_arithmetic<V>, number<Backend, ExpressionTemplates>& >::type
+ typename enable_if<boost::is_convertible<V, self_type>, number<Backend, ExpressionTemplates>& >::type
       operator-=(const V& v)
    {
       using default_ops::eval_subtract;
@@ -242,8 +306,8 @@
       return *this;
    }
 
- template <class Exp>
- number& operator*=(const detail::expression<Exp>& e)
+ template <class tag, class Arg1, class Arg2, class Arg3, class Arg4>
+ number& operator*=(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& e)
    {
       // Create a temporary if the RHS references *this, but not
       // if we're just doing an x *= x;
@@ -254,13 +318,13 @@
       }
       else
       {
- do_multiplies(e, typename Exp::tag_type());
+ do_multiplies(e, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::tag_type());
       }
       return *this;
    }
 
    template <class V>
- typename enable_if<boost::is_arithmetic<V>, number<Backend, ExpressionTemplates>& >::type
+ typename enable_if<boost::is_convertible<V, self_type>, number<Backend, ExpressionTemplates>& >::type
       operator*=(const V& v)
    {
       using default_ops::eval_multiply;
@@ -274,24 +338,24 @@
       do_modulus(detail::expression<detail::terminal, self_type>(e), detail::terminal());
       return *this;
    }
- template <class Exp>
- number& operator%=(const detail::expression<Exp>& e)
+ template <class tag, class Arg1, class Arg2, class Arg3, class Arg4>
+ number& operator%=(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& e)
    {
       BOOST_STATIC_ASSERT_MSG(number_category<Backend>::value == number_kind_integer, "The modulus operation is only valid for integer types");
       // Create a temporary if the RHS references *this:
       if(contains_self(e))
       {
          self_type temp(e);
- do_modulus(temp, detail::terminal());
+ do_modulus(detail::expression<detail::terminal, self_type>(temp), detail::terminal());
       }
       else
       {
- do_modulus(e, typename Exp::tag_type());
+ do_modulus(e, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::tag_type());
       }
       return *this;
    }
    template <class V>
- typename enable_if<boost::is_arithmetic<V>, number<Backend, ExpressionTemplates>& >::type
+ typename enable_if<boost::is_convertible<V, self_type>, number<Backend, ExpressionTemplates>& >::type
       operator%=(const V& v)
    {
       BOOST_STATIC_ASSERT_MSG(number_category<Backend>::value == number_kind_integer, "The modulus operation is only valid for integer types");
@@ -362,8 +426,8 @@
       return *this;
    }
 
- template <class Exp>
- number& operator/=(const detail::expression<Exp>& e)
+ template <class tag, class Arg1, class Arg2, class Arg3, class Arg4>
+ number& operator/=(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& e)
    {
       // Create a temporary if the RHS references *this:
       if(contains_self(e))
@@ -373,13 +437,13 @@
       }
       else
       {
- do_divide(e, typename Exp::tag_type());
+ do_divide(e, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::tag_type());
       }
       return *this;
    }
 
    template <class V>
- BOOST_FORCEINLINE typename enable_if<boost::is_arithmetic<V>, number<Backend, ExpressionTemplates>& >::type
+ BOOST_FORCEINLINE typename enable_if<boost::is_convertible<V, self_type>, number<Backend, ExpressionTemplates>& >::type
       operator/=(const V& v)
    {
       using default_ops::eval_divide;
@@ -394,8 +458,8 @@
       return *this;
    }
 
- template <class Exp>
- number& operator&=(const detail::expression<Exp>& e)
+ template <class tag, class Arg1, class Arg2, class Arg3, class Arg4>
+ number& operator&=(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& e)
    {
       BOOST_STATIC_ASSERT_MSG(number_category<Backend>::value == number_kind_integer, "The bitwise & operation is only valid for integer types");
       // Create a temporary if the RHS references *this, but not
@@ -403,17 +467,17 @@
       if(contains_self(e) && !is_self(e))
       {
          self_type temp(e);
- do_bitwise_and(temp, detail::terminal());
+ do_bitwise_and(detail::expression<detail::terminal, self_type>(temp), detail::terminal());
       }
       else
       {
- do_bitwise_and(e, typename Exp::tag_type());
+ do_bitwise_and(e, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::tag_type());
       }
       return *this;
    }
 
    template <class V>
- BOOST_FORCEINLINE typename enable_if<boost::is_arithmetic<V>, number<Backend, ExpressionTemplates>& >::type
+ BOOST_FORCEINLINE typename enable_if<boost::is_convertible<V, self_type>, number<Backend, ExpressionTemplates>& >::type
       operator&=(const V& v)
    {
       BOOST_STATIC_ASSERT_MSG(number_category<Backend>::value == number_kind_integer, "The bitwise & operation is only valid for integer types");
@@ -429,8 +493,8 @@
       return *this;
    }
 
- template <class Exp>
- number& operator|=(const detail::expression<Exp>& e)
+ template <class tag, class Arg1, class Arg2, class Arg3, class Arg4>
+ number& operator|=(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& e)
    {
       BOOST_STATIC_ASSERT_MSG(number_category<Backend>::value == number_kind_integer, "The bitwise | operation is only valid for integer types");
       // Create a temporary if the RHS references *this, but not
@@ -438,17 +502,17 @@
       if(contains_self(e) && !is_self(e))
       {
          self_type temp(e);
- do_bitwise_or(temp, detail::terminal());
+ do_bitwise_or(detail::expression<detail::terminal, self_type>(temp), detail::terminal());
       }
       else
       {
- do_bitwise_or(e, typename Exp::tag_type());
+ do_bitwise_or(e, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::tag_type());
       }
       return *this;
    }
 
    template <class V>
- BOOST_FORCEINLINE typename enable_if<boost::is_arithmetic<V>, number<Backend, ExpressionTemplates>& >::type
+ BOOST_FORCEINLINE typename enable_if<boost::is_convertible<V, self_type>, number<Backend, ExpressionTemplates>& >::type
       operator|=(const V& v)
    {
       BOOST_STATIC_ASSERT_MSG(number_category<Backend>::value == number_kind_integer, "The bitwise | operation is only valid for integer types");
@@ -464,24 +528,24 @@
       return *this;
    }
 
- template <class Exp>
- number& operator^=(const detail::expression<Exp>& e)
+ template <class tag, class Arg1, class Arg2, class Arg3, class Arg4>
+ number& operator^=(const detail::expression<tag, Arg1, Arg2, Arg3, Arg4>& e)
    {
       BOOST_STATIC_ASSERT_MSG(number_category<Backend>::value == number_kind_integer, "The bitwise ^ operation is only valid for integer types");
       if(contains_self(e))
       {
          self_type temp(e);
- do_bitwise_xor(temp, detail::terminal());
+ do_bitwise_xor(detail::expression<detail::terminal, self_type>(temp), detail::terminal());
       }
       else
       {
- do_bitwise_xor(e, typename Exp::tag_type());
+ do_bitwise_xor(e, typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::tag_type());
       }
       return *this;
    }
 
    template <class V>
- BOOST_FORCEINLINE typename enable_if<boost::is_arithmetic<V>, number<Backend, ExpressionTemplates>& >::type
+ BOOST_FORCEINLINE typename enable_if<boost::is_convertible<V, self_type>, number<Backend, ExpressionTemplates>& >::type
       operator^=(const V& v)
    {
       BOOST_STATIC_ASSERT_MSG(number_category<Backend>::value == number_kind_integer, "The bitwise ^ operation is only valid for integer types");
@@ -1535,6 +1599,8 @@
    BOOST_FORCEINLINE BOOST_CONSTEXPR bool is_realy_self(const self_type& v)const BOOST_NOEXCEPT{ return &v == this; }
 
    static BOOST_FORCEINLINE BOOST_CONSTEXPR const Backend& canonical_value(const self_type& v) BOOST_NOEXCEPT { return v.m_backend; }
+ template <class B2, bool ET>
+ static BOOST_FORCEINLINE BOOST_CONSTEXPR const B2& canonical_value(const number<B2, ET>& v) BOOST_NOEXCEPT { return v.backend(); }
    template <class V>
    static BOOST_FORCEINLINE BOOST_CONSTEXPR typename detail::canonical<V, Backend>::type canonical_value(const V& v) BOOST_NOEXCEPT { return static_cast<typename detail::canonical<V, Backend>::type>(v); }
    static BOOST_FORCEINLINE typename detail::canonical<std::string, Backend>::type canonical_value(const std::string& v) BOOST_NOEXCEPT { return v.c_str(); }
@@ -1583,7 +1649,7 @@
 {
    std::string s;
    is >> s;
- r = s;
+ r.assign(s);
    return is;
 }
 
@@ -1613,7 +1679,7 @@
       s1.append(1, c);
       is.get();
    }
- v1 = s1;
+ v1.assign(s1);
    s1.erase();
    if(c == '/')
    {
@@ -1625,7 +1691,7 @@
          s1.append(1, c);
          is.get();
       }
- v2 = s1;
+ v2.assign(s1);
    }
    else
       v2 = 1;

Modified: sandbox/big_number/boost/multiprecision/rational_adapter.hpp
==============================================================================
--- sandbox/big_number/boost/multiprecision/rational_adapter.hpp (original)
+++ sandbox/big_number/boost/multiprecision/rational_adapter.hpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -53,12 +53,32 @@
       m_value = o;
       return *this;
    }
- template <class Arithmetic>
- typename enable_if<is_arithmetic<Arithmetic>, rational_adapter&>::type operator = (Arithmetic i)
+ template <class Int>
+ typename enable_if<is_integral<Int>, rational_adapter&>::type operator = (Int i)
    {
       m_value = i;
       return *this;
    }
+ template <class Float>
+ typename enable_if<is_floating_point<Float>, rational_adapter&>::type operator = (Float i)
+ {
+ int e;
+ Float f = std::frexp(i, &e);
+ f = std::ldexp(f, std::numeric_limits<Float>::digits);
+ e -= std::numeric_limits<Float>::digits;
+ integer_type num(f);
+ integer_type denom(1u);
+ if(e > 0)
+ {
+ num <<= e;
+ }
+ else if(e < 0)
+ {
+ denom <<= -e;
+ }
+ m_value.assign(num, denom);
+ return *this;
+ }
    rational_adapter& operator = (const char* s)
    {
       std::string s1;
@@ -74,7 +94,7 @@
          s1.append(1, c);
          ++s;
       }
- v1 = s1;
+ v1.assign(s1);
       s1.erase();
       if(c == '/')
       {
@@ -86,7 +106,7 @@
             s1.append(1, c);
             ++s;
          }
- v2 = s1;
+ v2.assign(s1);
       }
       else
          v2 = 1;

Modified: sandbox/big_number/libs/multiprecision/test/Jamfile.v2
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/Jamfile.v2 (original)
+++ sandbox/big_number/libs/multiprecision/test/Jamfile.v2 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -698,6 +698,14 @@
          release # Otherwise runtime is slow
         : test_rational_io_mpz ;
 
+run test_rational_io.cpp
+ : # command line
+ : # input files
+ : # requirements
+ <define>TEST_CPP_INT
+ release # Otherwise runtime is slow
+ : test_rational_io_cpp_int ;
+
 run test_generic_conv.cpp
         : # command line
         : # input files
@@ -792,6 +800,10 @@
    }
 }
 
+for local source in [ glob compile_fail/*.cpp ]
+{
+ compile-fail $(source) ;
+}
 
 if ! $(disable-concepts)
 {

Added: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_1.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_1.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -0,0 +1,17 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright 2012 John Maddock. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/multiprecision/cpp_int.hpp>
+
+using namespace boost::multiprecision;
+
+void foo(cpp_int i)
+{
+}
+
+int main()
+{
+ foo(2.3); // conversion from float is explicit
+}

Added: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_10.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_10.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -0,0 +1,14 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright 2012 John Maddock. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/multiprecision/cpp_int.hpp>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+ cpp_int i = 2;
+ i -= 2.3;
+}

Added: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_11.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_11.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -0,0 +1,14 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright 2012 John Maddock. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/multiprecision/cpp_int.hpp>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+ cpp_int i = 2;
+ i *= 2.3;
+}

Added: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_12.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_12.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -0,0 +1,14 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright 2012 John Maddock. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/multiprecision/cpp_int.hpp>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+ cpp_int i = 2;
+ i /= 2.3;
+}

Added: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_13.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_13.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -0,0 +1,14 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright 2012 John Maddock. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/multiprecision/cpp_int.hpp>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+ cpp_int i = 2;
+ i %= 2.3;
+}

Added: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_14.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_14.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -0,0 +1,14 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright 2012 John Maddock. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/multiprecision/cpp_int.hpp>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+ cpp_int i = 2;
+ i |= 2.3;
+}

Added: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_15.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_15.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -0,0 +1,14 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright 2012 John Maddock. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/multiprecision/cpp_int.hpp>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+ cpp_int i = 2;
+ i ^= 2.3;
+}

Added: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_16.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_16.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -0,0 +1,14 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright 2012 John Maddock. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/multiprecision/cpp_int.hpp>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+ cpp_int i = 2;
+ i &= 2.3;
+}

Added: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_17.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_17.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -0,0 +1,15 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright 2012 John Maddock. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/multiprecision/cpp_int.hpp>
+#include <boost/multiprecision/cpp_dec_float.hpp>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+ cpp_dec_float_50 a(2), b(3);
+ cpp_int i(a);
+}

Added: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_18.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_18.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -0,0 +1,16 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright 2012 John Maddock. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/multiprecision/cpp_int.hpp>
+#include <boost/multiprecision/cpp_dec_float.hpp>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+ cpp_dec_float_50 a(2), b(3);
+ cpp_int i(2);
+ i = a;
+}

Added: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_19.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_19.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -0,0 +1,15 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright 2012 John Maddock. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/multiprecision/cpp_int.hpp>
+#include <boost/multiprecision/cpp_dec_float.hpp>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+ cpp_dec_float_50 a(2), b(3);
+ cpp_int i(a + b);
+}

Added: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_2.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_2.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -0,0 +1,14 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright 2012 John Maddock. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/multiprecision/cpp_int.hpp>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+ cpp_int i = 2;
+ i == 2.3;
+}

Added: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_20.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_20.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -0,0 +1,16 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright 2012 John Maddock. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/multiprecision/cpp_int.hpp>
+#include <boost/multiprecision/cpp_dec_float.hpp>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+ cpp_dec_float_50 a(2), b(3);
+ cpp_int i(3);
+ i = a * b;
+}

Added: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_21.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_21.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -0,0 +1,16 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright 2012 John Maddock. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/multiprecision/cpp_int.hpp>
+#include <boost/multiprecision/cpp_dec_float.hpp>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+ cpp_dec_float_50 a(2), b(3);
+ cpp_int i(3);
+ i += a * b;
+}

Added: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_22.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_22.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -0,0 +1,16 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright 2012 John Maddock. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/multiprecision/cpp_int.hpp>
+#include <boost/multiprecision/cpp_dec_float.hpp>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+ cpp_dec_float_50 a(2), b(3);
+ cpp_int i(3);
+ i -= a * b;
+}

Added: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_23.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_23.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -0,0 +1,16 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright 2012 John Maddock. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/multiprecision/cpp_int.hpp>
+#include <boost/multiprecision/cpp_dec_float.hpp>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+ cpp_dec_float_50 a(2), b(3);
+ cpp_int i(3);
+ i *= a * b;
+}

Added: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_24.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_24.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -0,0 +1,16 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright 2012 John Maddock. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/multiprecision/cpp_int.hpp>
+#include <boost/multiprecision/cpp_dec_float.hpp>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+ cpp_dec_float_50 a(2), b(3);
+ cpp_int i(3);
+ i /= a * b;
+}

Added: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_25.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_25.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -0,0 +1,16 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright 2012 John Maddock. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/multiprecision/cpp_int.hpp>
+#include <boost/multiprecision/cpp_dec_float.hpp>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+ cpp_dec_float_50 a(2), b(3);
+ cpp_int i(3);
+ i %= a * b;
+}

Added: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_26.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_26.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -0,0 +1,16 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright 2012 John Maddock. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/multiprecision/cpp_int.hpp>
+#include <boost/multiprecision/cpp_dec_float.hpp>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+ cpp_dec_float_50 a(2), b(3);
+ cpp_int i(3);
+ i &= a * b;
+}

Added: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_27.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_27.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -0,0 +1,16 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright 2012 John Maddock. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/multiprecision/cpp_int.hpp>
+#include <boost/multiprecision/cpp_dec_float.hpp>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+ cpp_dec_float_50 a(2), b(3);
+ cpp_int i(3);
+ i |= a * b;
+}

Added: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_28.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_28.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -0,0 +1,16 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright 2012 John Maddock. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/multiprecision/cpp_int.hpp>
+#include <boost/multiprecision/cpp_dec_float.hpp>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+ cpp_dec_float_50 a(2), b(3);
+ cpp_int i(3);
+ i ^= a * b;
+}

Added: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_29.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_29.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -0,0 +1,14 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright 2012 John Maddock. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/multiprecision/cpp_int.hpp>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+ cpp_int i(3), j;
+ j = i + 3.3;
+}

Added: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_3.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_3.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -0,0 +1,14 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright 2012 John Maddock. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/multiprecision/cpp_int.hpp>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+ cpp_int i = 2;
+ i != 2.3;
+}

Added: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_30.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_30.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -0,0 +1,14 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright 2012 John Maddock. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/multiprecision/cpp_int.hpp>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+ cpp_int i(3), j;
+ j = 3.3 + i;
+}

Added: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_31.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_31.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -0,0 +1,14 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright 2012 John Maddock. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/multiprecision/cpp_int.hpp>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+ cpp_int i(3), j;
+ j = 3.3 - i;
+}

Added: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_32.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_32.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -0,0 +1,14 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright 2012 John Maddock. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/multiprecision/cpp_int.hpp>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+ cpp_int i(3), j;
+ j = i - 3.3;
+}

Added: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_33.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_33.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -0,0 +1,14 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright 2012 John Maddock. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/multiprecision/cpp_int.hpp>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+ cpp_int i(3), j;
+ j = i * 3.3;
+}

Added: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_34.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_34.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -0,0 +1,14 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright 2012 John Maddock. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/multiprecision/cpp_int.hpp>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+ cpp_int i(3), j;
+ j = 3.3 * i;
+}

Added: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_35.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_35.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -0,0 +1,14 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright 2012 John Maddock. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/multiprecision/cpp_int.hpp>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+ cpp_int i(3), j;
+ j = 3.3 / i;
+}

Added: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_36.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_36.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -0,0 +1,14 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright 2012 John Maddock. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/multiprecision/cpp_int.hpp>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+ cpp_int i(3), j;
+ j = i / 3.3;
+}

Added: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_37.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_37.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -0,0 +1,14 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright 2012 John Maddock. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/multiprecision/cpp_int.hpp>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+ cpp_int i(3), j;
+ j = i % 3.3;
+}

Added: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_38.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_38.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -0,0 +1,14 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright 2012 John Maddock. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/multiprecision/cpp_int.hpp>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+ cpp_int i(3), j;
+ j = 3.3 % i;
+}

Added: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_39.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_39.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -0,0 +1,14 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright 2012 John Maddock. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/multiprecision/cpp_int.hpp>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+ cpp_int i(3), j;
+ j = 3.3 & i;
+}

Added: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_4.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_4.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -0,0 +1,14 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright 2012 John Maddock. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/multiprecision/cpp_int.hpp>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+ cpp_int i = 2;
+ i <= 2.3;
+}

Added: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_40.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_40.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -0,0 +1,14 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright 2012 John Maddock. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/multiprecision/cpp_int.hpp>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+ cpp_int i(3), j;
+ j = i & 3.3;
+}

Added: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_41.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_41.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -0,0 +1,14 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright 2012 John Maddock. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/multiprecision/cpp_int.hpp>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+ cpp_int i(3), j;
+ j = i | 3.3;
+}

Added: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_42.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_42.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -0,0 +1,14 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright 2012 John Maddock. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/multiprecision/cpp_int.hpp>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+ cpp_int i(3), j;
+ j = 3.3 | i;
+}

Added: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_43.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_43.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -0,0 +1,14 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright 2012 John Maddock. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/multiprecision/cpp_int.hpp>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+ cpp_int i(3), j;
+ j = 3.3 ^ i;
+}

Added: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_44.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_44.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -0,0 +1,14 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright 2012 John Maddock. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/multiprecision/cpp_int.hpp>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+ cpp_int i(3), j;
+ j = i ^ 3.3;
+}

Added: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_5.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_5.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -0,0 +1,14 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright 2012 John Maddock. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/multiprecision/cpp_int.hpp>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+ cpp_int i = 2;
+ i >= 2.3;
+}

Added: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_6.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_6.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -0,0 +1,14 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright 2012 John Maddock. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/multiprecision/cpp_int.hpp>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+ cpp_int i = 2;
+ i > 2.3;
+}

Added: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_7.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_7.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -0,0 +1,14 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright 2012 John Maddock. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/multiprecision/cpp_int.hpp>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+ cpp_int i = 2;
+ i < 2.3;
+}

Added: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_8.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_8.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -0,0 +1,14 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright 2012 John Maddock. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/multiprecision/cpp_int.hpp>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+ cpp_int i = 2;
+ i = 2.3;
+}

Added: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_9.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_9.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -0,0 +1,14 @@
+///////////////////////////////////////////////////////////////////////////////
+// Copyright 2012 John Maddock. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/multiprecision/cpp_int.hpp>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+ cpp_int i = 2;
+ i += 2.3;
+}

Modified: sandbox/big_number/libs/multiprecision/test/math/log1p_expm1_test.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/math/log1p_expm1_test.cpp (original)
+++ sandbox/big_number/libs/multiprecision/test/math/log1p_expm1_test.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -46,7 +46,7 @@
 #include <boost/math/special_functions/log1p.hpp>
 #include <boost/math/special_functions/expm1.hpp>
 
-#define SC_(x) BOOST_STRINGIZE(x)
+#include "table_type.hpp"
 
 #include "libs/math/test/log1p_expm1_test.hpp"
 

Modified: sandbox/big_number/libs/multiprecision/test/math/powm1_sqrtp1m1_test.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/math/powm1_sqrtp1m1_test.cpp (original)
+++ sandbox/big_number/libs/multiprecision/test/math/powm1_sqrtp1m1_test.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -46,7 +46,7 @@
 #include <boost/math/special_functions/sqrt1pm1.hpp>
 #include <boost/math/special_functions/powm1.hpp>
 
-#define SC_(x) BOOST_STRINGIZE(x)
+#include "table_type.hpp"
 
 #include "libs/math/test/powm1_sqrtp1m1_test.hpp"
 

Added: sandbox/big_number/libs/multiprecision/test/math/table_type.hpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/math/table_type.hpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -0,0 +1,39 @@
+///////////////////////////////////////////////////////////////
+// Copyright 2012 John Maddock. Distributed under the Boost
+// Software License, Version 1.0. (See accompanying file
+// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_
+
+#ifndef BOOST_MP_TABLE_TYPE
+
+#include <libs/math/test/table_type.hpp>
+#include <boost/multiprecision/number.hpp>
+
+struct string_table_entry
+{
+private:
+ const char* m_data;
+public:
+ string_table_entry(const char* p) : m_data(p) {}
+
+ template <class T>
+ operator T () const
+ {
+ return static_cast<T>(m_data);
+ }
+};
+
+inline std::ostream& operator << (std::ostream& os, string_table_entry const & what)
+{
+ return os << static_cast<const char*>(what);
+}
+
+template <class Backend, bool ExpressionTemplates>
+struct table_type<boost::multiprecision::number<Backend, ExpressionTemplates> >
+{
+ typedef string_table_entry type;
+};
+
+#define SC_(x) string_table_entry(BOOST_STRINGIZE(x))
+
+#endif
+

Modified: sandbox/big_number/libs/multiprecision/test/math/test_bessel_i.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/math/test_bessel_i.cpp (original)
+++ sandbox/big_number/libs/multiprecision/test/math/test_bessel_i.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -41,7 +41,7 @@
 #include <boost/multiprecision/cpp_dec_float.hpp>
 #endif
 
-#define SC_(x) BOOST_STRINGIZE(x)
+#define SC_(x) static_cast<typename table_type<T>::type>(BOOST_STRINGIZE(x))
 
 #include <boost/math/special_functions/bessel.hpp>
 #include "libs/math/test/test_bessel_i.hpp"

Modified: sandbox/big_number/libs/multiprecision/test/math/test_bessel_j.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/math/test_bessel_j.cpp (original)
+++ sandbox/big_number/libs/multiprecision/test/math/test_bessel_j.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -41,7 +41,7 @@
 #include <boost/multiprecision/cpp_dec_float.hpp>
 #endif
 
-#define SC_(x) BOOST_STRINGIZE(x)
+#include "table_type.hpp"
 
 #include <boost/math/special_functions/bessel.hpp>
 #include "libs/math/test/test_bessel_j.hpp"

Modified: sandbox/big_number/libs/multiprecision/test/math/test_bessel_k.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/math/test_bessel_k.cpp (original)
+++ sandbox/big_number/libs/multiprecision/test/math/test_bessel_k.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -42,7 +42,7 @@
 #include <boost/multiprecision/cpp_dec_float.hpp>
 #endif
 
-#define SC_(x) BOOST_STRINGIZE(x)
+#include "table_type.hpp"
 
 #include <boost/math/special_functions/bessel.hpp>
 #include "libs/math/test/test_bessel_k.hpp"

Modified: sandbox/big_number/libs/multiprecision/test/math/test_bessel_y.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/math/test_bessel_y.cpp (original)
+++ sandbox/big_number/libs/multiprecision/test/math/test_bessel_y.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -41,7 +41,7 @@
 #include <boost/multiprecision/cpp_dec_float.hpp>
 #endif
 
-#define SC_(x) BOOST_STRINGIZE(x)
+#include "table_type.hpp"
 
 #include <boost/math/special_functions/bessel.hpp>
 #include "libs/math/test/test_bessel_y.hpp"

Modified: sandbox/big_number/libs/multiprecision/test/math/test_beta.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/math/test_beta.cpp (original)
+++ sandbox/big_number/libs/multiprecision/test/math/test_beta.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -41,7 +41,7 @@
 #include <boost/multiprecision/cpp_dec_float.hpp>
 #endif
 
-#define SC_(x) BOOST_STRINGIZE(x)
+#include "table_type.hpp"
 
 #include <boost/math/special_functions/beta.hpp>
 #include "libs/math/test/test_beta.hpp"

Modified: sandbox/big_number/libs/multiprecision/test/math/test_binomial_coeff.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/math/test_binomial_coeff.cpp (original)
+++ sandbox/big_number/libs/multiprecision/test/math/test_binomial_coeff.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -41,7 +41,7 @@
 #include <boost/multiprecision/cpp_dec_float.hpp>
 #endif
 
-#define SC_(x) BOOST_STRINGIZE(x)
+#include "table_type.hpp"
 
 #include <boost/math/special_functions/binomial.hpp>
 #include "libs/math/test/test_binomial_coeff.hpp"

Modified: sandbox/big_number/libs/multiprecision/test/math/test_carlson.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/math/test_carlson.cpp (original)
+++ sandbox/big_number/libs/multiprecision/test/math/test_carlson.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -36,7 +36,7 @@
 #include <boost/multiprecision/cpp_dec_float.hpp>
 #endif
 
-#define SC_(x) BOOST_STRINGIZE(x)
+#include "table_type.hpp"
 #define TEST_UDT
 
 #include <boost/math/special_functions/ellint_rc.hpp>

Modified: sandbox/big_number/libs/multiprecision/test/math/test_cbrt.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/math/test_cbrt.cpp (original)
+++ sandbox/big_number/libs/multiprecision/test/math/test_cbrt.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -36,7 +36,7 @@
 #include <boost/multiprecision/cpp_dec_float.hpp>
 #endif
 
-#define SC_(x) BOOST_STRINGIZE(x)
+#include "table_type.hpp"
 #define TEST_UDT
 
 #include <boost/math/special_functions/cbrt.hpp>

Modified: sandbox/big_number/libs/multiprecision/test/math/test_digamma.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/math/test_digamma.cpp (original)
+++ sandbox/big_number/libs/multiprecision/test/math/test_digamma.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -36,7 +36,7 @@
 #include <boost/multiprecision/cpp_dec_float.hpp>
 #endif
 
-#define SC_(x) BOOST_STRINGIZE(x)
+#include "table_type.hpp"
 #define TEST_UDT
 
 #include <boost/math/special_functions/digamma.hpp>

Modified: sandbox/big_number/libs/multiprecision/test/math/test_ellint_1.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/math/test_ellint_1.cpp (original)
+++ sandbox/big_number/libs/multiprecision/test/math/test_ellint_1.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -36,7 +36,7 @@
 #include <boost/multiprecision/cpp_dec_float.hpp>
 #endif
 
-#define SC_(x) BOOST_STRINGIZE(x)
+#include "table_type.hpp"
 #define TEST_UDT
 
 #include <boost/math/special_functions/ellint_1.hpp>

Modified: sandbox/big_number/libs/multiprecision/test/math/test_ellint_2.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/math/test_ellint_2.cpp (original)
+++ sandbox/big_number/libs/multiprecision/test/math/test_ellint_2.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -36,7 +36,7 @@
 #include <boost/multiprecision/cpp_dec_float.hpp>
 #endif
 
-#define SC_(x) BOOST_STRINGIZE(x)
+#include "table_type.hpp"
 #define TEST_UDT
 
 #include <boost/math/special_functions/ellint_2.hpp>

Modified: sandbox/big_number/libs/multiprecision/test/math/test_ellint_3.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/math/test_ellint_3.cpp (original)
+++ sandbox/big_number/libs/multiprecision/test/math/test_ellint_3.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -36,7 +36,7 @@
 #include <boost/multiprecision/cpp_dec_float.hpp>
 #endif
 
-#define SC_(x) BOOST_STRINGIZE(x)
+#include "table_type.hpp"
 #define TEST_UDT
 
 #include <boost/math/special_functions/ellint_3.hpp>

Modified: sandbox/big_number/libs/multiprecision/test/math/test_erf.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/math/test_erf.cpp (original)
+++ sandbox/big_number/libs/multiprecision/test/math/test_erf.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -36,7 +36,7 @@
 #include <boost/multiprecision/cpp_dec_float.hpp>
 #endif
 
-#define SC_(x) BOOST_STRINGIZE(x)
+#include "table_type.hpp"
 #define TEST_UDT
 
 #include <boost/math/special_functions/erf.hpp>

Modified: sandbox/big_number/libs/multiprecision/test/math/test_expint.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/math/test_expint.cpp (original)
+++ sandbox/big_number/libs/multiprecision/test/math/test_expint.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -36,7 +36,7 @@
 #include <boost/multiprecision/cpp_dec_float.hpp>
 #endif
 
-#define SC_(x) BOOST_STRINGIZE(x)
+#include "table_type.hpp"
 #define TEST_UDT
 
 #include <boost/math/special_functions/expint.hpp>

Modified: sandbox/big_number/libs/multiprecision/test/math/test_gamma.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/math/test_gamma.cpp (original)
+++ sandbox/big_number/libs/multiprecision/test/math/test_gamma.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -36,7 +36,7 @@
 #include <boost/multiprecision/cpp_dec_float.hpp>
 #endif
 
-#define SC_(x) BOOST_STRINGIZE(x)
+#include "table_type.hpp"
 #define TEST_UDT
 
 #include <boost/math/special_functions/gamma.hpp>

Modified: sandbox/big_number/libs/multiprecision/test/math/test_hermite.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/math/test_hermite.cpp (original)
+++ sandbox/big_number/libs/multiprecision/test/math/test_hermite.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -36,7 +36,7 @@
 #include <boost/multiprecision/cpp_dec_float.hpp>
 #endif
 
-#define SC_(x) BOOST_STRINGIZE(x)
+#include "table_type.hpp"
 #define TEST_UDT
 
 #include <boost/math/special_functions/hermite.hpp>

Modified: sandbox/big_number/libs/multiprecision/test/math/test_ibeta.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/math/test_ibeta.cpp (original)
+++ sandbox/big_number/libs/multiprecision/test/math/test_ibeta.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -37,7 +37,7 @@
 #include <boost/multiprecision/cpp_dec_float.hpp>
 #endif
 
-#define SC_(x) BOOST_STRINGIZE(x)
+#include "table_type.hpp"
 #define TEST_UDT
 
 #define TEST_DATA 1

Modified: sandbox/big_number/libs/multiprecision/test/math/test_ibeta_2.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/math/test_ibeta_2.cpp (original)
+++ sandbox/big_number/libs/multiprecision/test/math/test_ibeta_2.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -37,7 +37,7 @@
 #include <boost/multiprecision/cpp_dec_float.hpp>
 #endif
 
-#define SC_(x) BOOST_STRINGIZE(x)
+#include "table_type.hpp"
 #define TEST_UDT
 
 #define TEST_DATA 2

Modified: sandbox/big_number/libs/multiprecision/test/math/test_ibeta_3.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/math/test_ibeta_3.cpp (original)
+++ sandbox/big_number/libs/multiprecision/test/math/test_ibeta_3.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -37,7 +37,7 @@
 #include <boost/multiprecision/cpp_dec_float.hpp>
 #endif
 
-#define SC_(x) BOOST_STRINGIZE(x)
+#include "table_type.hpp"
 #define TEST_UDT
 
 #define TEST_DATA 3

Modified: sandbox/big_number/libs/multiprecision/test/math/test_ibeta_4.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/math/test_ibeta_4.cpp (original)
+++ sandbox/big_number/libs/multiprecision/test/math/test_ibeta_4.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -37,7 +37,7 @@
 #include <boost/multiprecision/cpp_dec_float.hpp>
 #endif
 
-#define SC_(x) BOOST_STRINGIZE(x)
+#include "table_type.hpp"
 #define TEST_UDT
 
 #define TEST_DATA 4

Modified: sandbox/big_number/libs/multiprecision/test/math/test_ibeta_inv_1.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/math/test_ibeta_inv_1.cpp (original)
+++ sandbox/big_number/libs/multiprecision/test/math/test_ibeta_inv_1.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -37,7 +37,7 @@
 #include <boost/multiprecision/cpp_dec_float.hpp>
 #endif
 
-#define SC_(x) BOOST_STRINGIZE(x)
+#include "table_type.hpp"
 #define TEST_UDT
 
 #define TEST_DATA 4

Modified: sandbox/big_number/libs/multiprecision/test/math/test_ibeta_inv_ab_4.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/math/test_ibeta_inv_ab_4.cpp (original)
+++ sandbox/big_number/libs/multiprecision/test/math/test_ibeta_inv_ab_4.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -36,7 +36,7 @@
 #include <boost/multiprecision/cpp_dec_float.hpp>
 #endif
 
-#define SC_(x) BOOST_STRINGIZE(x)
+#include "table_type.hpp"
 #define TEST_UDT
 
 #define TEST_DATA 4

Modified: sandbox/big_number/libs/multiprecision/test/math/test_igamma.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/math/test_igamma.cpp (original)
+++ sandbox/big_number/libs/multiprecision/test/math/test_igamma.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -37,7 +37,7 @@
 #include <boost/multiprecision/cpp_dec_float.hpp>
 #endif
 
-#define SC_(x) BOOST_STRINGIZE(x)
+#include "table_type.hpp"
 
 #include <boost/math/special_functions/gamma.hpp>
 #include "libs/math/test/test_igamma.hpp"

Modified: sandbox/big_number/libs/multiprecision/test/math/test_igamma_inv.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/math/test_igamma_inv.cpp (original)
+++ sandbox/big_number/libs/multiprecision/test/math/test_igamma_inv.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -37,7 +37,7 @@
 #include <boost/multiprecision/cpp_dec_float.hpp>
 #endif
 
-#define SC_(x) BOOST_STRINGIZE(x)
+#include "table_type.hpp"
 #define TEST_UDT
 
 #include <boost/math/special_functions/gamma.hpp>

Modified: sandbox/big_number/libs/multiprecision/test/math/test_igamma_inva.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/math/test_igamma_inva.cpp (original)
+++ sandbox/big_number/libs/multiprecision/test/math/test_igamma_inva.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -37,7 +37,7 @@
 #include <boost/multiprecision/cpp_dec_float.hpp>
 #endif
 
-#define SC_(x) BOOST_STRINGIZE(x)
+#include "table_type.hpp"
 #define TEST_UDT
 
 #include <boost/math/special_functions/gamma.hpp>

Modified: sandbox/big_number/libs/multiprecision/test/math/test_laguerre.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/math/test_laguerre.cpp (original)
+++ sandbox/big_number/libs/multiprecision/test/math/test_laguerre.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -36,7 +36,7 @@
 #include <boost/multiprecision/cpp_dec_float.hpp>
 #endif
 
-#define SC_(x) BOOST_STRINGIZE(x)
+#include "table_type.hpp"
 #define TEST_UDT
 
 #include <boost/math/special_functions/laguerre.hpp>

Modified: sandbox/big_number/libs/multiprecision/test/math/test_legendre.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/math/test_legendre.cpp (original)
+++ sandbox/big_number/libs/multiprecision/test/math/test_legendre.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -36,7 +36,7 @@
 #include <boost/multiprecision/cpp_dec_float.hpp>
 #endif
 
-#define SC_(x) BOOST_STRINGIZE(x)
+#include "table_type.hpp"
 #define TEST_UDT
 
 #include <boost/math/special_functions/legendre.hpp>

Modified: sandbox/big_number/libs/multiprecision/test/math/test_tgamma_ratio.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/math/test_tgamma_ratio.cpp (original)
+++ sandbox/big_number/libs/multiprecision/test/math/test_tgamma_ratio.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -36,7 +36,7 @@
 #include <boost/multiprecision/cpp_dec_float.hpp>
 #endif
 
-#define SC_(x) BOOST_STRINGIZE(x)
+#include "table_type.hpp"
 #define TEST_UDT
 
 #include <boost/math/special_functions/gamma.hpp>

Modified: sandbox/big_number/libs/multiprecision/test/math/test_zeta.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/math/test_zeta.cpp (original)
+++ sandbox/big_number/libs/multiprecision/test/math/test_zeta.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -36,7 +36,7 @@
 #include <boost/multiprecision/cpp_dec_float.hpp>
 #endif
 
-#define SC_(x) BOOST_STRINGIZE(x)
+#include "table_type.hpp"
 #define TEST_UDT
 
 #include <boost/math/special_functions/zeta.hpp>

Modified: sandbox/big_number/libs/multiprecision/test/test_acos.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/test_acos.cpp (original)
+++ sandbox/big_number/libs/multiprecision/test/test_acos.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -53,21 +53,21 @@
    //
    static const boost::array<boost::array<T, 2>, 13> exact_data =
    {{
- {{ 0.5, "1.04719755119659774615421446109316762806572313312503527365831486410260546876206966620934494178070568932738269550442743555" }},
- {{ 0.25, "1.31811607165281796574566425464604046984639096659071471685354851741333314266208327690226867044304393238598144034722708676" }},
- {{0.75, "0.722734247813415611178377352641333362025218486424440267626754132583707381914630264964827610939101303690078815991333621490" }},
- {{1 - std::ldexp(1.0, -20), "0.00138106804176241718210883847756746694048570648553426714212025111150044290934710742282266738617709904634187850607042604204" }},
- {{std::ldexp(1.0, -20), "1.57079537312058021283676140197495835299636605165647561806789944133748780804448843729970624018104090863783682329820313127" }},
- {{1, "0" }},
-
- {{0, "1.57079632679489661923132169163975144209858469968755291048747229615390820314310449931401741267105853399107404325664115332" }},
-
- {{ -0.5, "2.09439510239319549230842892218633525613144626625007054731662972820521093752413933241868988356141137865476539100885487110" }},
- {{ -0.25, "1.82347658193697527271697912863346241435077843278439110412139607489448326362412572172576615489907313559616664616605521989" }},
- {{-0.75, "2.41885840577637762728426603063816952217195091295066555334819045972410902437157873366320721440301576429206927052194868516" }},
- {{-1 + std::ldexp(1.0, -20), "3.14021158554803082128053454480193541725668369288957155383282434119631596337686189120521215795593996893580620800721188061" }},
- {{-std::ldexp(1.0, -20), "1.57079728046921302562588198130454453120080334771863020290704515097032859824172056132832858516107615934431126321507917538" }},
- {{-1, "3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230665" }},
+ {{ 0.5, static_cast<T>("1.04719755119659774615421446109316762806572313312503527365831486410260546876206966620934494178070568932738269550442743555") }},
+ {{ 0.25, static_cast<T>("1.31811607165281796574566425464604046984639096659071471685354851741333314266208327690226867044304393238598144034722708676") }},
+ {{0.75, static_cast<T>("0.722734247813415611178377352641333362025218486424440267626754132583707381914630264964827610939101303690078815991333621490") }},
+ {{1 - std::ldexp(1.0, -20), static_cast<T>("0.00138106804176241718210883847756746694048570648553426714212025111150044290934710742282266738617709904634187850607042604204") }},
+ {{std::ldexp(1.0, -20), static_cast<T>("1.57079537312058021283676140197495835299636605165647561806789944133748780804448843729970624018104090863783682329820313127") }},
+ {{1, static_cast<T>("0") }},
+
+ {{0, static_cast<T>("1.57079632679489661923132169163975144209858469968755291048747229615390820314310449931401741267105853399107404325664115332") }},
+
+ {{ -0.5, static_cast<T>("2.09439510239319549230842892218633525613144626625007054731662972820521093752413933241868988356141137865476539100885487110") }},
+ {{ -0.25, static_cast<T>("1.82347658193697527271697912863346241435077843278439110412139607489448326362412572172576615489907313559616664616605521989") }},
+ {{-0.75, static_cast<T>("2.41885840577637762728426603063816952217195091295066555334819045972410902437157873366320721440301576429206927052194868516") }},
+ {{-1 + std::ldexp(1.0, -20), static_cast<T>("3.14021158554803082128053454480193541725668369288957155383282434119631596337686189120521215795593996893580620800721188061") }},
+ {{-std::ldexp(1.0, -20), static_cast<T>("1.57079728046921302562588198130454453120080334771863020290704515097032859824172056132832858516107615934431126321507917538") }},
+ {{-1, static_cast<T>("3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230665") }},
    }};
    unsigned max_err = 0;
    for(unsigned k = 0; k < exact_data.size(); k++)

Modified: sandbox/big_number/libs/multiprecision/test/test_arithmetic.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/test_arithmetic.cpp (original)
+++ sandbox/big_number/libs/multiprecision/test/test_arithmetic.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -64,16 +64,17 @@
 #if defined(TEST_CPP_INT) || defined(TEST_CPP_INT_BR)
 #include <boost/multiprecision/cpp_int.hpp>
 #endif
+
+template <class T>
+struct is_boost_rational : public boost::mpl::false_{};
+
 #if defined(TEST_TOMMATH_BOOST_RATIONAL) || defined(TEST_MPZ_BOOST_RATIONAL)
 #include <boost/rational.hpp>
 
 #define NO_MIXED_OPS
 
 template <class T>
-bool is_boost_rational(const boost::rational<T>&)
-{
- return true;
-}
+struct is_boost_rational<boost::rational<T> > : public boost::mpl::true_{};
 
 namespace boost{ namespace multiprecision{
 
@@ -138,7 +139,11 @@
 #define BOOST_TEST_EQUAL(a, b) BOOST_TEST((a) == (b))
 
 template <class Real, class Val>
-void test_comparisons(Val a, Val b)
+void test_comparisons(Val, Val, const boost::mpl::false_)
+{}
+
+template <class Real, class Val>
+void test_comparisons(Val a, Val b, const boost::mpl::true_)
 {
    Real r1(a);
    Real r2(b);
@@ -222,14 +227,28 @@
 template <class Real, class T>
 void test_integer_ops(const T&){}
 
-template <class T>
-bool is_boost_rational(const T&)
+template <class Real>
+void test_rational(const boost::mpl::true_&)
 {
- return false;
+ Real a(2);
+ a /= 3;
+ BOOST_TEST(numerator(a) == 2);
+ BOOST_TEST(denominator(a) == 3);
+ Real b(4);
+ b /= 6;
+ BOOST_TEST(a == b);
+
+ //
+ // Check IO code:
+ //
+ std::stringstream ss;
+ ss << a;
+ ss >> b;
+ BOOST_CHECK_EQUAL(a, b);
 }
 
 template <class Real>
-void test_integer_ops(const boost::mpl::int_<boost::multiprecision::number_kind_rational>&)
+void test_rational(const boost::mpl::false_&)
 {
    Real a(2);
    a /= 3;
@@ -239,17 +258,10 @@
    b /= 6;
    BOOST_TEST(a == b);
 
- //
- // Boost.Rational has a slightly different error handling stategy,
- // we only test our own:
- //
- if(!is_boost_rational(a))
- {
- BOOST_CHECK_THROW(Real(a / 0), std::overflow_error);
- BOOST_CHECK_THROW(Real("3.14"), std::runtime_error);
- b = "2/3";
- BOOST_CHECK_EQUAL(a, b);
- }
+ BOOST_CHECK_THROW(Real(a / 0), std::overflow_error);
+ BOOST_CHECK_THROW(Real("3.14"), std::runtime_error);
+ b = Real("2/3");
+ BOOST_CHECK_EQUAL(a, b);
    //
    // Check IO code:
    //
@@ -260,6 +272,12 @@
 }
 
 template <class Real>
+void test_integer_ops(const boost::mpl::int_<boost::multiprecision::number_kind_rational>&)
+{
+ test_rational<Real>(is_boost_rational<Real>());
+}
+
+template <class Real>
 void test_integer_ops(const boost::mpl::int_<boost::multiprecision::number_kind_integer>&)
 {
    Real a(20);
@@ -661,6 +679,16 @@
    if(std::numeric_limits<Real>::is_specialized && !std::numeric_limits<Real>::is_signed)
       return;
    typedef typename lexical_cast_target_type<Num>::type target_type;
+ typedef typename boost::mpl::if_<
+ boost::is_convertible<Num, Real>,
+ typename boost::mpl::if_c<boost::is_integral<Num>::value && (sizeof(Num) < sizeof(int)), int, Num>::type,
+ Real
+ >::type cast_type;
+ typedef typename boost::mpl::if_<
+ boost::is_convertible<Num, Real>,
+ Num,
+ Real
+ >::type simple_cast_type;
    std::cout << "Testing mixed arithmetic with type: " << typeid(Real).name() << " and " << typeid(Num).name() << std::endl;
    Num n1 = -static_cast<Num>(1uLL << (std::numeric_limits<Num>::digits - 1));
    Num n2 = -1;
@@ -668,22 +696,22 @@
    Num n4 = -20;
    Num n5 = -8;
 
- test_comparisons<Real>(n1, n2);
- test_comparisons<Real>(n1, n3);
- test_comparisons<Real>(n3, n1);
- test_comparisons<Real>(n2, n1);
- test_comparisons<Real>(n1, n1);
- test_comparisons<Real>(n3, n3);
+ test_comparisons<Real>(n1, n2, boost::is_convertible<Num, Real>());
+ test_comparisons<Real>(n1, n3, boost::is_convertible<Num, Real>());
+ test_comparisons<Real>(n3, n1, boost::is_convertible<Num, Real>());
+ test_comparisons<Real>(n2, n1, boost::is_convertible<Num, Real>());
+ test_comparisons<Real>(n1, n1, boost::is_convertible<Num, Real>());
+ test_comparisons<Real>(n3, n3, boost::is_convertible<Num, Real>());
 
    // Default construct:
- BOOST_TEST(Real(n1) == n1);
- BOOST_TEST(Real(n2) == n2);
- BOOST_TEST(Real(n3) == n3);
- BOOST_TEST(Real(n4) == n4);
- BOOST_TEST(n1 == Real(n1));
- BOOST_TEST(n2 == Real(n2));
- BOOST_TEST(n3 == Real(n3));
- BOOST_TEST(n4 == Real(n4));
+ BOOST_TEST(Real(n1) == static_cast<cast_type>(n1));
+ BOOST_TEST(Real(n2) == static_cast<cast_type>(n2));
+ BOOST_TEST(Real(n3) == static_cast<cast_type>(n3));
+ BOOST_TEST(Real(n4) == static_cast<cast_type>(n4));
+ BOOST_TEST(static_cast<cast_type>(n1) == Real(n1));
+ BOOST_TEST(static_cast<cast_type>(n2) == Real(n2));
+ BOOST_TEST(static_cast<cast_type>(n3) == Real(n3));
+ BOOST_TEST(static_cast<cast_type>(n4) == Real(n4));
    BOOST_TEST(Real(n1).template convert_to<Num>() == n1);
    BOOST_TEST(Real(n2).template convert_to<Num>() == n2);
    BOOST_TEST(Real(n3).template convert_to<Num>() == n3);
@@ -709,54 +737,54 @@
    BOOST_TEST_CLOSE(n4, boost::lexical_cast<target_type>(Real(n4).str(0, f)), 0);
    // Assignment:
    Real r(0);
- BOOST_TEST(r != n1);
- r = n1;
- BOOST_TEST(r == n1);
- r = n2;
- BOOST_TEST(r == n2);
- r = n3;
- BOOST_TEST(r == n3);
- r = n4;
- BOOST_TEST(r == n4);
+ BOOST_TEST(r != static_cast<cast_type>(n1));
+ r = static_cast<simple_cast_type>(n1);
+ BOOST_TEST(r == static_cast<cast_type>(n1));
+ r = static_cast<simple_cast_type>(n2);
+ BOOST_TEST(r == static_cast<cast_type>(n2));
+ r = static_cast<simple_cast_type>(n3);
+ BOOST_TEST(r == static_cast<cast_type>(n3));
+ r = static_cast<simple_cast_type>(n4);
+ BOOST_TEST(r == static_cast<cast_type>(n4));
    // Addition:
- r = n2;
- BOOST_TEST(r + n4 == n2 + n4);
- BOOST_TEST(Real(r + n4) == n2 + n4);
- r += n4;
- BOOST_TEST(r == n2 + n4);
+ r = static_cast<simple_cast_type>(n2);
+ BOOST_TEST(r + static_cast<simple_cast_type>(n4) == static_cast<cast_type>(n2 + n4));
+ BOOST_TEST(Real(r + static_cast<simple_cast_type>(n4)) == static_cast<cast_type>(n2 + n4));
+ r += static_cast<simple_cast_type>(n4);
+ BOOST_TEST(r == static_cast<cast_type>(n2 + n4));
    // subtraction:
- r = n4;
- BOOST_TEST(r - n5 == n4 - n5);
- BOOST_TEST(Real(r - n5) == n4 - n5);
- r -= n5;
- BOOST_TEST(r == n4 - n5);
+ r = static_cast<simple_cast_type>(n4);
+ BOOST_TEST(r - static_cast<simple_cast_type>(n5) == static_cast<cast_type>(n4 - n5));
+ BOOST_TEST(Real(r - static_cast<simple_cast_type>(n5)) == static_cast<cast_type>(n4 - n5));
+ r -= static_cast<simple_cast_type>(n5);
+ BOOST_TEST(r == static_cast<cast_type>(n4 - n5));
    // Multiplication:
- r = n2;
- BOOST_TEST(r * n4 == n2 * n4);
- BOOST_TEST(Real(r * n4) == n2 * n4);
- r *= n4;
- BOOST_TEST(r == n2 * n4);
+ r = static_cast<simple_cast_type>(n2);
+ BOOST_TEST(r * static_cast<simple_cast_type>(n4) == static_cast<cast_type>(n2 * n4));
+ BOOST_TEST(Real(r * static_cast<simple_cast_type>(n4)) == static_cast<cast_type>(n2 * n4));
+ r *= static_cast<simple_cast_type>(n4);
+ BOOST_TEST(r == static_cast<cast_type>(n2 * n4));
    // Division:
- r = n1;
- BOOST_TEST(r / n5 == n1 / n5);
- BOOST_TEST(Real(r / n5) == n1 / n5);
- r /= n5;
- BOOST_TEST(r == n1 / n5);
+ r = static_cast<simple_cast_type>(n1);
+ BOOST_TEST(r / static_cast<simple_cast_type>(n5) == static_cast<cast_type>(n1 / n5));
+ BOOST_TEST(Real(r / static_cast<simple_cast_type>(n5)) == static_cast<cast_type>(n1 / n5));
+ r /= static_cast<simple_cast_type>(n5);
+ BOOST_TEST(r == static_cast<cast_type>(n1 / n5));
    //
    // Extra cases for full coverage:
    //
- r = Real(n4) + n5;
- BOOST_TEST(r == n4 + n5);
- r = n4 + Real(n5);
- BOOST_TEST(r == n4 + n5);
- r = Real(n4) - n5;
- BOOST_TEST(r == n4 - n5);
- r = n4 - Real(n5);
- BOOST_TEST(r == n4 - n5);
- r = n4 * Real(n5);
- BOOST_TEST(r == n4 * n5);
- r = (4 * n4) / Real(4);
- BOOST_TEST(r == n4);
+ r = Real(n4) + static_cast<simple_cast_type>(n5);
+ BOOST_TEST(r == static_cast<cast_type>(n4 + n5));
+ r = static_cast<simple_cast_type>(n4) + Real(n5);
+ BOOST_TEST(r == static_cast<cast_type>(n4 + n5));
+ r = Real(n4) - static_cast<simple_cast_type>(n5);
+ BOOST_TEST(r == static_cast<cast_type>(n4 - n5));
+ r = static_cast<simple_cast_type>(n4) - Real(n5);
+ BOOST_TEST(r == static_cast<cast_type>(n4 - n5));
+ r = static_cast<simple_cast_type>(n4) * Real(n5);
+ BOOST_TEST(r == static_cast<cast_type>(n4 * n5));
+ r = static_cast<cast_type>(4 * n4) / Real(4);
+ BOOST_TEST(r == static_cast<cast_type>(n4));
 }
 
 template <class Real, class Num>
@@ -768,6 +796,16 @@
 void test_mixed()
 {
    typedef typename lexical_cast_target_type<Num>::type target_type;
+ typedef typename boost::mpl::if_<
+ boost::is_convertible<Num, Real>,
+ typename boost::mpl::if_c<boost::is_integral<Num>::value && (sizeof(Num) < sizeof(int)), int, Num>::type,
+ Real
+ >::type cast_type;
+ typedef typename boost::mpl::if_<
+ boost::is_convertible<Num, Real>,
+ Num,
+ Real
+ >::type simple_cast_type;
    
    if(std::numeric_limits<Real>::digits < std::numeric_limits<Num>::digits)
       return;
@@ -779,18 +817,18 @@
    Num n4 = 20;
    Num n5 = 8;
    
- test_comparisons<Real>(n1, n2);
- test_comparisons<Real>(n1, n3);
- test_comparisons<Real>(n1, n1);
- test_comparisons<Real>(n3, n1);
- test_comparisons<Real>(n2, n1);
- test_comparisons<Real>(n3, n3);
+ test_comparisons<Real>(n1, n2, boost::is_convertible<Num, Real>());
+ test_comparisons<Real>(n1, n3, boost::is_convertible<Num, Real>());
+ test_comparisons<Real>(n1, n1, boost::is_convertible<Num, Real>());
+ test_comparisons<Real>(n3, n1, boost::is_convertible<Num, Real>());
+ test_comparisons<Real>(n2, n1, boost::is_convertible<Num, Real>());
+ test_comparisons<Real>(n3, n3, boost::is_convertible<Num, Real>());
 
    // Default construct:
- BOOST_TEST(Real(n1) == n1);
- BOOST_TEST(Real(n2) == n2);
- BOOST_TEST(Real(n3) == n3);
- BOOST_TEST(Real(n4) == n4);
+ BOOST_TEST(Real(n1) == static_cast<cast_type>(n1));
+ BOOST_TEST(Real(n2) == static_cast<cast_type>(n2));
+ BOOST_TEST(Real(n3) == static_cast<cast_type>(n3));
+ BOOST_TEST(Real(n4) == static_cast<cast_type>(n4));
    BOOST_TEST(Real(n1).template convert_to<Num>() == n1);
    BOOST_TEST(Real(n2).template convert_to<Num>() == n2);
    BOOST_TEST(Real(n3).template convert_to<Num>() == n3);
@@ -801,10 +839,10 @@
    BOOST_TEST(static_cast<Num>(Real(n3)) == n3);
    BOOST_TEST(static_cast<Num>(Real(n4)) == n4);
 #endif
- BOOST_TEST(n1 == Real(n1));
- BOOST_TEST(n2 == Real(n2));
- BOOST_TEST(n3 == Real(n3));
- BOOST_TEST(n4 == Real(n4));
+ BOOST_TEST(static_cast<cast_type>(n1) == Real(n1));
+ BOOST_TEST(static_cast<cast_type>(n2) == Real(n2));
+ BOOST_TEST(static_cast<cast_type>(n3) == Real(n3));
+ BOOST_TEST(static_cast<cast_type>(n4) == Real(n4));
 #if defined(TEST_MPFR) || defined(TEST_MPFR_50)
    Num tol = 10 * std::numeric_limits<Num>::epsilon();
 #else
@@ -820,50 +858,50 @@
    BOOST_TEST_CLOSE(n4, boost::lexical_cast<target_type>(Real(n4).str(0, f)), 0);
    // Assignment:
    Real r(0);
- BOOST_TEST(r != n1);
- r = n1;
- BOOST_TEST(r == n1);
- r = n2;
- BOOST_TEST(r == n2);
- r = n3;
- BOOST_TEST(r == n3);
- r = n4;
- BOOST_TEST(r == n4);
+ BOOST_TEST(r != static_cast<cast_type>(n1));
+ r = static_cast<simple_cast_type>(n1);
+ BOOST_TEST(r == static_cast<cast_type>(n1));
+ r = static_cast<simple_cast_type>(n2);
+ BOOST_TEST(r == static_cast<cast_type>(n2));
+ r = static_cast<simple_cast_type>(n3);
+ BOOST_TEST(r == static_cast<cast_type>(n3));
+ r = static_cast<simple_cast_type>(n4);
+ BOOST_TEST(r == static_cast<cast_type>(n4));
    // Addition:
- r = n2;
- BOOST_TEST(r + n4 == n2 + n4);
- BOOST_TEST(Real(r + n4) == n2 + n4);
- r += n4;
- BOOST_TEST(r == n2 + n4);
+ r = static_cast<simple_cast_type>(n2);
+ BOOST_TEST(r + static_cast<simple_cast_type>(n4) == static_cast<cast_type>(n2 + n4));
+ BOOST_TEST(Real(r + static_cast<simple_cast_type>(n4)) == static_cast<cast_type>(n2 + n4));
+ r += static_cast<simple_cast_type>(n4);
+ BOOST_TEST(r == static_cast<cast_type>(n2 + n4));
    // subtraction:
- r = n4;
- BOOST_TEST(r - n5 == n4 - n5);
- BOOST_TEST(Real(r - n5) == n4 - n5);
- r -= n5;
- BOOST_TEST(r == n4 - n5);
+ r = static_cast<simple_cast_type>(n4);
+ BOOST_TEST(r - static_cast<simple_cast_type>(n5) == static_cast<cast_type>(n4 - n5));
+ BOOST_TEST(Real(r - static_cast<simple_cast_type>(n5)) == static_cast<cast_type>(n4 - n5));
+ r -= static_cast<simple_cast_type>(n5);
+ BOOST_TEST(r == static_cast<cast_type>(n4 - n5));
    // Multiplication:
- r = n2;
- BOOST_TEST(r * n4 == n2 * n4);
- BOOST_TEST(Real(r * n4) == n2 * n4);
- r *= n4;
- BOOST_TEST(r == n2 * n4);
+ r = static_cast<simple_cast_type>(n2);
+ BOOST_TEST(r * static_cast<simple_cast_type>(n4) == static_cast<cast_type>(n2 * n4));
+ BOOST_TEST(Real(r * static_cast<simple_cast_type>(n4)) == static_cast<cast_type>(n2 * n4));
+ r *= static_cast<simple_cast_type>(n4);
+ BOOST_TEST(r == static_cast<cast_type>(n2 * n4));
    // Division:
- r = n1;
- BOOST_TEST(r / n5 == n1 / n5);
- BOOST_TEST(Real(r / n5) == n1 / n5);
- r /= n5;
- BOOST_TEST(r == n1 / n5);
+ r = static_cast<simple_cast_type>(n1);
+ BOOST_TEST(r / static_cast<simple_cast_type>(n5) == static_cast<cast_type>(n1 / n5));
+ BOOST_TEST(Real(r / static_cast<simple_cast_type>(n5)) == static_cast<cast_type>(n1 / n5));
+ r /= static_cast<simple_cast_type>(n5);
+ BOOST_TEST(r == static_cast<cast_type>(n1 / n5));
    //
    // special cases for full coverage:
    //
- r = n5 + Real(n4);
- BOOST_TEST(r == n4 + n5);
- r = n4 - Real(n5);
- BOOST_TEST(r == n4 - n5);
- r = n4 * Real(n5);
- BOOST_TEST(r == n4 * n5);
- r = (4 * n4) / Real(4);
- BOOST_TEST(r == n4);
+ r = static_cast<simple_cast_type>(n5) + Real(n4);
+ BOOST_TEST(r == static_cast<cast_type>(n4 + n5));
+ r = static_cast<simple_cast_type>(n4) - Real(n5);
+ BOOST_TEST(r == static_cast<cast_type>(n4 - n5));
+ r = static_cast<simple_cast_type>(n4) * Real(n5);
+ BOOST_TEST(r == static_cast<cast_type>(n4 * n5));
+ r = static_cast<cast_type>(4 * n4) / Real(4);
+ BOOST_TEST(r == static_cast<cast_type>(n4));
    test_negative_mixed<Real, Num>(boost::mpl::bool_<std::numeric_limits<Num>::is_signed>());
 }
 

Modified: sandbox/big_number/libs/multiprecision/test/test_asin.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/test_asin.cpp (original)
+++ sandbox/big_number/libs/multiprecision/test/test_asin.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -53,12 +53,12 @@
    //
    static const boost::array<boost::array<T, 2>, 6> exact_data =
    {{
- {{ 0.5, "0.523598775598298873077107230546583814032861566562517636829157432051302734381034833104672470890352844663691347752213717775" }},
- {{ 0.25, "0.252680255142078653485657436993710972252193733096838193633923778740575060481021222411748742228014601605092602909414066566" }},
- {{0.75, "0.848062078981481008052944338998418080073366213263112642860718163570200821228474234349189801731957230300995227265307531834" }},
- {{std::ldexp(1.0, -20), "9.53674316406394560289664793089102218648031077292419572854816420395098616062014311172490017625353237219958438022056661501e-7" }},
- {{ 1 - std::ldexp(1.0, -20), "1.56941525875313420204921285316218397515809899320201864334535204504240776023375739189119474528488143494473216475057072728" }},
- {{ 1, "1.57079632679489661923132169163975144209858469968755291048747229615390820314310449931401741267105853399107404325664115332354692230477529111586267970406424055872514205135096926055277982231147447746519098221440548783296672306423782411689339158263560095457282428346173017430522716332410669680363012457064" }},
+ {{ 0.5, static_cast<T>("0.523598775598298873077107230546583814032861566562517636829157432051302734381034833104672470890352844663691347752213717775") }},
+ {{ 0.25, static_cast<T>("0.252680255142078653485657436993710972252193733096838193633923778740575060481021222411748742228014601605092602909414066566") }},
+ {{0.75, static_cast<T>("0.848062078981481008052944338998418080073366213263112642860718163570200821228474234349189801731957230300995227265307531834") }},
+ {{std::ldexp(1.0, -20), static_cast<T>("9.53674316406394560289664793089102218648031077292419572854816420395098616062014311172490017625353237219958438022056661501e-7") }},
+ {{ 1 - std::ldexp(1.0, -20), static_cast<T>("1.56941525875313420204921285316218397515809899320201864334535204504240776023375739189119474528488143494473216475057072728") }},
+ {{ 1, static_cast<T>("1.57079632679489661923132169163975144209858469968755291048747229615390820314310449931401741267105853399107404325664115332354692230477529111586267970406424055872514205135096926055277982231147447746519098221440548783296672306423782411689339158263560095457282428346173017430522716332410669680363012457064") }},
    }};
    unsigned max_err = 0;
    for(unsigned k = 0; k < exact_data.size(); k++)

Modified: sandbox/big_number/libs/multiprecision/test/test_atan.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/test_atan.cpp (original)
+++ sandbox/big_number/libs/multiprecision/test/test_atan.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -123,7 +123,7 @@
          "1.570796326794896619231321691639751442098584699687552910487472296153908203143104499314017412671058533891074043256641153323546922304775291115862679704064240558725142051350969260552779822311474477465190982214405487832966723064237824116893391582635600954572824283461730174305227163324106696803630124570637195626836636491127420774093793814747960379191015517279628513338998598607743566594025406809304089138",
    }};
 
- T arg = "1e-100";
+ T arg = static_cast<T>("1e-100");
 
    unsigned max_err = 0;
    for(unsigned k = 0; k < data.size(); k++)
@@ -149,7 +149,7 @@
    //
    // And again, but test all the phases of atan2:
    //
- arg = "1e-100";
+ arg = static_cast<T>("1e-100");
    unsigned err;
    for(unsigned k = 0; k < data.size(); k++)
    {

Modified: sandbox/big_number/libs/multiprecision/test/test_constants.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/test_constants.cpp (original)
+++ sandbox/big_number/libs/multiprecision/test/test_constants.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -172,13 +172,13 @@
    typedef typename T::backend_type backend_type;
    T num, expect;
    num.backend() = boost::multiprecision::default_ops::get_constant_pi<backend_type>();
- expect = pi;
+ expect = static_cast<T>(pi);
    BOOST_CHECK_CLOSE_FRACTION(num, expect, std::numeric_limits<T>::epsilon() * (is_mpfr(num) ? 1200 : 2));
    num.backend() = boost::multiprecision::default_ops::get_constant_ln2<backend_type>();
- expect = ln2;
+ expect = static_cast<T>(ln2);
    BOOST_CHECK_CLOSE_FRACTION(num, expect, std::numeric_limits<T>::epsilon() * (is_mpfr(num) ? 30 : 1));
    num.backend() = boost::multiprecision::default_ops::get_constant_e<backend_type>();
- expect = e;
+ expect = static_cast<T>(e);
    BOOST_CHECK_CLOSE_FRACTION(num, expect, std::numeric_limits<T>::epsilon() * (is_mpfr(num) ? 2 : 1));
 }
 

Modified: sandbox/big_number/libs/multiprecision/test/test_cos.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/test_cos.cpp (original)
+++ sandbox/big_number/libs/multiprecision/test/test_cos.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -155,7 +155,7 @@
    boost::uintmax_t max_err = 0;
    for(unsigned k = 0; k < data.size(); k++)
    {
- static const T euler_gamma = "5.77215664901532860606512090082402431042159335939923598805767234884867726777664670936947063291746749514631447249807082480960504014486542836224173997644923536253500333742937337737673942792595258247094916008735203948165670853233151776611528621199501507984793745085705740029921354786146694029604325421519e-1";
+ static const T euler_gamma = static_cast<T>("5.77215664901532860606512090082402431042159335939923598805767234884867726777664670936947063291746749514631447249807082480960504014486542836224173997644923536253500333742937337737673942792595258247094916008735203948165670853233151776611528621199501507984793745085705740029921354786146694029604325421519e-1");
       T val = cos(euler_gamma * ((100 * k) - 5000));
       T e = relative_error(val, T(data[k]));
       unsigned err = e.template convert_to<unsigned>();
@@ -225,12 +225,12 @@
          "0.09655529472977379853549858833033074225823562054271495313739665642376685099661084023094270272485976247900824483810911634635819558334630910267353320029261330296977292720266655308513559530586843550229208517388789783011887450865488554143475302590353915732321663418057567573042594801866258948380684000769091353165879953111046260532796891917772727185993569684246844052518121013717183610828519193371796413317",
    }};
 
- T half_pi = "1.57079632679489661923132169163975144209858469968755291048747229615390820314310449931401741267105853399107404325664115332354692230477529111586267970406424055872514205135096926055277982231147447746519098221440548783296672306423782411689339158263560095457282428346173017430522716332410669680363012457064";
+ T half_pi = static_cast<T>("1.57079632679489661923132169163975144209858469968755291048747229615390820314310449931401741267105853399107404325664115332354692230477529111586267970406424055872514205135096926055277982231147447746519098221440548783296672306423782411689339158263560095457282428346173017430522716332410669680363012457064");
 
    max_err = 0;
    for(unsigned k = 0; k < near_one.size(); k++)
    {
- static const T euler_gamma = "5.77215664901532860606512090082402431042159335939923598805767234884867726777664670936947063291746749514631447249807082480960504014486542836224173997644923536253500333742937337737673942792595258247094916008735203948165670853233151776611528621199501507984793745085705740029921354786146694029604325421519e-1";
+ static const T euler_gamma = static_cast<T>("5.77215664901532860606512090082402431042159335939923598805767234884867726777664670936947063291746749514631447249807082480960504014486542836224173997644923536253500333742937337737673942792595258247094916008735203948165670853233151776611528621199501507984793745085705740029921354786146694029604325421519e-1");
       T val = cos(half_pi - (euler_gamma + k) / 523);
       T e = relative_error(val, T(near_one[k]));
       unsigned err = e.template convert_to<unsigned>();
@@ -251,14 +251,14 @@
    //
    static const boost::array<boost::array<T, 2>, 8> exact_data =
    {{
- {{ 0.5, "0.877582561890372716116281582603829651991645197109744052997610868315950763274213947405794184084682258355478400593109053993" }},
- {{ 0.25, "0.968912421710644784144595449494189199804134190287442831148128124288942561184523327264655202799685025510352709626116202617" }},
- {{0.75, "0.731688868873820886311838753000084543840541276050772482507683220220750082501569499540967562610201174960122884908227300721" }},
- {{std::ldexp(1.0, -20), "0.99999999999954525264911357034690133684385823577463126432241468890539365027135494672267164697779879113636143901797362388" }},
- {{ 2, "-0.416146836547142386997568229500762189766000771075544890755149973781964936124079169074531777860169140367366791365215728559" }},
- {{ 5, "0.283662185463226264466639171513557308334422592252215944930359066586151456767382702286176981668344573238827368717546699737" }},
- {{ 10, "-0.839071529076452452258863947824064834519930165133168546835953731048792586866270768400933712760422138927451054405350243624" }},
- {{ 8.5, "-0.60201190268482361534842652295699870029606776360435523539636606145572515876770619546025351418378467287262574566665150299" }}
+ {{ 0.5, static_cast<T>("0.877582561890372716116281582603829651991645197109744052997610868315950763274213947405794184084682258355478400593109053993") }},
+ {{ 0.25, static_cast<T>("0.968912421710644784144595449494189199804134190287442831148128124288942561184523327264655202799685025510352709626116202617") }},
+ {{0.75, static_cast<T>("0.731688868873820886311838753000084543840541276050772482507683220220750082501569499540967562610201174960122884908227300721") }},
+ {{std::ldexp(1.0, -20), static_cast<T>("0.99999999999954525264911357034690133684385823577463126432241468890539365027135494672267164697779879113636143901797362388") }},
+ {{ 2, static_cast<T>("-0.416146836547142386997568229500762189766000771075544890755149973781964936124079169074531777860169140367366791365215728559") }},
+ {{ 5, static_cast<T>("0.283662185463226264466639171513557308334422592252215944930359066586151456767382702286176981668344573238827368717546699737") }},
+ {{ 10, static_cast<T>("-0.839071529076452452258863947824064834519930165133168546835953731048792586866270768400933712760422138927451054405350243624") }},
+ {{ 8.5, static_cast<T>("-0.60201190268482361534842652295699870029606776360435523539636606145572515876770619546025351418378467287262574566665150299") }}
    }};
    max_err = 0;
    for(unsigned k = 0; k < exact_data.size(); k++)

Modified: sandbox/big_number/libs/multiprecision/test/test_cosh.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/test_cosh.cpp (original)
+++ sandbox/big_number/libs/multiprecision/test/test_cosh.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -102,7 +102,7 @@
            "4.4466189016791091516801723880812533528438597080549410911235655611382010503145789286158745555771483577943662768773465284793798720178177605712848440200402906836390133865748188969184005230383247111166918721449908133920663776952786683837038180436264738937354101153867171804315769471050303182129269442292354388037298125177941217926845803005587166270803697433886463469168814941555804311717400657004050157245e1110",
    }};
 
- T eg = "5.77215664901532860606512090082402431042159335939923598805767234884867726777664670936947063291746749514631447249807082480960504014486542836224173997644923536253500333742937337737673942792595258247094916008735203948165670853233151776611528621199501507984793745085705740029921354786146694029604325421519e-1";
+ T eg = static_cast<T>("5.77215664901532860606512090082402431042159335939923598805767234884867726777664670936947063291746749514631447249807082480960504014486542836224173997644923536253500333742937337737673942792595258247094916008735203948165670853233151776611528621199501507984793745085705740029921354786146694029604325421519e-1");
 
    unsigned max_err = 0;
    for(unsigned k = 0; k < data.size(); k++)

Modified: sandbox/big_number/libs/multiprecision/test/test_cpp_int.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/test_cpp_int.cpp (original)
+++ sandbox/big_number/libs/multiprecision/test/test_cpp_int.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -72,10 +72,10 @@
       int si = d.convert_to<int>();
       unsigned ui = si;
 
- test_type a1 = a.str();
- test_type b1 = b.str();
- test_type c1 = c.str();
- test_type d1 = d.str();
+ test_type a1 = static_cast<test_type>(a.str());
+ test_type b1 = static_cast<test_type>(b.str());
+ test_type c1 = static_cast<test_type>(c.str());
+ test_type d1 = static_cast<test_type>(d.str());
 
       BOOST_CHECK_EQUAL(a.str(), a1.str());
       BOOST_CHECK_EQUAL(b.str(), b1.str());

Modified: sandbox/big_number/libs/multiprecision/test/test_exp.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/test_exp.cpp (original)
+++ sandbox/big_number/libs/multiprecision/test/test_exp.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -102,7 +102,7 @@
       "6.83336127500041943234365059231968669406267422759442985746460610830503287734479988530512309065240678799786759250323660701e3848",
    }};
 
- T pi = "3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273724587006606315588174881520920962829254091715364367892590360011330530548820466521384146951941511609";
+ T pi = static_cast<T>("3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273724587006606315588174881520920962829254091715364367892590360011330530548820466521384146951941511609");
 
    unsigned max_err = 0;
    for(unsigned k = 0; k < data.size(); k++)
@@ -127,16 +127,16 @@
 
    static const boost::array<boost::array<T, 2>, 10> exact_data =
    {{
- {{ std::ldexp(1.0, -50), "1.00000000000000088817841970012562676935794497867573073630970950828771105957980924149923657574337470594698012676100224953" }},
- {{ std::ldexp(1.0, -20), "1.00000095367477115374544678824955687428365188553281789775169686343569285229334215539516690752571791280462887427635269562" }},
- {{ std::ldexp(1.0, -10), "1.00097703949241653524284529261160650646585162918174419940186408264916250428896869173656853690882467186075613761065459261" }},
- {{ 0.25, "1.28402541668774148407342056806243645833628086528146308921750729687220776586723800275330641943955356890166283174967968731" }},
- {{ 0.5, "1.64872127070012814684865078781416357165377610071014801157507931164066102119421560863277652005636664300286663775630779700" }},
- {{ 0.75, "2.11700001661267466854536981983709561013449158470240342177913303081098453336401282000279156026661579821888590471901551426" }},
- {{ 10, "22026.4657948067165169579006452842443663535126185567810742354263552252028185707925751991209681645258954515555010924578367" }},
- {{ 10.5, "36315.5026742466377389120269013166179689315579671275857607480190550842856628099187749764427758174866310742771977376827512" }},
- {{ 25, "7.20048993373858725241613514661261579152235338133952787362213864472320593107782569745000325654258093194727871848859163684e10" }},
- {{ 31.25, "3.72994612957188849046766396046821396700589012875701157893019118883826370993674081486706667149871508642909416337810227575e13" }},
+ {{ std::ldexp(1.0, -50), static_cast<T>("1.00000000000000088817841970012562676935794497867573073630970950828771105957980924149923657574337470594698012676100224953") }},
+ {{ std::ldexp(1.0, -20), static_cast<T>("1.00000095367477115374544678824955687428365188553281789775169686343569285229334215539516690752571791280462887427635269562") }},
+ {{ std::ldexp(1.0, -10), static_cast<T>("1.00097703949241653524284529261160650646585162918174419940186408264916250428896869173656853690882467186075613761065459261") }},
+ {{ 0.25, static_cast<T>("1.28402541668774148407342056806243645833628086528146308921750729687220776586723800275330641943955356890166283174967968731") }},
+ {{ 0.5, static_cast<T>("1.64872127070012814684865078781416357165377610071014801157507931164066102119421560863277652005636664300286663775630779700") }},
+ {{ 0.75, static_cast<T>("2.11700001661267466854536981983709561013449158470240342177913303081098453336401282000279156026661579821888590471901551426") }},
+ {{ 10, static_cast<T>("22026.4657948067165169579006452842443663535126185567810742354263552252028185707925751991209681645258954515555010924578367") }},
+ {{ 10.5, static_cast<T>("36315.5026742466377389120269013166179689315579671275857607480190550842856628099187749764427758174866310742771977376827512") }},
+ {{ 25, static_cast<T>("7.20048993373858725241613514661261579152235338133952787362213864472320593107782569745000325654258093194727871848859163684e10") }},
+ {{ 31.25, static_cast<T>("3.72994612957188849046766396046821396700589012875701157893019118883826370993674081486706667149871508642909416337810227575e13") }},
    }};
 
    max_err = 0;

Modified: sandbox/big_number/libs/multiprecision/test/test_float_io.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/test_float_io.cpp (original)
+++ sandbox/big_number/libs/multiprecision/test/test_float_io.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -172,18 +172,18 @@
       BOOST_CHECK_EQUAL(val.str(), "-inf");
       BOOST_CHECK_EQUAL(val.str(0, std::ios_base::showpos), "-inf");
 
- val = "inf";
+ val = static_cast<T>("inf");
       BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());
- val = "+inf";
+ val = static_cast<T>("+inf");
       BOOST_CHECK_EQUAL(val, std::numeric_limits<T>::infinity());
- val = "-inf";
+ val = static_cast<T>("-inf");
       BOOST_CHECK_EQUAL(val, -std::numeric_limits<T>::infinity());
    }
    if(std::numeric_limits<mp_t>::has_quiet_NaN)
    {
       T val = std::numeric_limits<T>::quiet_NaN();
       BOOST_CHECK_EQUAL(val.str(), "nan");
- val = "nan";
+ val = static_cast<T>("nan");
       BOOST_CHECK(boost::math::isnan(val));
    }
 }
@@ -246,9 +246,9 @@
 #endif
    ss.flags(f);
    ss << val;
- T new_val = ss.str();
+ T new_val = static_cast<T>(ss.str());
    BOOST_CHECK_EQUAL(new_val, val);
- new_val = val.str(0, f);
+ new_val = static_cast<T>(val.str(0, f));
    BOOST_CHECK_EQUAL(new_val, val);
 }
 

Modified: sandbox/big_number/libs/multiprecision/test/test_generic_conv.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/test_generic_conv.cpp (original)
+++ sandbox/big_number/libs/multiprecision/test/test_generic_conv.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -91,18 +91,18 @@
       dec_float_500 tol("1e-500");
 #ifdef TEST_GMP
       mpf = df;
- mpf2 = df.str();
+ mpf2 = static_cast<mpf_type>(df.str());
       BOOST_CHECK_EQUAL(mpf, mpf2);
       df = mpf;
- df2 = mpf.str();
+ df2 = static_cast<dec_float_500>(mpf.str());
       BOOST_CHECK(fabs((df - df2) / df) < tol);
 #endif
 #ifdef TEST_MPFR
       mpfr = df;
- mpfr2 = df.str();
+ mpfr2 = static_cast<mpfr_type>(df.str());
       BOOST_CHECK_EQUAL(mpfr, mpfr2);
       df = mpfr;
- df2 = mpfr.str();
+ df2 = static_cast<dec_float_500>(mpfr.str());
       BOOST_CHECK(fabs((df - df2) / df) < tol);
 #endif
       //
@@ -124,12 +124,12 @@
       //
 #ifdef TEST_GMP
       mpq = c;
- mpq_rational mpq2 = c.str();
+ mpq_rational mpq2 = static_cast<mpq_rational>(c.str());
       BOOST_CHECK_EQUAL(mpq, mpq2);
 #endif
 #ifdef TEST_TOMMATH
       tr = c;
- tom_rational tr2 = c.str();
+ tom_rational tr2 = static_cast<tom_rational>(c.str());
       BOOST_CHECK_EQUAL(tr, tr2);
 #endif
       //

Modified: sandbox/big_number/libs/multiprecision/test/test_gmp_conversions.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/test_gmp_conversions.cpp (original)
+++ sandbox/big_number/libs/multiprecision/test/test_gmp_conversions.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -101,13 +101,13 @@
    rat = 2;
    BOOST_TEST(mpz_int(rat) == 2);
    iz = 3;
- iz = f0;
+ iz = static_cast<mpz_int>(f0);
    BOOST_TEST(iz == 2);
    iz = 3;
- iz = f50;
+ iz = static_cast<mpz_int>(f50);
    BOOST_TEST(iz == 2);
    iz = 3;
- iz = rat;
+ iz = static_cast<mpz_int>(rat);
    BOOST_TEST(iz == 2);
 
    BOOST_TEST(mpq_rational(mpz) == 2);

Modified: sandbox/big_number/libs/multiprecision/test/test_int_io.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/test_int_io.cpp (original)
+++ sandbox/big_number/libs/multiprecision/test/test_int_io.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -66,9 +66,9 @@
 #endif
    ss.flags(f);
    ss << val;
- T new_val = ss.str();
+ T new_val = static_cast<T>(ss.str());
    BOOST_CHECK_EQUAL(new_val, val);
- new_val = val.str(0, f);
+ new_val = static_cast<T>(val.str(0, f));
    BOOST_CHECK_EQUAL(new_val, val);
 }
 

Modified: sandbox/big_number/libs/multiprecision/test/test_log.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/test_log.cpp (original)
+++ sandbox/big_number/libs/multiprecision/test/test_log.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -152,7 +152,7 @@
          "19.565410630120075532420489068555321524954362381908007338302983473268528473151341321768804731192210840056455228388636731122203200610869021021871133154865620432257415783302175345843898977949742849569372169004904667621738405749986270376895267386643049526766451459390277406632576412790748533372863644721976845168460840162066672290292749672668879524315410824251032084115058493720402881895485689493165441193",
    }};
 
- T pi = "3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273724587006606315588174881520920962829254091715364367892590360011330530548820466521384146951941511609";
+ T pi = static_cast<T>("3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273724587006606315588174881520920962829254091715364367892590360011330530548820466521384146951941511609");
    T tenth = 1;
    tenth /= 10;
    T logten = log(T(10));

Modified: sandbox/big_number/libs/multiprecision/test/test_rational_io.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/test_rational_io.cpp (original)
+++ sandbox/big_number/libs/multiprecision/test/test_rational_io.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -9,9 +9,10 @@
 # define _SCL_SECURE_NO_WARNINGS
 #endif
 
-#if !defined(TEST_MPQ) && !defined(TEST_TOMMATH)
+#if !defined(TEST_MPQ) && !defined(TEST_TOMMATH) && !defined(TEST_CPP_INT)
 # define TEST_MPQ
 # define TEST_TOMMATH
+# define TEST_CPP_INT
 
 #ifdef _MSC_VER
 #pragma message("CAUTION!!: No backend type specified so testing everything.... this will take some time!!")
@@ -28,6 +29,9 @@
 #if defined(TEST_TOMMATH)
 #include <boost/multiprecision/tommath.hpp>
 #endif
+#ifdef TEST_CPP_INT
+#include <boost/multiprecision/cpp_int.hpp>
+#endif
 
 #include <boost/algorithm/string/case_conv.hpp>
 #include <boost/random/mersenne_twister.hpp>
@@ -71,9 +75,9 @@
 #endif
    ss.flags(f);
    ss << val;
- T new_val = ss.str();
+ T new_val = static_cast<T>(ss.str());
    BOOST_CHECK_EQUAL(new_val, val);
- new_val = val.str(0, f);
+ new_val = static_cast<T>(val.str(0, f));
    BOOST_CHECK_EQUAL(new_val, val);
 }
 
@@ -133,6 +137,10 @@
    test_round_trip<boost::rational<boost::multiprecision::tom_int> >();
    test_round_trip<boost::multiprecision::tom_rational >();
 #endif
+#ifdef TEST_CPP_INT
+ test_round_trip<boost::rational<boost::multiprecision::cpp_int> >();
+ test_round_trip<boost::multiprecision::cpp_rational >();
+#endif
    return boost::report_errors();
 }
 

Modified: sandbox/big_number/libs/multiprecision/test/test_sin.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/test_sin.cpp (original)
+++ sandbox/big_number/libs/multiprecision/test/test_sin.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -155,7 +155,7 @@
    boost::uintmax_t max_err = 0;
    for(unsigned k = 0; k < data.size(); k++)
    {
- static const T euler_gamma = "5.77215664901532860606512090082402431042159335939923598805767234884867726777664670936947063291746749514631447249807082480960504014486542836224173997644923536253500333742937337737673942792595258247094916008735203948165670853233151776611528621199501507984793745085705740029921354786146694029604325421519e-1";
+ static const T euler_gamma = static_cast<T>("5.77215664901532860606512090082402431042159335939923598805767234884867726777664670936947063291746749514631447249807082480960504014486542836224173997644923536253500333742937337737673942792595258247094916008735203948165670853233151776611528621199501507984793745085705740029921354786146694029604325421519e-1");
       T val = sin(euler_gamma * ((100 * k) - 5000));
       T e = relative_error(val, T(data[k]));
       unsigned err = e.template convert_to<unsigned>();
@@ -228,7 +228,7 @@
    max_err = 0;
    for(unsigned k = 0; k < small_data.size(); k++)
    {
- static const T euler_gamma = "5.77215664901532860606512090082402431042159335939923598805767234884867726777664670936947063291746749514631447249807082480960504014486542836224173997644923536253500333742937337737673942792595258247094916008735203948165670853233151776611528621199501507984793745085705740029921354786146694029604325421519e-1";
+ static const T euler_gamma = static_cast<T>("5.77215664901532860606512090082402431042159335939923598805767234884867726777664670936947063291746749514631447249807082480960504014486542836224173997644923536253500333742937337737673942792595258247094916008735203948165670853233151776611528621199501507984793745085705740029921354786146694029604325421519e-1");
       T val = sin((euler_gamma + k) / 53);
       T e = relative_error(val, T(small_data[k]));
       unsigned err = e.template convert_to<unsigned>();
@@ -252,15 +252,15 @@
    //
    static const boost::array<boost::array<T, 2>, 9> exact_data =
    {{
- {{ 0.5, "0.479425538604203000273287935215571388081803367940600675188616613125535000287814832209631274684348269086132091084505717418" }},
- {{ 0.25, "0.247403959254522929596848704849389195893390980386965810676544830494398136043486821690984848527973792338327197752176516138" }},
- {{0.75, "0.681638760023334166733241952779893935338382394659229909213625262151100388887003782753145274849781911981438190343146876189" }},
- {{std::ldexp(1.0, -20), "9.53674316406105439710335272649306549801506698739838753888815787489707114648106832493113326022411646219016312547902694921e-7" }},
- {{ 2, "0.909297426825681695396019865911744842702254971447890268378973011530967301540783544620126688924959380309967896742399486261" }},
- {{ 5, "-0.958924274663138468893154406155993973352461543964601778131672454235102558086559603076995955429532866596530638461663378937" }},
- {{ 10, "-0.544021110889369813404747661851377281683643012916223891574184012616757209640493425707075673894983216158293824238262832286" }},
+ {{ 0.5, static_cast<T>("0.479425538604203000273287935215571388081803367940600675188616613125535000287814832209631274684348269086132091084505717418") }},
+ {{ 0.25, static_cast<T>("0.247403959254522929596848704849389195893390980386965810676544830494398136043486821690984848527973792338327197752176516138") }},
+ {{0.75, static_cast<T>("0.681638760023334166733241952779893935338382394659229909213625262151100388887003782753145274849781911981438190343146876189") }},
+ {{std::ldexp(1.0, -20), static_cast<T>("9.53674316406105439710335272649306549801506698739838753888815787489707114648106832493113326022411646219016312547902694921e-7") }},
+ {{ 2, static_cast<T>("0.909297426825681695396019865911744842702254971447890268378973011530967301540783544620126688924959380309967896742399486261") }},
+ {{ 5, static_cast<T>("-0.958924274663138468893154406155993973352461543964601778131672454235102558086559603076995955429532866596530638461663378937") }},
+ {{ 10, static_cast<T>("-0.544021110889369813404747661851377281683643012916223891574184012616757209640493425707075673894983216158293824238262832286") }},
       {{ 0, 0 }},
- {{ "1.57079632679489661923132169163975144209858469968755291048747229615390820314310449931401741267105853399107404325664115332354692230477529111586267970406424055872514205135096926055277982231147447746519098221440548783296672306423782411689339158263560095457282428346173017430522716332410669680363012457064", 1 }}
+ {{ static_cast<T>("1.57079632679489661923132169163975144209858469968755291048747229615390820314310449931401741267105853399107404325664115332354692230477529111586267970406424055872514205135096926055277982231147447746519098221440548783296672306423782411689339158263560095457282428346173017430522716332410669680363012457064"), 1 }}
    }};
    max_err = 0;
    for(unsigned k = 0; k < exact_data.size(); k++)

Modified: sandbox/big_number/libs/multiprecision/test/test_sinh.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/test_sinh.cpp (original)
+++ sandbox/big_number/libs/multiprecision/test/test_sinh.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -102,7 +102,7 @@
       "4.4466189016791091516801723880812533528438597080549410911235655611382010503145789286158745555771483577943662768773465284793798720178177605712848440200402906836390133865748188969184005230383247111166918721449908133920663776952786683837038180436264738937354101153867171804315769471050303182129269442292354388037298125177941217926845803005587166270803697433886463469168814941555804311717400657004050157245e1110",
    }};
 
- T eg = "5.77215664901532860606512090082402431042159335939923598805767234884867726777664670936947063291746749514631447249807082480960504014486542836224173997644923536253500333742937337737673942792595258247094916008735203948165670853233151776611528621199501507984793745085705740029921354786146694029604325421519e-1";
+ T eg = static_cast<T>("5.77215664901532860606512090082402431042159335939923598805767234884867726777664670936947063291746749514631447249807082480960504014486542836224173997644923536253500333742937337737673942792595258247094916008735203948165670853233151776611528621199501507984793745085705740029921354786146694029604325421519e-1");
 
    unsigned max_err = 0;
    for(unsigned k = 0; k < data.size(); k++)

Modified: sandbox/big_number/libs/multiprecision/test/test_sqrt.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/test_sqrt.cpp (original)
+++ sandbox/big_number/libs/multiprecision/test/test_sqrt.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -152,7 +152,7 @@
            "17.72453850905516027298167483341145182797549456122387128213807789852911284591032181374950656738544665416226823624282570666236152865724422602525093709602787068462037698653105122849925173028950826228932095379267962800174639015351479720516700190185234018585446974494912640313921775525906216405419332500906398407613733477475153433667989789365851836408795451165161738760059067393431791332809854846248184902054654852195613251561647467515042738761056107996127107210060372044483672365296613708094323498831668424213845709609120420427785778068694766570005218305685125413396636944654181510716693883321942929357062268865224420542149948049920756486398874838505930640218214029285811233064978945203621149078962287389403245978198513134871266512506293260044656382109675026812496930595420461560761952217391525070207792758099054332900662223067614469661248188743069978835205061464443854185307973574257179185635959749959952263849242203889103966406447293972841345043002140564233433039261756134176336320017037654163476320669276541812
83576249032690450848532013419243598973087119379948293873011126256165881888478597787596376136",
    }};
 
- T pi = "3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572
0106548586327886593615338182796823030195203530185296899577362259941389124972177528347913152";
+ T pi = static_cast<T>("3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164
2019893809525720106548586327886593615338182796823030195203530185296899577362259941389124972177528347913152");
 
    unsigned max_err = 0;
    for(unsigned k = 0; k < data.size(); k++)

Modified: sandbox/big_number/libs/multiprecision/test/test_tanh.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/test_tanh.cpp (original)
+++ sandbox/big_number/libs/multiprecision/test/test_tanh.cpp 2012-08-16 04:13:51 EDT (Thu, 16 Aug 2012)
@@ -102,7 +102,7 @@
          "1.",
    }};
 
- T eg = "5.77215664901532860606512090082402431042159335939923598805767234884867726777664670936947063291746749514631447249807082480960504014486542836224173997644923536253500333742937337737673942792595258247094916008735203948165670853233151776611528621199501507984793745085705740029921354786146694029604325421519e-1";
+ T eg = static_cast<T>("5.77215664901532860606512090082402431042159335939923598805767234884867726777664670936947063291746749514631447249807082480960504014486542836224173997644923536253500333742937337737673942792595258247094916008735203948165670853233151776611528621199501507984793745085705740029921354786146694029604325421519e-1");
 
    unsigned max_err = 0;
    for(unsigned k = 0; k < data.size(); k++)


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