From cd31fbde7ae3d646004429fde98fbc95cf4c3a07 Mon Sep 17 00:00:00 2001 From: John Maddock Date: Thu, 17 Nov 2011 18:08:51 +0000 Subject: [PATCH] Fix operator>> for mp_number. Add template inter-conversions on cpp_float. Adjust precision of test reporting. [SVN r75520] --- include/boost/multiprecision/cpp_float.hpp | 26 ++++++++++++++++++++++ include/boost/multiprecision/mp_number.hpp | 4 +++- test/test.hpp | 2 +- 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/include/boost/multiprecision/cpp_float.hpp b/include/boost/multiprecision/cpp_float.hpp index 28db0a82..19e5d588 100644 --- a/include/boost/multiprecision/cpp_float.hpp +++ b/include/boost/multiprecision/cpp_float.hpp @@ -163,6 +163,18 @@ public: fpclass (f.fpclass), prec_elem(f.prec_elem) { } + template + cpp_float(const cpp_float& f) : + exp (f.exp), + neg (f.neg), + fpclass (static_cast(static_cast(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 cpp_float(const F val, typename enable_if >::type* = 0): data(), @@ -299,6 +311,16 @@ public: prec_elem = v.prec_elem; return *this; } + template + cpp_float& operator=(const cpp_float& f) + { + exp = f.exp; + neg = f.neg; + fpclass = static_cast(static_cast(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 @@ private: 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 + friend class cpp_float; + }; template diff --git a/include/boost/multiprecision/mp_number.hpp b/include/boost/multiprecision/mp_number.hpp index ff11fb42..6c92093b 100644 --- a/include/boost/multiprecision/mp_number.hpp +++ b/include/boost/multiprecision/mp_number.hpp @@ -1529,7 +1529,9 @@ inline typename boost::enable_if, bool>: template inline std::ostream& operator << (std::ostream& os, const mp_number& r) { - return os << r.str(static_cast(os.precision(), os.flags() & os.scientific)); + unsigned d = os.precision(); + bool b = os.flags() & os.scientific; + return os << r.str(d, b); } namespace detail{ diff --git a/test/test.hpp b/test/test.hpp index 7999c896..d44af84f 100644 --- a/test/test.hpp +++ b/test/test.hpp @@ -116,7 +116,7 @@ void report_unexpected_exception(const E& e, int severity, const char* file, int << 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);\