$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r85314 - trunk/boost/multiprecision/detail
From: john_at_[hidden]
Date: 2013-08-12 07:58:17
Author: johnmaddock
Date: 2013-08-12 07:58:17 EDT (Mon, 12 Aug 2013)
New Revision: 85314
URL: http://svn.boost.org/trac/boost/changeset/85314
Log:
Fix overflow bug.
Text files modified: 
   trunk/boost/multiprecision/detail/float_string_cvt.hpp |    19 ++++++++++++++++---                     
   1 files changed, 16 insertions(+), 3 deletions(-)
Modified: trunk/boost/multiprecision/detail/float_string_cvt.hpp
==============================================================================
--- trunk/boost/multiprecision/detail/float_string_cvt.hpp	Mon Aug 12 07:56:45 2013	(r85313)
+++ trunk/boost/multiprecision/detail/float_string_cvt.hpp	2013-08-12 07:58:17 EDT (Mon, 12 Aug 2013)	(r85314)
@@ -91,8 +91,21 @@
       eval_log10(t, b);
       eval_floor(t, t);
       eval_convert_to(&expon, t);
-      eval_pow(t, ten, -expon);
-      eval_multiply(t, b);
+      if(-expon > std::numeric_limits<number<Backend> >::max_exponent10 - 3)
+      {
+         int e = -expon / 2;
+         Backend t2;
+         eval_pow(t2, ten, e);
+         eval_multiply(t, t2, b);
+         eval_multiply(t, t2);
+         if(expon & 1)
+            eval_multiply(t, ten);
+      }
+      else
+      {
+         eval_pow(t, ten, -expon);
+         eval_multiply(t, b);
+      }
       //
       // Make sure we're between [1,10) and adjust if not:
       //
@@ -137,7 +150,7 @@
          if((cdigit == 5) && (t.compare(ui_type(0)) == 0))
          {
             // Bankers rounding:
-            if((*result.rend() - '0') & 1)
+            if((*result.rbegin() - '0') & 1)
             {
                round_string_up_at(result, result.size() - 1);
             }