$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r75520 - in sandbox/big_number: boost/multiprecision libs/multiprecision/test
From: john_at_[hidden]
Date: 2011-11-17 13:08:52
Author: johnmaddock
Date: 2011-11-17 13:08:51 EST (Thu, 17 Nov 2011)
New Revision: 75520
URL: http://svn.boost.org/trac/boost/changeset/75520
Log:
Fix operator>> for mp_number.
Add template inter-conversions on cpp_float.
Adjust precision of test reporting.
Text files modified: 
   sandbox/big_number/boost/multiprecision/cpp_float.hpp |    26 ++++++++++++++++++++++++++              
   sandbox/big_number/boost/multiprecision/mp_number.hpp |     4 +++-                                    
   sandbox/big_number/libs/multiprecision/test/test.hpp  |     2 +-                                      
   3 files changed, 30 insertions(+), 2 deletions(-)
Modified: sandbox/big_number/boost/multiprecision/cpp_float.hpp
==============================================================================
--- sandbox/big_number/boost/multiprecision/cpp_float.hpp	(original)
+++ sandbox/big_number/boost/multiprecision/cpp_float.hpp	2011-11-17 13:08:51 EST (Thu, 17 Nov 2011)
@@ -163,6 +163,18 @@
       fpclass  (f.fpclass),
       prec_elem(f.prec_elem) { }
 
+   template <unsigned D>
+   cpp_float(const cpp_float<D>& f) : 
+      exp      (f.exp),
+      neg      (f.neg),
+      fpclass  (static_cast<enum_fpclass>(static_cast<int>(f.fpclass))),
+      prec_elem(mp_elem_number)
+   { 
+      // TODO: this doesn't round!
+      std::copy_n(f.data.begin(), std::min(f.prec_elem, prec_elem), data.begin());
+      precision(std::min(f.prec_elem, prec_elem));
+   }
+
    template <class F>
    cpp_float(const F val, typename enable_if<is_floating_point<F> >::type* = 0): 
       data(),
@@ -299,6 +311,16 @@
       prec_elem = v.prec_elem;
       return *this;
    }
+   template <unsigned D>
+   cpp_float& operator=(const cpp_float<D>& f)
+   { 
+      exp = f.exp;
+      neg = f.neg;
+      fpclass = static_cast<enum_fpclass>(static_cast<int>(f.fpclass));
+      std::copy_n(f.data.begin(), std::min(f.prec_elem, prec_elem), data.begin());
+      precision(std::min(f.prec_elem, prec_elem));
+      return *this;
+   }
    cpp_float& operator= (long long v)
    {
       if(v < 0)
@@ -481,6 +503,10 @@
    static boost::uint32_t div_loop_n(boost::uint32_t* const u, boost::uint32_t n, const boost::int32_t p);
 
    bool rd_string(const char* const s);
+
+   template <unsigned D>
+   friend class cpp_float;
+
 };
 
 template <unsigned Digits10>
Modified: sandbox/big_number/boost/multiprecision/mp_number.hpp
==============================================================================
--- sandbox/big_number/boost/multiprecision/mp_number.hpp	(original)
+++ sandbox/big_number/boost/multiprecision/mp_number.hpp	2011-11-17 13:08:51 EST (Thu, 17 Nov 2011)
@@ -1529,7 +1529,9 @@
 template <class Backend>
 inline std::ostream& operator << (std::ostream& os, const mp_number<Backend>& r)
 {
-   return os << r.str(static_cast<unsigned>(os.precision(), os.flags() & os.scientific));
+   unsigned d = os.precision();
+   bool b = os.flags() & os.scientific;
+   return os << r.str(d, b);
 }
 
 namespace detail{
Modified: sandbox/big_number/libs/multiprecision/test/test.hpp
==============================================================================
--- sandbox/big_number/libs/multiprecision/test/test.hpp	(original)
+++ sandbox/big_number/libs/multiprecision/test/test.hpp	2011-11-17 13:08:51 EST (Thu, 17 Nov 2011)
@@ -116,7 +116,7 @@
    << std::setprecision(digits_of(x)) << std::scientific\
    << "Value of LHS was: " << x << "\n"\
    << "Value of RHS was: " << y << "\n"\
-   << std::setprecision(3)\
+   << std::setprecision(5) << std::fixed\
    << "Relative error was: " << relative_error(x, y) << "eps\n"\
    << "Tolerance was: " << tol << "eps" << std::endl;\
    BOOST_MP_REPORT_SEVERITY(severity);\