Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r78105 - sandbox/big_number/boost/multiprecision
From: e_float_at_[hidden]
Date: 2012-04-20 19:17:48


Author: christopher_kormanyos
Date: 2012-04-20 19:17:48 EDT (Fri, 20 Apr 2012)
New Revision: 78105
URL: http://svn.boost.org/trac/boost/changeset/78105

Log:
Ensure that potentially truncated digit counts in cpp_dec_float are properly used.
Text files modified:
   sandbox/big_number/boost/multiprecision/cpp_dec_float.hpp | 12 ++++++++----
   1 files changed, 8 insertions(+), 4 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-04-20 19:17:48 EDT (Fri, 20 Apr 2012)
@@ -1,6 +1,6 @@
 ///////////////////////////////////////////////////////////////////////////////
-// Copyright Christopher Kormanyos 2002 - 2011.
-// Copyright 2011 John Maddock. Distributed under the Boost
+// Copyright Christopher Kormanyos 2002 - 2012.
+// 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)
 //
@@ -2860,7 +2860,7 @@
       static const bool is_bounded = true;
       static const bool is_modulo = false;
       static const bool is_iec559 = false;
- static const int digits = Digits10;
+ static const int digits = boost::multiprecision::cpp_dec_float<Digits10>::cpp_dec_float_digits10;
       static const int digits10 = boost::multiprecision::cpp_dec_float<Digits10>::cpp_dec_float_digits10;
       static const int max_digits10 = boost::multiprecision::cpp_dec_float<Digits10>::cpp_dec_float_total_digits10;
       static const boost::int64_t min_exponent = boost::multiprecision::cpp_dec_float<Digits10>::cpp_dec_float_min_exp; // Type differs from int.
@@ -2896,8 +2896,12 @@
 template <unsigned Digits10, class Policy, bool ExpressionTemplates>
 struct precision< boost::multiprecision::mp_number<boost::multiprecision::cpp_dec_float<Digits10>, ExpressionTemplates>, Policy>
 {
+ // Define a local copy of cpp_dec_float_digits10 because it might differ
+ // from the template parameter Digits10 for small or large digit counts.
+ static const boost::int32_t cpp_dec_float_digits10 = boost::multiprecision::cpp_dec_float<Digits10>::cpp_dec_float_digits10;
+
    typedef typename Policy::precision_type precision_type;
- typedef digits2<((Digits10 + 1) * 1000L) / 301L> digits_2;
+ typedef digits2<((cpp_dec_float_digits10 + 1LL) * 1000LL) / 301LL> digits_2;
    typedef typename mpl::if_c<
       ((digits_2::value <= precision_type::value)
       || (Policy::precision_type::value <= 0)),


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