/////////////////////////////////////////////////////////////// // 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_ // // Compare arithmetic results using fixed_int to GMP results. // #ifdef _MSC_VER # define _SCL_SECURE_NO_WARNINGS #endif #include #include "test.hpp" template void test() { using namespace boost::multiprecision; typedef Number test_type; if(std::numeric_limits::is_bounded) { test_type val = (std::numeric_limits::max)(); BOOST_CHECK_THROW(++val, std::overflow_error); val = (std::numeric_limits::max)(); BOOST_CHECK_THROW(test_type(1 + val), std::overflow_error); BOOST_CHECK_THROW(test_type(val + 1), std::overflow_error); BOOST_CHECK_THROW(test_type(2 * val), std::overflow_error); val /= 2; val += 1; BOOST_CHECK_THROW(test_type(2 * val), std::overflow_error); if(std::numeric_limits::is_signed) { val = (std::numeric_limits::min)(); BOOST_CHECK_THROW(--val, std::overflow_error); val = (std::numeric_limits::min)(); BOOST_CHECK_THROW(test_type(val - 1), std::overflow_error); BOOST_CHECK_THROW(test_type(2 * val), std::overflow_error); val /= 2; val -= 1; BOOST_CHECK_THROW(test_type(2 * val), std::overflow_error); } else { val = (std::numeric_limits::min)(); BOOST_CHECK_THROW(--val, std::range_error); val = (std::numeric_limits::min)(); BOOST_CHECK_THROW(test_type(val - 1), std::range_error); } } if(std::numeric_limits::is_signed) { test_type a = -1; test_type b = 1; BOOST_CHECK_THROW(test_type(a | b), std::range_error); BOOST_CHECK_THROW(test_type(a & b), std::range_error); BOOST_CHECK_THROW(test_type(a ^ b), std::range_error); } else { // Constructing from a negative value is not allowed: BOOST_CHECK_THROW(test_type(-2), std::range_error); BOOST_CHECK_THROW(test_type("-2"), std::range_error); } if(std::numeric_limits::digits < std::numeric_limits::digits) { long long llm = (std::numeric_limits::max)(); test_type t; BOOST_CHECK_THROW(t = llm, std::range_error); BOOST_CHECK_THROW(t = static_cast(llm), std::range_error); unsigned long long ullm = (std::numeric_limits::max)(); BOOST_CHECK_THROW(t = ullm, std::range_error); BOOST_CHECK_THROW(t = static_cast(ullm), std::range_error); static const checked_uint512_t big = (std::numeric_limits::max)(); BOOST_CHECK_THROW(t = static_cast(big), std::range_error); } // // String errors: // BOOST_CHECK_THROW(test_type("12A"), std::runtime_error); BOOST_CHECK_THROW(test_type("0658"), std::runtime_error); if(std::numeric_limits::is_signed) { BOOST_CHECK_THROW(test_type(-2).str(0, std::ios_base::hex), std::runtime_error); BOOST_CHECK_THROW(test_type(-2).str(0, std::ios_base::oct), std::runtime_error); } } int main() { using namespace boost::multiprecision; test > >(); test(); test(); test > >(); test > >(); // // We also need to test type with "odd" bit counts in order to ensure full code coverage: // test > >(); test > >(); test > >(); test > >(); return boost::report_errors(); }