$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r80112 - in sandbox/big_number: boost/multiprecision boost/multiprecision/detail libs/multiprecision/test libs/multiprecision/test/compile_fail libs/multiprecision/test/math
From: john_at_[hidden]
Date: 2012-08-21 10:42:18
Author: johnmaddock
Date: 2012-08-21 10:42:15 EDT (Tue, 21 Aug 2012)
New Revision: 80112
URL: http://svn.boost.org/trac/boost/changeset/80112
Log:
Add more explicit constructors and tests for them.
Centralise digits10 to digits2 conversions.
Added:
   sandbox/big_number/boost/multiprecision/detail/digits.hpp   (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_01.cpp
      - copied unchanged from r80058, /sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_1.cpp
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_02.cpp
      - copied unchanged from r80058, /sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_2.cpp
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_03.cpp
      - copied unchanged from r80058, /sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_3.cpp
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_04.cpp
      - copied unchanged from r80058, /sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_4.cpp
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_05.cpp
      - copied unchanged from r80058, /sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_5.cpp
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_06.cpp
      - copied unchanged from r80058, /sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_6.cpp
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_07.cpp
      - copied unchanged from r80058, /sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_7.cpp
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_08.cpp
      - copied unchanged from r80058, /sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_8.cpp
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_09.cpp
      - copied unchanged from r80058, /sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_9.cpp
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_49.cpp   (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_50.cpp   (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_51.cpp   (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_52.cpp   (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_53.cpp   (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_54.cpp   (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_55.cpp   (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_56.cpp   (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_57.cpp   (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_58.cpp   (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/test_cpp_dec_float_conv.cpp   (contents, props changed)
   sandbox/big_number/libs/multiprecision/test/test_cpp_int_conv.cpp   (contents, props changed)
Removed:
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_1.cpp
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_2.cpp
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_3.cpp
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_4.cpp
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_5.cpp
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_6.cpp
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_7.cpp
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_8.cpp
   sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_9.cpp
Text files modified: 
   sandbox/big_number/boost/multiprecision/cpp_dec_float.hpp             |    28 ++++++++                                
   sandbox/big_number/boost/multiprecision/cpp_int.hpp                   |    76 +++++++++++++++++++++++++               
   sandbox/big_number/boost/multiprecision/gmp.hpp                       |    79 +++++++++++++------------               
   sandbox/big_number/boost/multiprecision/mpfr.hpp                      |   121 +++++++++++++++++++++++++-------------- 
   sandbox/big_number/boost/multiprecision/number.hpp                    |    22 +-----                                  
   sandbox/big_number/libs/multiprecision/test/Jamfile.v2                |     4                                         
   sandbox/big_number/libs/multiprecision/test/math/test_bessel_j.cpp    |     2                                         
   sandbox/big_number/libs/multiprecision/test/math/test_bessel_y.cpp    |     2                                         
   sandbox/big_number/libs/multiprecision/test/math/test_erf.cpp         |     2                                         
   sandbox/big_number/libs/multiprecision/test/math/test_gamma.cpp       |     2                                         
   sandbox/big_number/libs/multiprecision/test/math/test_legendre.cpp    |     2                                         
   sandbox/big_number/libs/multiprecision/test/test_cos.cpp              |     2                                         
   sandbox/big_number/libs/multiprecision/test/test_cpp_int.cpp          |     6                                         
   sandbox/big_number/libs/multiprecision/test/test_generic_conv.cpp     |    32 +++++-----                              
   sandbox/big_number/libs/multiprecision/test/test_mpfr_conversions.cpp |    18 +++++                                   
   15 files changed, 269 insertions(+), 129 deletions(-)
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-21 10:42:15 EDT (Tue, 21 Aug 2012)
@@ -192,15 +192,25 @@
       prec_elem(f.prec_elem) { }
 
    template <unsigned D>
-   cpp_dec_float(const cpp_dec_float<D>& f) BOOST_NOEXCEPT : 
+   cpp_dec_float(const cpp_dec_float<D>& f, typename enable_if_c<D <= Digits10>::type* = 0) BOOST_NOEXCEPT : 
+      data(),
+      exp      (f.exp),
+      neg      (f.neg),
+      fpclass  (static_cast<fpclass_type>(static_cast<int>(f.fpclass))),
+      prec_elem(cpp_dec_float_elem_number)
+   {
+      std::copy(f.data.begin(), f.data.begin() + f.prec_elem, data.begin());
+   }
+   template <unsigned D>
+   explicit cpp_dec_float(const cpp_dec_float<D>& f, typename disable_if_c<D <= Digits10>::type* = 0) BOOST_NOEXCEPT : 
+      data(),
       exp      (f.exp),
       neg      (f.neg),
       fpclass  (static_cast<fpclass_type>(static_cast<int>(f.fpclass))),
       prec_elem(cpp_dec_float_elem_number)
    {
       // TODO: this doesn't round!
-      std::copy(f.data.begin(), f.data.begin() + (std::min)(f.prec_elem, prec_elem), data.begin());
-      precision((std::min)(f.prec_elem, prec_elem));
+      std::copy(f.data.begin(), f.data.begin() + prec_elem, data.begin());
    }
 
    template <class F>
@@ -2855,6 +2865,18 @@
 typedef number<cpp_dec_float<50> > cpp_dec_float_50;
 typedef number<cpp_dec_float<100> > cpp_dec_float_100;
 
+#ifdef BOOST_NO_SFINAE_EXPR
+
+namespace detail{
+
+template<unsigned D1, unsigned D2>
+struct is_explicitly_convertible<cpp_dec_float<D1>, cpp_dec_float<D2> > : public mpl::true_ {};
+
+}
+
+#endif
+
+
 }}
 
 namespace std
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-21 10:42:15 EDT (Tue, 21 Aug 2012)
@@ -683,6 +683,10 @@
 #ifndef BOOST_NO_RVALUE_REFERENCES
    BOOST_FORCEINLINE BOOST_CONSTEXPR cpp_int_backend(cpp_int_backend&& o) BOOST_NOEXCEPT : base_type(static_cast<base_type&&>(o)) {}
 #endif
+   //
+   // These are templates, so that only args that are *exactly* the types specified are allowed, and conversions
+   // are not considered.  Without this, conversions may be ambiguous.
+   //
    template <class LT>
    BOOST_FORCEINLINE BOOST_CONSTEXPR cpp_int_backend(LT i, typename enable_if<is_same<LT, limb_type> >::type const* = 0)BOOST_NOEXCEPT 
       : base_type(i) {}
@@ -697,6 +701,67 @@
    BOOST_FORCEINLINE BOOST_CONSTEXPR cpp_int_backend(SLT i, typename enable_if<is_same<SLT, signed_double_limb_type> >::type const* = 0)BOOST_NOEXCEPT 
       : base_type(i) {}
 #endif
+   
+   template <unsigned MinBits2, bool Signed2, class Allocator2>
+   cpp_int_backend(const cpp_int_backend<MinBits2, Signed2, Allocator2, true>& other) 
+      : base_type()
+   {
+       *this = static_cast<
+            typename detail::canonical<
+               typename cpp_int_backend<MinBits2, Signed2, Allocator2, true>::local_limb_type, 
+               cpp_int_backend<MinBits, Signed, Allocator, false> 
+            >::type
+         >(*other.limbs());
+      this->sign(other.sign());
+   }
+   template <unsigned MinBits2, bool Signed2, class Allocator2>
+   cpp_int_backend& operator=(const cpp_int_backend<MinBits2, Signed2, Allocator2, true>& other) 
+   {
+       *this = static_cast<
+            typename detail::canonical<
+               typename cpp_int_backend<MinBits2, Signed2, Allocator2, true>::local_limb_type, 
+               cpp_int_backend<MinBits, Signed, Allocator, false> 
+            >::type
+         >(*other.limbs());
+      this->sign(other.sign());
+      return *this;
+   }
+
+   template <unsigned MinBits2, bool Signed2, class Allocator2>
+   cpp_int_backend(const cpp_int_backend<MinBits2, Signed2, Allocator2, false>& other, 
+      typename enable_if_c<
+         (Signed || !Signed2) 
+         && (!is_void<Allocator>::value || (is_void<Allocator2>::value && (MinBits >= MinBits2)))
+      >::type* = 0) 
+      : base_type()
+   {
+      this->resize(other.size());
+      std::copy(other.limbs(), other.limbs() + (std::min)(other.size(), this->size()), this->limbs());
+      this->sign(other.sign());
+   }
+
+   template <unsigned MinBits2, bool Signed2, class Allocator2>
+   explicit cpp_int_backend(const cpp_int_backend<MinBits2, Signed2, Allocator2, false>& other, 
+      typename disable_if_c<
+         (Signed || !Signed2) 
+         && (!is_void<Allocator>::value || (is_void<Allocator2>::value && (MinBits >= MinBits2)))
+      >::type* = 0) 
+      : base_type()
+   {
+      this->resize(other.size());
+      std::copy(other.limbs(), other.limbs() + (std::min)(other.size(), this->size()), this->limbs());
+      this->sign(other.sign());
+   }
+
+   template <unsigned MinBits2, bool Signed2, class Allocator2>
+   cpp_int_backend& operator=(const cpp_int_backend<MinBits2, Signed2, Allocator2, false>& other)
+   {
+      this->resize(other.size());
+      std::copy(other.limbs(), other.limbs() + (std::min)(other.size(), this->size()), this->limbs());
+      this->sign(other.sign());
+      return *this;
+   }
+
    BOOST_FORCEINLINE cpp_int_backend& operator = (const cpp_int_backend& o) BOOST_NOEXCEPT_IF(boost::is_void<Allocator>::value)
    {
       this->assign(o);
@@ -2881,6 +2946,17 @@
 #pragma warning(pop)
 #endif
 
+#ifdef BOOST_NO_SFINAE_EXPR
+
+namespace detail{
+
+template<unsigned MinBits, bool Signed, class Allocator, bool trivial, unsigned MinBits2, bool Signed2, class Allocator2, bool trivial2>
+struct is_explicitly_convertible<cpp_int_backend<MinBits, Signed, Allocator, trivial>, cpp_int_backend<MinBits2, Signed2, Allocator2, trivial2> > : public mpl::true_ {};
+
+}
+
+#endif
+
 }} // namespaces
 
 #include <boost/multiprecision/detail/cpp_int_trivial_ops.hpp>
Added: sandbox/big_number/boost/multiprecision/detail/digits.hpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/boost/multiprecision/detail/digits.hpp	2012-08-21 10:42:15 EDT (Tue, 21 Aug 2012)
@@ -0,0 +1,23 @@
+///////////////////////////////////////////////////////////////
+//  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_DIGITS_HPP
+#define BOOST_MP_DIGITS_HPP
+
+namespace boost{ namespace multiprecision{ namespace detail{
+
+inline unsigned long digits10_2_2(unsigned long d10)
+{
+   return (d10 * 1000uL) / 301uL + ((d10 * 1000uL) % 301 ? 2u : 1u);
+}
+
+inline unsigned long digits2_2_10(unsigned long d2)
+{
+   return (d2 * 301uL) / 1000uL;
+}
+
+}}} // namespaces
+
+#endif
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-21 10:42:15 EDT (Tue, 21 Aug 2012)
@@ -9,6 +9,7 @@
 #include <boost/multiprecision/number.hpp>
 #include <boost/multiprecision/detail/integer_ops.hpp>
 #include <boost/multiprecision/detail/big_lanczos.hpp>
+#include <boost/multiprecision/detail/digits.hpp>
 #include <boost/math/special_functions/fpclassify.hpp>
 #include <boost/cstdint.hpp>
 #include <boost/lexical_cast.hpp>
@@ -67,7 +68,7 @@
       // to get the right value, but if it's then used in further calculations
       // things go badly wrong!!
       //
-      mpf_init2(m_data, (((digits10 ? digits10 : get_default_precision()) + 1) * 1000L) / 301L);
+      mpf_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : get_default_precision()));
       if(o.m_data[0]._mp_d)
          mpf_set(m_data, o.m_data);
    }
@@ -81,7 +82,7 @@
    gmp_float_imp& operator = (const gmp_float_imp& o)
    {
       if(m_data[0]._mp_d == 0)
-         mpf_init2(m_data, (((digits10 ? digits10 : get_default_precision()) + 1) * 1000L) / 301L);
+         mpf_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : get_default_precision()));
       if(o.m_data[0]._mp_d)
          mpf_set(m_data, o.m_data);
       return *this;
@@ -96,11 +97,11 @@
    gmp_float_imp& operator = (unsigned long long i)
    {
       if(m_data[0]._mp_d == 0)
-         mpf_init2(m_data, (((digits10 ? digits10 : get_default_precision()) + 1) * 1000L) / 301L);
+         mpf_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : get_default_precision()));
       unsigned long long mask = ((1uLL << std::numeric_limits<unsigned>::digits) - 1);
       unsigned shift = 0;
       mpf_t t;
-      mpf_init2(t, (((digits10 ? digits10 : get_default_precision()) + 1) * 1000L) / 301L);
+      mpf_init2(t, multiprecision::detail::digits10_2_2(digits10 ? digits10 : get_default_precision()));
       mpf_set_ui(m_data, 0);
       while(i)
       {
@@ -118,7 +119,7 @@
    {
       BOOST_MP_USING_ABS
       if(m_data[0]._mp_d == 0)
-         mpf_init2(m_data, (((digits10 ? digits10 : get_default_precision()) + 1) * 1000L) / 301L);
+         mpf_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : get_default_precision()));
       bool neg = i < 0;
       *this = static_cast<unsigned long long>(abs(i));
       if(neg)
@@ -128,21 +129,21 @@
    gmp_float_imp& operator = (unsigned long i) BOOST_NOEXCEPT
    {
       if(m_data[0]._mp_d == 0)
-         mpf_init2(m_data, (((digits10 ? digits10 : get_default_precision()) + 1) * 1000L) / 301L);
+         mpf_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : get_default_precision()));
       mpf_set_ui(m_data, i);
       return *this;
    }
    gmp_float_imp& operator = (long i) BOOST_NOEXCEPT
    {
       if(m_data[0]._mp_d == 0)
-         mpf_init2(m_data, (((digits10 ? digits10 : get_default_precision()) + 1) * 1000L) / 301L);
+         mpf_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : get_default_precision()));
       mpf_set_si(m_data, i);
       return *this;
    }
    gmp_float_imp& operator = (double d) BOOST_NOEXCEPT
    {
       if(m_data[0]._mp_d == 0)
-         mpf_init2(m_data, (((digits10 ? digits10 : get_default_precision()) + 1) * 1000L) / 301L);
+         mpf_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : get_default_precision()));
       mpf_set_d(m_data, d);
       return *this;
    }
@@ -153,7 +154,7 @@
       using std::floor;
 
       if(m_data[0]._mp_d == 0)
-         mpf_init2(m_data, (((digits10 ? digits10 : get_default_precision()) + 1) * 1000L) / 301L);
+         mpf_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : get_default_precision()));
 
       if (a == 0) {
          mpf_set_si(m_data, 0);
@@ -198,7 +199,7 @@
    gmp_float_imp& operator = (const char* s)
    {
       if(m_data[0]._mp_d == 0)
-         mpf_init2(m_data, (((digits10 ? digits10 : get_default_precision()) + 1) * 1000L) / 301L);
+         mpf_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : get_default_precision()));
       if(0 != mpf_set_str(m_data, s, 10))
          BOOST_THROW_EXCEPTION(std::runtime_error(std::string("The string \"") + s + std::string("\"could not be interpreted as a valid floating point number.")));
       return *this;
@@ -365,7 +366,7 @@
 {
    gmp_float()
    {
-      mpf_init2(this->m_data, ((digits10 + 1) * 1000L) / 301L);
+      mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(digits10));
    }
    gmp_float(const gmp_float& o) : detail::gmp_float_imp<digits10>(o) {}
    template <unsigned D>
@@ -376,17 +377,17 @@
    gmp_float(const gmp_rational& o);
    gmp_float(const mpf_t val)
    {
-      mpf_init2(this->m_data, ((digits10 + 1) * 1000L) / 301L);
+      mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(digits10));
       mpf_set(this->m_data, val);
    }
    gmp_float(const mpz_t val)
    {
-      mpf_init2(this->m_data, ((digits10 + 1) * 1000L) / 301L);
+      mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(digits10));
       mpf_set_z(this->m_data, val);
    }
    gmp_float(const mpq_t val)
    {
-      mpf_init2(this->m_data, ((digits10 + 1) * 1000L) / 301L);
+      mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(digits10));
       mpf_set_q(this->m_data, val);
    }
 #ifndef BOOST_NO_RVALUE_REFERENCES
@@ -411,21 +412,21 @@
    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_init2(this->m_data, multiprecision::detail::digits10_2_2(digits10));
       mpf_set(this->m_data, val);
       return *this;
    }
    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_init2(this->m_data, multiprecision::detail::digits10_2_2(digits10));
       mpf_set_z(this->m_data, val);
       return *this;
    }
    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);
+         mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(digits10));
       mpf_set_q(this->m_data, val);
       return *this;
    }
@@ -442,21 +443,21 @@
 {
    gmp_float()
    {
-      mpf_init2(this->m_data, ((get_default_precision() + 1) * 1000L) / 301L);
+      mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(get_default_precision()));
    }
    gmp_float(const mpf_t val)
    {
-      mpf_init2(this->m_data, ((get_default_precision() + 1) * 1000L) / 301L);
+      mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(get_default_precision()));
       mpf_set(this->m_data, val);
    }
    gmp_float(const mpz_t val)
    {
-      mpf_init2(this->m_data, ((get_default_precision() + 1) * 1000L) / 301L);
+      mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(get_default_precision()));
       mpf_set_z(this->m_data, val);
    }
    gmp_float(const mpq_t val)
    {
-      mpf_init2(this->m_data, ((get_default_precision() + 1) * 1000L) / 301L);
+      mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(get_default_precision()));
       mpf_set_q(this->m_data, val);
    }
    gmp_float(const gmp_float& o) : detail::gmp_float_imp<0>(o) {}
@@ -473,7 +474,7 @@
    gmp_float(const gmp_rational& o);
    gmp_float(const gmp_float& o, unsigned digits10)
    {
-      mpf_init2(this->m_data, ((digits10 + 1) * 1000L) / 301L);
+      mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(digits10));
       mpf_set(this->m_data, o.data());
    }
 
@@ -508,21 +509,21 @@
    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_init2(this->m_data, multiprecision::detail::digits10_2_2(get_default_precision()));
       mpf_set(this->m_data, val);
       return *this;
    }
    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_init2(this->m_data, multiprecision::detail::digits10_2_2(get_default_precision()));
       mpf_set_z(this->m_data, val);
       return *this;
    }
    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);
+         mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(get_default_precision()));
       mpf_set_q(this->m_data, val);
       return *this;
    }
@@ -542,11 +543,11 @@
    }
    unsigned precision()const BOOST_NOEXCEPT
    {
-      return (mpf_get_prec(this->m_data) * 301L) / 1000 - 1;
+      return multiprecision::detail::digits2_2_10(mpf_get_prec(this->m_data));
    }
    void precision(unsigned digits10) BOOST_NOEXCEPT
    {
-      mpf_set_prec(this->m_data, ((digits10 + 1) * 1000L) / 301);
+      mpf_set_prec(this->m_data, multiprecision::detail::digits10_2_2(digits10));
    }
 };
 
@@ -2008,26 +2009,26 @@
 template <unsigned D>
 inline gmp_float<Digits10>::gmp_float(const gmp_float<D>& o, typename enable_if_c<D <= Digits10>::type*)
 {
-   mpf_init2(this->m_data, (((Digits10 ? Digits10 : this->get_default_precision()) + 1) * 1000L) / 301L);
+   mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(Digits10 ? Digits10 : this->get_default_precision()));
    mpf_set(this->m_data, o.data());
 }
 template <unsigned Digits10>
 template <unsigned D>
 inline gmp_float<Digits10>::gmp_float(const gmp_float<D>& o, typename disable_if_c<D <= Digits10>::type*)
 {
-   mpf_init2(this->m_data, (((Digits10 ? Digits10 : this->get_default_precision()) + 1) * 1000L) / 301L);
+   mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(Digits10 ? Digits10 : this->get_default_precision()));
    mpf_set(this->m_data, o.data());
 }
 template <unsigned Digits10>
 inline gmp_float<Digits10>::gmp_float(const gmp_int& o)
 {
-   mpf_init2(this->m_data, (((Digits10 ? Digits10 : this->get_default_precision()) + 1) * 1000L) / 301L);
+   mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(Digits10 ? Digits10 : this->get_default_precision()));
    mpf_set_z(this->data(), o.data());
 }
 template <unsigned Digits10>
 inline gmp_float<Digits10>::gmp_float(const gmp_rational& o)
 {
-   mpf_init2(this->m_data, (((Digits10 ? Digits10 : this->get_default_precision()) + 1) * 1000L) / 301L);
+   mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(Digits10 ? Digits10 : this->get_default_precision()));
    mpf_set_q(this->data(), o.data());
 }
 template <unsigned Digits10>
@@ -2035,7 +2036,7 @@
 inline gmp_float<Digits10>& gmp_float<Digits10>::operator=(const gmp_float<D>& o)
 {
    if(this->m_data[0]._mp_d == 0)
-      mpf_init2(this->m_data, (((Digits10 ? Digits10 : this->get_default_precision()) + 1) * 1000L) / 301L);
+      mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(Digits10 ? Digits10 : this->get_default_precision()));
    mpf_set(this->m_data, o.data());
    return *this;
 }
@@ -2043,7 +2044,7 @@
 inline gmp_float<Digits10>& gmp_float<Digits10>::operator=(const gmp_int& o)
 {
    if(this->m_data[0]._mp_d == 0)
-      mpf_init2(this->m_data, (((Digits10 ? Digits10 : this->get_default_precision()) + 1) * 1000L) / 301L);
+      mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(Digits10 ? Digits10 : this->get_default_precision()));
    mpf_set_z(this->data(), o.data());
    return *this;
 }
@@ -2051,31 +2052,31 @@
 inline gmp_float<Digits10>& gmp_float<Digits10>::operator=(const gmp_rational& o)
 {
    if(this->m_data[0]._mp_d == 0)
-      mpf_init2(this->m_data, (((Digits10 ? Digits10 : this->get_default_precision()) + 1) * 1000L) / 301L);
+      mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(Digits10 ? Digits10 : this->get_default_precision()));
    mpf_set_q(this->data(), o.data());
    return *this;
 }
 inline gmp_float<0>::gmp_float(const gmp_int& o)
 {
-   mpf_init2(this->m_data, ((get_default_precision() + 1) * 1000L) / 301L);
+   mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(get_default_precision()));
    mpf_set_z(this->data(), o.data());
 }
 inline gmp_float<0>::gmp_float(const gmp_rational& o)
 {
-   mpf_init2(this->m_data, ((get_default_precision() + 1) * 1000L) / 301L);
+   mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(get_default_precision()));
    mpf_set_q(this->data(), o.data());
 }
 inline gmp_float<0>& gmp_float<0>::operator=(const gmp_int& o)
 {
    if(this->m_data[0]._mp_d == 0)
-      mpf_init2(this->m_data, ((this->get_default_precision() + 1) * 1000L) / 301L);
+      mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(this->get_default_precision()));
    mpf_set_z(this->data(), o.data());
    return *this;
 }
 inline gmp_float<0>& gmp_float<0>::operator=(const gmp_rational& o)
 {
    if(this->m_data[0]._mp_d == 0)
-      mpf_init2(this->m_data, ((this->get_default_precision() + 1) * 1000L) / 301L);
+      mpf_init2(this->m_data, multiprecision::detail::digits10_2_2(this->get_default_precision()));
    mpf_set_q(this->data(), o.data());
    return *this;
 }
@@ -2185,7 +2186,7 @@
    {
       return -(max)();
    }
-   BOOST_STATIC_CONSTEXPR int digits = static_cast<int>(((Digits10 + 1) * 1000L) / 301L);
+   BOOST_STATIC_CONSTEXPR int digits = static_cast<int>((Digits10 * 1000L) / 301L + ((Digits10 * 1000L) % 301L ? 2 : 1));
    BOOST_STATIC_CONSTEXPR int digits10 = Digits10;
    // Have to allow for a possible extra limb inside the gmp data structure:
    BOOST_STATIC_CONSTEXPR int max_digits10 = Digits10 + 2 + ((GMP_LIMB_BITS * 301L) / 1000L);
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-21 10:42:15 EDT (Tue, 21 Aug 2012)
@@ -12,6 +12,7 @@
 #include <boost/cstdint.hpp>
 #include <boost/lexical_cast.hpp>
 #include <boost/multiprecision/detail/big_lanczos.hpp>
+#include <boost/multiprecision/detail/digits.hpp>
 #include <mpfr.h>
 #include <cmath>
 #include <algorithm>
@@ -46,7 +47,7 @@
 
    mpfr_float_imp(const mpfr_float_imp& o)
    {
-      mpfr_init2(m_data, (((digits10 ? digits10 : get_default_precision()) + 1) * 1000L) / 301L);
+      mpfr_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : get_default_precision()));
       if(o.m_data[0]._mpfr_d)
          mpfr_set(m_data, o.m_data, GMP_RNDN);
    }
@@ -60,7 +61,7 @@
    mpfr_float_imp& operator = (const mpfr_float_imp& o) BOOST_NOEXCEPT
    {
       if(m_data[0]._mpfr_d == 0)
-         mpfr_init2(m_data, (((digits10 ? digits10 : get_default_precision()) + 1) * 1000L) / 301L);
+         mpfr_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : get_default_precision()));
       if(o.m_data[0]._mpfr_d)
          mpfr_set(m_data, o.m_data, GMP_RNDN);
       return *this;
@@ -76,14 +77,14 @@
    mpfr_float_imp& operator = (unsigned long long i) BOOST_NOEXCEPT
    {
       if(m_data[0]._mpfr_d == 0)
-         mpfr_init2(m_data, (((digits10 ? digits10 : get_default_precision()) + 1) * 1000L) / 301L);
+         mpfr_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : get_default_precision()));
       mpfr_set_uj(m_data, i, GMP_RNDN);
       return *this;
    }
    mpfr_float_imp& operator = (long long i) BOOST_NOEXCEPT
    {
       if(m_data[0]._mpfr_d == 0)
-         mpfr_init2(m_data, (((digits10 ? digits10 : get_default_precision()) + 1) * 1000L) / 301L);
+         mpfr_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : get_default_precision()));
       mpfr_set_sj(m_data, i, GMP_RNDN);
       return *this;
    }
@@ -91,11 +92,11 @@
    mpfr_float_imp& operator = (unsigned long long i)
    {
       if(m_data[0]._mpfr_d == 0)
-         mpfr_init2(m_data, (((digits10 ? digits10 : get_default_precision()) + 1) * 1000L) / 301L);
+         mpfr_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : get_default_precision()));
       unsigned long long mask = ((1uLL << std::numeric_limits<unsigned>::digits) - 1);
       unsigned shift = 0;
       mpfr_t t;
-      mpfr_init2(t, (std::max)(static_cast<unsigned>(std::numeric_limits<unsigned long long>::digits), static_cast<unsigned>(((digits10 + 1) * 1000L) / 301L)));
+      mpfr_init2(t, (std::max)(static_cast<unsigned>(std::numeric_limits<unsigned long long>::digits), static_cast<unsigned>(multiprecision::detail::digits10_2_2(digits10))));
       mpfr_set_ui(m_data, 0, GMP_RNDN);
       while(i)
       {
@@ -113,7 +114,7 @@
    {
       BOOST_MP_USING_ABS
       if(m_data[0]._mpfr_d == 0)
-         mpfr_init2(m_data, (((digits10 ? digits10 : get_default_precision()) + 1) * 1000L) / 301L);
+         mpfr_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : get_default_precision()));
       bool neg = i < 0;
       *this = static_cast<unsigned long long>(abs(i));
       if(neg)
@@ -124,35 +125,35 @@
    mpfr_float_imp& operator = (unsigned long i) BOOST_NOEXCEPT
    {
       if(m_data[0]._mpfr_d == 0)
-         mpfr_init2(m_data, (((digits10 ? digits10 : get_default_precision()) + 1) * 1000L) / 301L);
+         mpfr_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : get_default_precision()));
       mpfr_set_ui(m_data, i, GMP_RNDN);
       return *this;
    }
    mpfr_float_imp& operator = (long i) BOOST_NOEXCEPT
    {
       if(m_data[0]._mpfr_d == 0)
-         mpfr_init2(m_data, (((digits10 ? digits10 : get_default_precision()) + 1) * 1000L) / 301L);
+         mpfr_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : get_default_precision()));
       mpfr_set_si(m_data, i, GMP_RNDN);
       return *this;
    }
    mpfr_float_imp& operator = (double d) BOOST_NOEXCEPT
    {
       if(m_data[0]._mpfr_d == 0)
-         mpfr_init2(m_data, (((digits10 ? digits10 : get_default_precision()) + 1) * 1000L) / 301L);
+         mpfr_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : get_default_precision()));
       mpfr_set_d(m_data, d, GMP_RNDN);
       return *this;
    }
    mpfr_float_imp& operator = (long double a) BOOST_NOEXCEPT
    {
       if(m_data[0]._mpfr_d == 0)
-         mpfr_init2(m_data, (((digits10 ? digits10 : get_default_precision()) + 1) * 1000L) / 301L);
+         mpfr_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : get_default_precision()));
       mpfr_set_ld(m_data, a, GMP_RNDN);
       return *this;
    }
    mpfr_float_imp& operator = (const char* s)
    {
       if(m_data[0]._mpfr_d == 0)
-         mpfr_init2(m_data, (((digits10 ? digits10 : get_default_precision()) + 1) * 1000L) / 301L);
+         mpfr_init2(m_data, multiprecision::detail::digits10_2_2(digits10 ? digits10 : get_default_precision()));
       if(mpfr_set_str(m_data, s, 10, GMP_RNDN) != 0)
       {
          BOOST_THROW_EXCEPTION(std::runtime_error(std::string("Unable to parse string \"") + s + std::string("\"as a valid floating point number.")));
@@ -328,52 +329,64 @@
 {
    mpfr_float_backend()
    {
-      mpfr_init2(this->m_data, ((digits10 + 1) * 1000L) / 301L);
+      mpfr_init2(this->m_data, multiprecision::detail::digits10_2_2(digits10));
    }
    mpfr_float_backend(const mpfr_float_backend& o) : detail::mpfr_float_imp<digits10>(o) {}
 #ifndef BOOST_NO_RVALUE_REFERENCES
    mpfr_float_backend(mpfr_float_backend&& o) : detail::mpfr_float_imp<digits10>(static_cast<detail::mpfr_float_imp<digits10>&&>(o)) {}
 #endif
    template <unsigned D>
-   mpfr_float_backend(const mpfr_float_backend<D>& val)
+   mpfr_float_backend(const mpfr_float_backend<D>& val, typename enable_if_c<D <= digits10>::type* = 0)
    {
-      mpfr_init2(this->m_data, ((digits10 + 1) * 1000L) / 301L);
+      mpfr_init2(this->m_data, multiprecision::detail::digits10_2_2(digits10));
       mpfr_set(this->m_data, val.data(), GMP_RNDN);
    }
    template <unsigned D>
-   mpfr_float_backend(const gmp_float<D>& val)
+   explicit mpfr_float_backend(const mpfr_float_backend<D>& val, typename disable_if_c<D <= digits10>::type* = 0)
+   {
+      mpfr_init2(this->m_data, multiprecision::detail::digits10_2_2(digits10));
+      mpfr_set(this->m_data, val.data(), GMP_RNDN);
+   }
+   template <unsigned D>
+   mpfr_float_backend(const gmp_float<D>& val, typename enable_if_c<D <= digits10>::type* = 0)
+   {
+      mpfr_init2(this->m_data, multiprecision::detail::digits10_2_2(digits10));
+      mpfr_set_f(this->m_data, val.data(), GMP_RNDN);
+   }
+   template <unsigned D>
+   mpfr_float_backend(const gmp_float<D>& val, typename disable_if_c<D <= digits10>::type* = 0)
    {
-      mpfr_init2(this->m_data, ((digits10 + 1) * 1000L) / 301L);
+      mpfr_init2(this->m_data, multiprecision::detail::digits10_2_2(digits10));
       mpfr_set_f(this->m_data, val.data(), GMP_RNDN);
    }
    mpfr_float_backend(const gmp_int& val)
    {
-      mpfr_init2(this->m_data, ((digits10 + 1) * 1000L) / 301L);
+      mpfr_init2(this->m_data, multiprecision::detail::digits10_2_2(digits10));
       mpfr_set_z(this->m_data, val.data(), GMP_RNDN);
    }
    mpfr_float_backend(const gmp_rational& val)
    {
-      mpfr_init2(this->m_data, ((digits10 + 1) * 1000L) / 301L);
+      mpfr_init2(this->m_data, multiprecision::detail::digits10_2_2(digits10));
       mpfr_set_q(this->m_data, val.data(), GMP_RNDN);
    }
-   mpfr_float_backend(mpfr_t val)
+   mpfr_float_backend(const mpfr_t val)
    {
-      mpfr_init2(this->m_data, ((digits10 + 1) * 1000L) / 301L);
+      mpfr_init2(this->m_data, multiprecision::detail::digits10_2_2(digits10));
       mpfr_set(this->m_data, val, GMP_RNDN);
    }
-   mpfr_float_backend(mpf_t val)
+   mpfr_float_backend(const mpf_t val)
    {
-      mpfr_init2(this->m_data, ((digits10 + 1) * 1000L) / 301L);
+      mpfr_init2(this->m_data, multiprecision::detail::digits10_2_2(digits10));
       mpfr_set_f(this->m_data, val, GMP_RNDN);
    }
-   mpfr_float_backend(mpz_t val)
+   mpfr_float_backend(const mpz_t val)
    {
-      mpfr_init2(this->m_data, ((digits10 + 1) * 1000L) / 301L);
+      mpfr_init2(this->m_data, multiprecision::detail::digits10_2_2(digits10));
       mpfr_set_z(this->m_data, val, GMP_RNDN);
    }
-   mpfr_float_backend(mpq_t val)
+   mpfr_float_backend(const mpq_t val)
    {
-      mpfr_init2(this->m_data, ((digits10 + 1) * 1000L) / 301L);
+      mpfr_init2(this->m_data, multiprecision::detail::digits10_2_2(digits10));
       mpfr_set_q(this->m_data, val, GMP_RNDN);
    }
    mpfr_float_backend& operator=(const mpfr_float_backend& o)
@@ -414,6 +427,7 @@
       mpfr_set_q(this->m_data, val, GMP_RNDN);
       return *this;
    }
+   // We don't change our precision here, this is a fixed precision type:
    template <unsigned D>
    mpfr_float_backend& operator=(const mpfr_float_backend<D>& val) BOOST_NOEXCEPT
    {
@@ -443,26 +457,26 @@
 {
    mpfr_float_backend()
    {
-      mpfr_init2(this->m_data, ((get_default_precision() + 1) * 1000L) / 301L);
+      mpfr_init2(this->m_data, multiprecision::detail::digits10_2_2(get_default_precision()));
    }
-   mpfr_float_backend(mpfr_t val)
+   mpfr_float_backend(const mpfr_t val)
    {
-      mpfr_init2(this->m_data, ((get_default_precision() + 1) * 1000L) / 301L);
+      mpfr_init2(this->m_data, mpfr_get_prec(val));
       mpfr_set(this->m_data, val, GMP_RNDN);
    }
-   mpfr_float_backend(mpf_t val)
+   mpfr_float_backend(const mpf_t val)
    {
-      mpfr_init2(this->m_data, ((get_default_precision() + 1) * 1000L) / 301L);
+      mpfr_init2(this->m_data, mpf_get_prec(val));
       mpfr_set_f(this->m_data, val, GMP_RNDN);
    }
-   mpfr_float_backend(mpz_t val)
+   mpfr_float_backend(const mpz_t val)
    {
-      mpfr_init2(this->m_data, ((get_default_precision() + 1) * 1000L) / 301L);
+      mpfr_init2(this->m_data, multiprecision::detail::digits10_2_2(get_default_precision()));
       mpfr_set_z(this->m_data, val, GMP_RNDN);
    }
-   mpfr_float_backend(mpq_t val)
+   mpfr_float_backend(const mpq_t val)
    {
-      mpfr_init2(this->m_data, ((get_default_precision() + 1) * 1000L) / 301L);
+      mpfr_init2(this->m_data, multiprecision::detail::digits10_2_2(get_default_precision()));
       mpfr_set_q(this->m_data, val, GMP_RNDN);
    }
    mpfr_float_backend(const mpfr_float_backend& o) : detail::mpfr_float_imp<0>(o) {}
@@ -471,29 +485,29 @@
 #endif
    mpfr_float_backend(const mpfr_float_backend& o, unsigned digits10) 
    {
-      mpfr_init2(this->m_data, ((digits10 + 1) * 1000L) / 301L);
+      mpfr_init2(this->m_data, multiprecision::detail::digits10_2_2(digits10));
       *this = o;
    }
    template <unsigned D>
    mpfr_float_backend(const mpfr_float_backend<D>& val)
    {
-      mpfr_init2(this->m_data, ((get_default_precision() + 1) * 1000L) / 301L);
+      mpfr_init2(this->m_data, mpfr_get_prec(val.data()));
       mpfr_set(this->m_data, val.data(), GMP_RNDN);
    }
    template <unsigned D>
    mpfr_float_backend(const gmp_float<D>& val)
    {
-      mpfr_init2(this->m_data, ((get_default_precision() + 1) * 1000L) / 301L);
+      mpfr_init2(this->m_data, mpf_get_prec(val.data()));
       mpfr_set_f(this->m_data, val.data(), GMP_RNDN);
    }
    mpfr_float_backend(const gmp_int& val)
    {
-      mpfr_init2(this->m_data, ((get_default_precision() + 1) * 1000L) / 301L);
+      mpfr_init2(this->m_data, multiprecision::detail::digits10_2_2(get_default_precision()));
       mpfr_set_z(this->m_data, val.data(), GMP_RNDN);
    }
    mpfr_float_backend(const gmp_rational& val)
    {
-      mpfr_init2(this->m_data, ((get_default_precision() + 1) * 1000L) / 301L);
+      mpfr_init2(this->m_data, multiprecision::detail::digits10_2_2(get_default_precision()));
       mpfr_set_q(this->m_data, val.data(), GMP_RNDN);
    }
 
@@ -517,11 +531,13 @@
    }
    mpfr_float_backend& operator=(const mpfr_t val) BOOST_NOEXCEPT
    {
+      mpfr_set_prec(this->m_data, mpfr_get_prec(val));
       mpfr_set(this->m_data, val, GMP_RNDN);
       return *this;
    }
    mpfr_float_backend& operator=(const mpf_t val) BOOST_NOEXCEPT
    {
+      mpfr_set_prec(this->m_data, mpf_get_prec(val));
       mpfr_set_f(this->m_data, val, GMP_RNDN);
       return *this;
    }
@@ -538,12 +554,14 @@
    template <unsigned D>
    mpfr_float_backend& operator=(const mpfr_float_backend<D>& val) BOOST_NOEXCEPT
    {
+      mpfr_set_prec(this->m_data, mpfr_get_prec(val.data()));
       mpfr_set(this->m_data, val.data(), GMP_RNDN);
       return *this;
    }
    template <unsigned D>
    mpfr_float_backend& operator=(const gmp_float<D>& val) BOOST_NOEXCEPT
    {
+      mpfr_set_prec(this->m_data, mpf_get_prec(val.data()));
       mpfr_set_f(this->m_data, val.data(), GMP_RNDN);
       return *this;
    }
@@ -567,11 +585,11 @@
    }
    unsigned precision()const BOOST_NOEXCEPT
    {
-      return mpfr_get_prec(this->m_data) * 301L / 1000 - 1;
+      return multiprecision::detail::digits2_2_10(mpfr_get_prec(this->m_data));
    }
    void precision(unsigned digits10) BOOST_NOEXCEPT
    {
-      mpfr_set_prec(this->m_data, (digits10 + 1) * 1000L / 301);
+      mpfr_set_prec(this->m_data, multiprecision::detail::digits2_2_10((digits10)));
    }
 };
 
@@ -1051,6 +1069,21 @@
 
 } // namespace backends
 
+#ifdef BOOST_NO_SFINAE_EXPR
+
+namespace detail{
+
+template<unsigned D1, unsigned D2>
+struct is_explicitly_convertible<backends::mpfr_float_backend<D1>, backends::mpfr_float_backend<D2> > : public mpl::true_ {};
+
+}
+
+#endif
+
+template<>
+struct number_category<typename detail::canonical<mpfr_t, backends::mpfr_float_backend<0> >::type> : public mpl::int_<number_kind_floating_point>{};
+
+
 using boost::multiprecision::backends::mpfr_float_backend;
 
 typedef number<mpfr_float_backend<50> >    mpfr_float_50;
@@ -1119,7 +1152,7 @@
    {
       return -(max)();
    }
-   BOOST_STATIC_CONSTEXPR int digits = static_cast<int>(((Digits10 + 1) * 1000L) / 301L);
+   BOOST_STATIC_CONSTEXPR int digits = static_cast<int>((Digits10 * 1000L) / 301L + ((Digits10 * 1000L) % 301 ? 2 : 1));
    BOOST_STATIC_CONSTEXPR int digits10 = Digits10;
    // Is this really correct???
    BOOST_STATIC_CONSTEXPR int max_digits10 = Digits10 + 2;
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-21 10:42:15 EDT (Tue, 21 Aug 2012)
@@ -99,9 +99,8 @@
       : m_backend(val.backend()) {}
 
    template <class Other, bool ET>
-   number(const number<Other, ET>& val, typename enable_if_c<
-         (!detail::is_explicitly_convertible<Other, Backend>::value 
-            && !detail::is_restricted_conversion<Other, Backend>::value)
+   explicit number(const number<Other, ET>& val, typename enable_if_c<
+         (!detail::is_explicitly_convertible<Other, Backend>::value)
          >::type* = 0)
    {
       //
@@ -116,17 +115,6 @@
          >::type* = 0) BOOST_NOEXCEPT_IF(noexcept(std::declval<Backend>() = std::declval<Other>()))
       : m_backend(val.backend()) {}
 
-   template <class Other, bool ET>
-   explicit number(const number<Other, ET>& val, typename enable_if_c<
-         (!detail::is_explicitly_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 V>
    BOOST_FORCEINLINE number(V v1, V v2, typename enable_if<mpl::or_<boost::is_arithmetic<V>, is_same<std::string, V>, is_convertible<V, const char*> > >::type* = 0)
    {
@@ -210,7 +198,7 @@
       return *this;
    }
    */
-
+/*
    template <class Other>
    typename disable_if<detail::is_explicitly_convertible<Other, Backend>, number<Backend, ExpressionTemplates>& >::type 
       operator=(const number<Other>& v)
@@ -220,7 +208,7 @@
       //
       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)
@@ -672,7 +660,7 @@
       // create a temporary result and assign it to *this:
       typedef typename detail::expression<tag, Arg1, Arg2, Arg3, Arg4>::result_type temp_type;
       temp_type t(e);
-      *this = t;
+      this->assign(t);
    }
 
 
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-21 10:42:15 EDT (Tue, 21 Aug 2012)
@@ -738,6 +738,7 @@
         : # requirements
          [ check-target-builds ../config//has_tommath : : <build>no ] ;
 run ../example/floating_point_examples.cpp : : : <toolset>gcc:<cxxflags>-std=c++0x ;
+run test_cpp_int_conv.cpp ;
 
 compile include_test/mpfr_include_test.cpp
               : # requirements
@@ -804,7 +805,8 @@
 {
    compile-fail $(source) 
    :
-   [ check-target-builds ../config//has_gmp : <define>TEST_GMP : ]  
+      [ check-target-builds ../config//has_gmp : <define>TEST_GMP : ]  
+      [ check-target-builds ../config//has_mpfr : <define>TEST_MPFR : ]  
    ;
 }
 
Deleted: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_1.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_1.cpp	2012-08-21 10:42:15 EDT (Tue, 21 Aug 2012)
+++ (empty file)
@@ -1,17 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////
-//  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
-}
Deleted: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_2.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_2.cpp	2012-08-21 10:42:15 EDT (Tue, 21 Aug 2012)
+++ (empty file)
@@ -1,14 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////
-//  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;
-}
Deleted: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_3.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_3.cpp	2012-08-21 10:42:15 EDT (Tue, 21 Aug 2012)
+++ (empty file)
@@ -1,14 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////
-//  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;
-}
Deleted: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_4.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_4.cpp	2012-08-21 10:42:15 EDT (Tue, 21 Aug 2012)
+++ (empty file)
@@ -1,14 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////
-//  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_49.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_49.cpp	2012-08-21 10:42:15 EDT (Tue, 21 Aug 2012)
@@ -0,0 +1,23 @@
+///////////////////////////////////////////////////////////////////////////////
+//  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)
+
+#ifdef TEST_MPFR
+
+#include <boost/multiprecision/mpfr.hpp>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+   mpfr_float_100 f(2);
+   mpfr_float_50 f2;
+   f2 = f;
+}
+
+#else
+
+#error "Nothing to test without GMP!"
+
+#endif
Deleted: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_5.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_5.cpp	2012-08-21 10:42:15 EDT (Tue, 21 Aug 2012)
+++ (empty file)
@@ -1,14 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////
-//  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_50.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_50.cpp	2012-08-21 10:42:15 EDT (Tue, 21 Aug 2012)
@@ -0,0 +1,22 @@
+///////////////////////////////////////////////////////////////////////////////
+//  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)
+
+#ifdef TEST_MPFR
+
+#include <boost/multiprecision/mpfr.hpp>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+   mpfr_float_100 f(2);
+   mpfr_float_50 f2 = f;
+}
+
+#else
+
+#error "Nothing to test without GMP!"
+
+#endif
Added: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_51.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_51.cpp	2012-08-21 10:42:15 EDT (Tue, 21 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_dec_float.hpp>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+   cpp_dec_float_100 f(2);
+   cpp_dec_float_50 f2 = f;
+}
+
Added: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_52.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_52.cpp	2012-08-21 10:42:15 EDT (Tue, 21 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_dec_float.hpp>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+   cpp_dec_float_100 f(2);
+   cpp_dec_float_50 f2;
+   f2 = f;
+}
+
Added: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_53.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_53.cpp	2012-08-21 10:42:15 EDT (Tue, 21 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>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+   int256_t i = 3;
+   int128_t j = i;
+}
+
Added: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_54.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_54.cpp	2012-08-21 10:42:15 EDT (Tue, 21 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>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+   int256_t i = 3;
+   int128_t j;
+   j = i;
+}
+
Added: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_55.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_55.cpp	2012-08-21 10:42:15 EDT (Tue, 21 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>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+   int256_t i = 3;
+   uint256_t j;
+   j = i;
+}
+
Added: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_56.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_56.cpp	2012-08-21 10:42:15 EDT (Tue, 21 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>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+   int256_t i = 3;
+   uint256_t j = i;
+}
+
Added: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_57.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_57.cpp	2012-08-21 10:42:15 EDT (Tue, 21 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>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+   cpp_int i = 3;
+   int256_t j = i;
+}
+
Added: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_58.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_58.cpp	2012-08-21 10:42:15 EDT (Tue, 21 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>
+
+using namespace boost::multiprecision;
+
+int main()
+{
+   cpp_int i = 3;
+   int256_t j;
+   j = i;
+}
+
Deleted: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_6.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_6.cpp	2012-08-21 10:42:15 EDT (Tue, 21 Aug 2012)
+++ (empty file)
@@ -1,14 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////
-//  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;
-}
Deleted: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_7.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_7.cpp	2012-08-21 10:42:15 EDT (Tue, 21 Aug 2012)
+++ (empty file)
@@ -1,14 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////
-//  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;
-}
Deleted: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_8.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_8.cpp	2012-08-21 10:42:15 EDT (Tue, 21 Aug 2012)
+++ (empty file)
@@ -1,14 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////
-//  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;
-}
Deleted: sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_9.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/compile_fail/conv_fail_9.cpp	2012-08-21 10:42:15 EDT (Tue, 21 Aug 2012)
+++ (empty file)
@@ -1,14 +0,0 @@
-///////////////////////////////////////////////////////////////////////////////
-//  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/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-21 10:42:15 EDT (Tue, 21 Aug 2012)
@@ -87,7 +87,7 @@
       ".*",                          // platform
       ".*",                  // test type(s)
       ".*JN.*Integer.*",              // test data group
-      ".*", 40000, 10000);       // test function
+      ".*", 50000, 15000);       // test function
    add_expected_result(
       ".*",                          // compiler
       ".*",                          // stdlib
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-21 10:42:15 EDT (Tue, 21 Aug 2012)
@@ -107,7 +107,7 @@
       ".*",                          // platform
       ".*",                         // test type(s)
       ".*",                          // test data group
-      ".*", 80, 40);                 // test function
+      ".*", 150, 60);                 // test function
    //
    // Finish off by printing out the compiler/stdlib/platform names,
    // we do this to make it easier to mark up expected error rates.
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-21 10:42:15 EDT (Tue, 21 Aug 2012)
@@ -75,7 +75,7 @@
       ".*",                          // platform
       ".*",                          // test type(s)
       "Inverse Erf.*",               // test data group
-      "boost::math::erfc?_inv", 35, 20);  // test function
+      "boost::math::erfc?_inv", 60, 20);  // test function
    //
    // Finish off by printing out the compiler/stdlib/platform names,
    // we do this to make it easier to mark up expected error rates.
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-21 10:42:15 EDT (Tue, 21 Aug 2012)
@@ -68,7 +68,7 @@
       ".*",                          // platform
       ".*",                          // test type(s)
       "factorials",                  // test data group
-      "boost::math::lgamma", 80, 40);  // test function
+      "boost::math::lgamma", 750, 100);  // test function
    add_expected_result(
       ".*",                          // compiler
       ".*",                          // stdlib
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-21 10:42:15 EDT (Tue, 21 Aug 2012)
@@ -54,7 +54,7 @@
       ".*",                          // platform
       ".*",                          // test type(s)
       ".*",                          // test data group
-      ".*", 5000, 500);              // test function
+      ".*", 6000, 500);              // test function
    //
    // Finish off by printing out the compiler/stdlib/platform names,
    // we do this to make it easier to mark up expected error rates.
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-21 10:42:15 EDT (Tue, 21 Aug 2012)
@@ -243,7 +243,7 @@
          max_err = err;
    }
    std::cout << "Max error was: " << max_err << std::endl;
-   BOOST_TEST(max_err < 500);
+   BOOST_TEST(max_err < 750);
 
    //
    // Test with some exact binary values as input - this tests our code
Added: sandbox/big_number/libs/multiprecision/test/test_cpp_dec_float_conv.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/test_cpp_dec_float_conv.cpp	2012-08-21 10:42:15 EDT (Tue, 21 Aug 2012)
@@ -0,0 +1,42 @@
+///////////////////////////////////////////////////////////////
+//  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_
+//
+
+#ifdef _MSC_VER
+#  define _SCL_SECURE_NO_WARNINGS
+#endif
+
+#include <boost/detail/lightweight_test.hpp>
+#include <boost/array.hpp>
+#include "test.hpp"
+
+#include <boost/multiprecision/cpp_dec_float.hpp>
+
+int main()
+{
+   using namespace boost::multiprecision;
+   //
+   // Test interconversions between different precisions:
+   //
+   cpp_dec_float_50    f1(2);
+   cpp_dec_float_100   f2(3);
+
+   cpp_dec_float_100   f3 = f1;  // implicit conversion OK
+   BOOST_TEST(f3 == 2);
+   cpp_dec_float_50    f4(f2);   // explicit conversion OK
+   BOOST_TEST(f4 == 3);
+
+   f2 = f1;
+   BOOST_TEST(f2 == 2);
+   f2 = 4;
+   f1 = static_cast<cpp_dec_float_50>(f2);
+   BOOST_TEST(f1 == 4);
+
+
+   return boost::report_errors();
+}
+
+
+
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-21 10:42:15 EDT (Tue, 21 Aug 2012)
@@ -281,9 +281,9 @@
          // also don't test for modulo types, as these may give a diffferent result from arbitrary
          // precision types:
          BOOST_CHECK_EQUAL(mpz_int(pow(d, ui % 19)).str(), test_type(pow(d1, ui % 19)).str());
-         BOOST_CHECK_EQUAL(mpz_int(powm(a, b, c)).str(), test_type(powm(a, b, c)).str());
-         BOOST_CHECK_EQUAL(mpz_int(powm(a, b, ui)).str(), test_type(powm(a, b, ui)).str());
-         BOOST_CHECK_EQUAL(mpz_int(powm(a, ui, c)).str(), test_type(powm(a, ui, c)).str());
+         BOOST_CHECK_EQUAL(mpz_int(powm(a, b, c)).str(), test_type(powm(a1, b1, c1)).str());
+         BOOST_CHECK_EQUAL(mpz_int(powm(a, b, ui)).str(), test_type(powm(a1, b1, ui)).str());
+         BOOST_CHECK_EQUAL(mpz_int(powm(a, ui, c)).str(), test_type(powm(a1, ui, c1)).str());
       }
 
       if(last_error_count != (unsigned)boost::detail::test_errors())
Added: sandbox/big_number/libs/multiprecision/test/test_cpp_int_conv.cpp
==============================================================================
--- (empty file)
+++ sandbox/big_number/libs/multiprecision/test/test_cpp_int_conv.cpp	2012-08-21 10:42:15 EDT (Tue, 21 Aug 2012)
@@ -0,0 +1,55 @@
+///////////////////////////////////////////////////////////////
+//  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_
+//
+
+#ifdef _MSC_VER
+#  define _SCL_SECURE_NO_WARNINGS
+#endif
+
+#include <boost/detail/lightweight_test.hpp>
+#include <boost/array.hpp>
+#include "test.hpp"
+
+#include <boost/multiprecision/cpp_int.hpp>
+
+int main()
+{
+   using namespace boost::multiprecision;
+   //
+   // Test interconversions between different precisions:
+   //
+   cpp_int    i1(2);
+   int128_t   i2(3);
+   int256_t   i3(4);
+   number<cpp_int_backend<32, true, void> > i4(5);
+
+   i1 = i3;
+   BOOST_TEST(i1 == 4);
+   i1 = i4;
+   BOOST_TEST(i1 == 5);
+
+   i3 = -1234567;
+   i4 = -5677334;
+   i1 = i3;
+   BOOST_TEST(i1 == -1234567);
+   i1 = i4;
+   BOOST_TEST(i1 == -5677334);
+
+   i3 = i2;
+   BOOST_TEST(i3 == 3);
+
+   i3 = -1234567;
+
+   uint128_t  i5(i3);
+   BOOST_TEST(i5 == -1234567);
+
+   int128_t   i6(i4);
+   BOOST_TEST(i6 == -5677334);
+
+   return boost::report_errors();
+}
+
+
+
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-21 10:42:15 EDT (Tue, 21 Aug 2012)
@@ -43,16 +43,16 @@
       mpz_int z(c);
       cpp_int t(z);
       BOOST_CHECK_EQUAL(t, c);
-      z = -c;
-      t = -z;
+      z.assign(-c);
+      t.assign(-z);
       BOOST_CHECK_EQUAL(t, c);
 #endif
 #ifdef TEST_TOMMATH
       tom_int tom(c);
       cpp_int t2(tom);
       BOOST_CHECK_EQUAL(t2, c);
-      tom = -c;
-      t2 = -tom;
+      tom.assign(-c);
+      t2.assign(-tom);
       BOOST_CHECK_EQUAL(t2, c);
 #endif
       //
@@ -62,7 +62,7 @@
       dec_float_500 df(c);
       dec_float_500 df2(c.str());
       BOOST_CHECK_EQUAL(df, df2);
-      df = -c;
+      df.assign(-c);
       df2 = -df2;
       BOOST_CHECK_EQUAL(df, df2);
 #ifdef TEST_GMP
@@ -70,7 +70,7 @@
       mpf_type mpf(c);
       mpf_type mpf2(c.str());
       BOOST_CHECK_EQUAL(mpf, mpf2);
-      mpf = -c;
+      mpf.assign(-c);
       mpf2 = -mpf2;
       BOOST_CHECK_EQUAL(mpf, mpf2);
 #endif
@@ -79,29 +79,29 @@
       mpfr_type mpfr(c);
       mpfr_type mpfr2(c.str());
       BOOST_CHECK_EQUAL(mpfr, mpfr2);
-      mpfr = -c;
+      mpfr.assign(-c);
       mpfr2 = -mpfr2;
       BOOST_CHECK_EQUAL(mpfr, mpfr2);
 #endif
       //
       // Now float to float:
       //
-      df = c;
+      df.assign(c);
       df /= dec_float_500(gen());
       dec_float_500 tol("1e-500");
 #ifdef TEST_GMP
-      mpf = df;
+      mpf.assign(df);
       mpf2 = static_cast<mpf_type>(df.str());
       BOOST_CHECK_EQUAL(mpf, mpf2);
-      df = mpf;
+      df.assign(mpf);
       df2 = static_cast<dec_float_500>(mpf.str());
       BOOST_CHECK(fabs((df - df2) / df) < tol);
 #endif
 #ifdef TEST_MPFR
-      mpfr = df;
+      mpfr.assign(df);
       mpfr2 = static_cast<mpfr_type>(df.str());
       BOOST_CHECK_EQUAL(mpfr, mpfr2);
-      df = mpfr;
+      df.assign(mpfr);
       df2 = static_cast<dec_float_500>(mpfr.str());
       BOOST_CHECK(fabs((df - df2) / df) < tol);
 #endif
@@ -123,20 +123,20 @@
       // Integer to rational conversions:
       //
 #ifdef TEST_GMP
-      mpq = c;
+      mpq.assign(c);
       mpq_rational mpq2 = static_cast<mpq_rational>(c.str());
       BOOST_CHECK_EQUAL(mpq, mpq2);
 #endif
 #ifdef TEST_TOMMATH
-      tr = c;
+      tr.assign(c);
       tom_rational tr2 = static_cast<tom_rational>(c.str());
       BOOST_CHECK_EQUAL(tr, tr2);
 #endif
       //
       // Rational to float:
       //
-      df = cppr;
-      df2 = numerator(cppr);
+      df.assign(cppr);
+      df2.assign(numerator(cppr));
       df2 /= dec_float_500(denominator(cppr));
       BOOST_CHECK(fabs(df - df2) / df2 < tol);
    }
Modified: sandbox/big_number/libs/multiprecision/test/test_mpfr_conversions.cpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/test_mpfr_conversions.cpp	(original)
+++ sandbox/big_number/libs/multiprecision/test/test_mpfr_conversions.cpp	2012-08-21 10:42:15 EDT (Tue, 21 Aug 2012)
@@ -100,6 +100,24 @@
    BOOST_TEST(mpfr_float(gf) == 2);
    BOOST_TEST(mpfr_float_50(gf) == 2);
 
+   //
+   // Conversions involving precision only:
+   //
+   mpfr_float::default_precision(30);
+   f50 = 2;
+   mpfr_float_100   f100(3);
+   mpfr_float       f0a(4);
+   mpfr_float       f0b(f100);
+   BOOST_TEST(f0a.precision() == 30);
+   BOOST_TEST(f0b.precision() == 100);
+   f0a = f100;
+   BOOST_TEST(f0a == 3);
+   BOOST_TEST(f0a.precision() == 100);
+
+   f100 = f50;
+   BOOST_TEST(f100 == 2);
+
+   f50 = static_cast<mpfr_float_50>(f100);
 
    return boost::report_errors();
 }