Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r82920 - in trunk: boost/multiprecision libs/multiprecision/test
From: e_float_at_[hidden]
Date: 2013-02-16 05:55:07


Author: christopher_kormanyos
Date: 2013-02-16 05:55:06 EST (Sat, 16 Feb 2013)
New Revision: 82920
URL: http://svn.boost.org/trac/boost/changeset/82920

Log:
Refs #8065
Added:
   trunk/libs/multiprecision/test/test_cpp_dec_float_round.cpp (contents, props changed)
Text files modified:
   trunk/boost/multiprecision/cpp_dec_float.hpp | 9 +++------
   trunk/libs/multiprecision/test/Jamfile.v2 | 2 ++
   2 files changed, 5 insertions(+), 6 deletions(-)

Modified: trunk/boost/multiprecision/cpp_dec_float.hpp
==============================================================================
--- trunk/boost/multiprecision/cpp_dec_float.hpp (original)
+++ trunk/boost/multiprecision/cpp_dec_float.hpp 2013-02-16 05:55:06 EST (Sat, 16 Feb 2013)
@@ -1720,12 +1720,9 @@
       // Thus the integer part is zero.
       return zero();
    }
- else if(exp >= static_cast<ExponentType>(Digits10 - 1))
- {
- // The number is too large to resolve the integer part.
- // Thus it is already a pure integer part.
- return *this;
- }
+
+ // Truncate the digits from the decimal part, including guard digits
+ // that do not belong to the integer part.
 
    // Make a local copy.
    cpp_dec_float<Digits10, ExponentType, Allocator> x = *this;

Modified: trunk/libs/multiprecision/test/Jamfile.v2
==============================================================================
--- trunk/libs/multiprecision/test/Jamfile.v2 (original)
+++ trunk/libs/multiprecision/test/Jamfile.v2 2013-02-16 05:55:06 EST (Sat, 16 Feb 2013)
@@ -101,6 +101,8 @@
 run test_arithmetic_ab_2.cpp ;
 run test_arithmetic_ab_3.cpp ;
 
+run test_cpp_dec_float_round.cpp ;
+
 run test_arithmetic_logged_1.cpp ;
 run test_arithmetic_logged_2.cpp ;
 

Added: trunk/libs/multiprecision/test/test_cpp_dec_float_round.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/multiprecision/test/test_cpp_dec_float_round.cpp 2013-02-16 05:55:06 EST (Sat, 16 Feb 2013)
@@ -0,0 +1,67 @@
+///////////////////////////////////////////////////////////////
+// Copyright 2013 Christopher Kormanyos. 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_
+//
+
+// Test case for ticket:
+// #8065: Multiprecision rounding issue
+
+#ifdef _MSC_VER
+# define _SCL_SECURE_NO_WARNINGS
+#endif
+
+#include <boost/detail/lightweight_test.hpp>
+#include "test.hpp"
+#include <boost/multiprecision/cpp_dec_float.hpp>
+#include <boost/math/special_functions/round.hpp>
+
+template<int N>
+static bool round_test_imp()
+{
+ typedef boost::multiprecision::cpp_dec_float<N> mp_backend_type;
+ typedef boost::multiprecision::number<mp_backend_type, boost::multiprecision::et_off> mp_type;
+
+ const mp_type original_digits(1.0F);
+
+ const mp_type scale = pow(mp_type(10), N);
+
+ mp_type these_digits = original_digits * scale;
+
+ these_digits = boost::math::round(these_digits);
+ these_digits /= scale;
+
+ const std::string result = these_digits.str();
+
+ return (result == original_digits.str());
+}
+
+template<int N>
+struct round_test
+{
+ static bool test()
+ {
+ return (round_test_imp<N>() && round_test<N - 1>::test());
+ }
+};
+
+template<>
+struct round_test<0>
+{
+ static bool test()
+ {
+ return round_test_imp<0>();
+ }
+};
+
+int main()
+{
+ //
+ // Test cpp_dec_float rounding with boost::math::round() at various precisions:
+ //
+ const bool round_test_result = round_test<40>::test();
+
+ BOOST_CHECK_EQUAL(round_test_result, true);
+
+ return boost::report_errors();
+}


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