|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r50542 - in sandbox/mp_math: boost/mp_math/mp_int/detail libs/mp_math/test
From: baraclese_at_[hidden]
Date: 2009-01-11 08:56:26
Author: baraclese
Date: 2009-01-11 08:56:25 EST (Sun, 11 Jan 2009)
New Revision: 50542
URL: http://svn.boost.org/trac/boost/changeset/50542
Log:
* mp_int/detail/integral_ops.hpp
Fixed a few more bugs reported by Nathan Kitchen.
Text files modified:
sandbox/mp_math/boost/mp_math/mp_int/detail/integral_ops.hpp | 20 ++++++++++++--------
sandbox/mp_math/libs/mp_math/test/cmp.cpp | 29 +++++++++++++++++++++--------
2 files changed, 33 insertions(+), 16 deletions(-)
Modified: sandbox/mp_math/boost/mp_math/mp_int/detail/integral_ops.hpp
==============================================================================
--- sandbox/mp_math/boost/mp_math/mp_int/detail/integral_ops.hpp (original)
+++ sandbox/mp_math/boost/mp_math/mp_int/detail/integral_ops.hpp 2009-01-11 08:56:25 EST (Sun, 11 Jan 2009)
@@ -132,18 +132,18 @@
static const int dd = MpInt::valid_bits;
static const int m = dd < ud ? dd : ud;
static const int h = m / 2;
- /* set h bits at a time */
+ // set h bits at a time
for (int i = 0; i < ud / h; ++i)
{
- /* shift the number up h bits */
+ // shift the number up h bits
lhs <<= h;
// TODO optimize shift. only need to call grow_capacity once here
// then use lower level shift_left(lhs.digits_, h);
- /* OR in the top h bits of the source */
+ // OR in the top h bits of the source
lhs[0] |= (rhs >> (ud-h)) & (power<IntegralT,2,h>::value - 1);
- /* shift the source up to the next h bits */
+ // shift the source up to the next h bits
rhs <<= h;
}
lhs.clamp();
@@ -190,9 +190,9 @@
bool
integral_ops_impl<IntegralT, MpInt, true>::equal(const MpInt& lhs, IntegralT rhs)
{
- const int r_sign = rhs < 0 ? -1 : 1;
+ const int rhs_sign = rhs < 0 ? -1 : 1;
- if (lhs.sign() != r_sign)
+ if (lhs.sign() != rhs_sign)
return false;
if (lhs.size() > q)
@@ -224,8 +224,12 @@
if (lhs.sign() == 1 && rhs < 0)
return false;
- if (lhs.size() > q)
- return false;
+ static const typename MpInt::size_type rhs_precision =
+ static_cast<typename MpInt::size_type>(
+ std::numeric_limits<IntegralT>::digits);
+
+ if (lhs.precision() > rhs_precision)
+ return lhs.sign() == -1;
return lhs.template to_integral<IntegralT>() < rhs;
}
Modified: sandbox/mp_math/libs/mp_math/test/cmp.cpp
==============================================================================
--- sandbox/mp_math/libs/mp_math/test/cmp.cpp (original)
+++ sandbox/mp_math/libs/mp_math/test/cmp.cpp 2009-01-11 08:56:25 EST (Sun, 11 Jan 2009)
@@ -1,4 +1,4 @@
-// Copyright Kevin Sopp 2008.
+// Copyright Kevin Sopp 2008 - 2009.
// 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)
@@ -106,12 +106,31 @@
BOOST_CHECK_EQUAL(x, -32101);
}
-BOOST_AUTO_TEST_CASE_TEMPLATE(cmp_mp_int_lt_integral_type, mp_int_type, mp_int_types)
+BOOST_AUTO_TEST_CASE_TEMPLATE(cmp_mp_int_lt_integral_type1, mp_int_type, mp_int_types)
{
const mp_int_type x("123456789");
BOOST_CHECK_LT(x, 123456790);
}
+BOOST_AUTO_TEST_CASE_TEMPLATE(cmp_mp_int_lt_integral_type2, mp_int_type, mp_int_types)
+{
+ const mp_int_type x("0x100000000");
+ BOOST_CHECK_LE(1, x);
+}
+
+BOOST_AUTO_TEST_CASE_TEMPLATE(cmp_mp_int_lt_integral_type3, mp_int_type, mp_int_types)
+{
+ const mp_int_type x("-0x100000000");
+ BOOST_CHECK_LT(x, -1);
+}
+
+BOOST_AUTO_TEST_CASE_TEMPLATE(cmp_mp_int_lt_integral_type4, mp_int_type, mp_int_types)
+{
+ mp_int_type x(std::numeric_limits<int>::min());
+ x -= 1;
+ BOOST_CHECK_LT(x, std::numeric_limits<int>::min());
+}
+
BOOST_AUTO_TEST_CASE_TEMPLATE(cmp_mp_int_lt_unsigned_integral_type, mp_int_type, mp_int_types)
{
const mp_int_type x("123456789");
@@ -130,12 +149,6 @@
BOOST_CHECK_LE(x, 32102);
}
-BOOST_AUTO_TEST_CASE_TEMPLATE(cmp_mp_int_le_integral_type3, mp_int_type, mp_int_types)
-{
- const mp_int_type x("0x100000000");
- BOOST_CHECK_LE(1, x);
-}
-
BOOST_AUTO_TEST_CASE_TEMPLATE(cmp_mp_int_le_unsigned_integral_type, mp_int_type, mp_int_types)
{
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