Chris@16: /////////////////////////////////////////////////////////////// Chris@16: // Copyright 2012 John Maddock. Distributed under the Boost Chris@16: // Software License, Version 1.0. (See accompanying file Chris@16: // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_ Chris@16: // Chris@16: // Comparison operators for cpp_int_backend: Chris@16: // Chris@16: #ifndef BOOST_MP_CPP_INT_LIM_HPP Chris@16: #define BOOST_MP_CPP_INT_LIM_HPP Chris@16: Chris@16: namespace std{ Chris@16: Chris@16: namespace detail{ Chris@16: Chris@16: template Chris@16: inline boost::multiprecision::number, ExpressionTemplates> Chris@16: get_min(const boost::mpl::true_&, const boost::mpl::true_&) Chris@16: { Chris@16: // Bounded and signed. Chris@16: typedef boost::multiprecision::number, ExpressionTemplates> result_type; Chris@16: typedef boost::multiprecision::number, ExpressionTemplates> ui_type; Chris@16: static const result_type val = -result_type(~ui_type(0)); Chris@16: return val; Chris@16: } Chris@16: Chris@16: template Chris@16: inline boost::multiprecision::number, ExpressionTemplates> Chris@16: get_min(const boost::mpl::true_&, const boost::mpl::false_&) Chris@16: { Chris@16: // Bounded and unsigned: Chris@16: static const boost::multiprecision::number, ExpressionTemplates> val(0u); Chris@16: return val; Chris@16: } Chris@16: Chris@16: template Chris@16: inline boost::multiprecision::number, ExpressionTemplates> Chris@16: get_min(const boost::mpl::false_&, const boost::mpl::true_&) Chris@16: { Chris@16: // Unbounded and signed. Chris@16: // There is no minimum value, just return 0: Chris@16: static const boost::multiprecision::number, ExpressionTemplates> val(0u); Chris@16: return val; Chris@16: } Chris@16: Chris@16: template Chris@16: inline boost::multiprecision::number, ExpressionTemplates> Chris@16: get_min(const boost::mpl::false_&, const boost::mpl::false_&) Chris@16: { Chris@16: // Unbound and unsigned: Chris@16: static const boost::multiprecision::number, ExpressionTemplates> val(0u); Chris@16: return val; Chris@16: } Chris@16: Chris@16: template Chris@16: inline boost::multiprecision::number, ExpressionTemplates> Chris@16: get_max(const boost::mpl::true_&, const boost::mpl::true_&) Chris@16: { Chris@16: // Bounded and signed. Chris@16: typedef boost::multiprecision::number, ExpressionTemplates> result_type; Chris@16: typedef boost::multiprecision::number, ExpressionTemplates> ui_type; Chris@16: static const result_type val = ~ui_type(0); Chris@16: return val; Chris@16: } Chris@16: Chris@16: template Chris@16: inline boost::multiprecision::number, ExpressionTemplates> Chris@16: get_max(const boost::mpl::true_&, const boost::mpl::false_&) Chris@16: { Chris@16: // Bound and unsigned: Chris@16: typedef boost::multiprecision::number, ExpressionTemplates> result_type; Chris@16: typedef boost::multiprecision::number, ExpressionTemplates> ui_type; Chris@16: static const result_type val = ~ui_type(0); Chris@16: return val; Chris@16: } Chris@16: Chris@16: template Chris@16: inline boost::multiprecision::number, ExpressionTemplates> Chris@16: get_max(const boost::mpl::false_&, const boost::mpl::true_&) Chris@16: { Chris@16: // Unbounded and signed. Chris@16: // There is no maximum value, just return 0: Chris@16: static const boost::multiprecision::number, ExpressionTemplates> val(0u); Chris@16: return val; Chris@16: } Chris@16: Chris@16: template Chris@16: inline boost::multiprecision::number, ExpressionTemplates> Chris@16: get_max(const boost::mpl::false_&, const boost::mpl::false_&) Chris@16: { Chris@16: // Unbound and unsigned: Chris@16: static const boost::multiprecision::number, ExpressionTemplates> val(0u); Chris@16: return val; Chris@16: } Chris@16: Chris@16: } Chris@16: Chris@16: template Chris@16: class numeric_limits, ExpressionTemplates> > Chris@16: { Chris@16: typedef boost::multiprecision::cpp_int_backend backend_type; Chris@16: typedef boost::multiprecision::number number_type; Chris@16: Chris@16: struct inititializer Chris@16: { Chris@16: inititializer() Chris@16: { Chris@16: (std::numeric_limits::max)(); Chris@16: (std::numeric_limits::min)(); Chris@16: } Chris@16: void do_nothing()const{} Chris@16: }; Chris@16: Chris@16: static const inititializer init; Chris@16: Chris@16: public: Chris@16: BOOST_STATIC_CONSTEXPR bool is_specialized = true; Chris@16: // Chris@16: // Largest and smallest numbers are bounded only by available memory, set Chris@16: // to zero: Chris@16: // Chris@16: static number_type (min)() Chris@16: { Chris@16: init.do_nothing(); Chris@16: return detail::get_min(boost::multiprecision::backends::is_fixed_precision(), boost::multiprecision::is_signed_number()); Chris@16: } Chris@16: static number_type (max)() Chris@16: { Chris@16: init.do_nothing(); Chris@16: return detail::get_max(boost::multiprecision::backends::is_fixed_precision(), boost::multiprecision::is_signed_number()); Chris@16: } Chris@16: static number_type lowest() { return (min)(); } Chris@16: BOOST_STATIC_CONSTEXPR int digits = boost::multiprecision::backends::max_precision::value == UINT_MAX ? INT_MAX : boost::multiprecision::backends::max_precision::value; Chris@16: BOOST_STATIC_CONSTEXPR int digits10 = (digits > INT_MAX / 301) ? (digits / 1000) * 301L : (digits * 301) / 1000; Chris@16: BOOST_STATIC_CONSTEXPR int max_digits10 = digits10 + 2; Chris@16: BOOST_STATIC_CONSTEXPR bool is_signed = boost::multiprecision::is_signed_number::value; Chris@16: BOOST_STATIC_CONSTEXPR bool is_integer = true; Chris@16: BOOST_STATIC_CONSTEXPR bool is_exact = true; Chris@16: BOOST_STATIC_CONSTEXPR int radix = 2; Chris@16: static number_type epsilon() { return 0; } Chris@16: static number_type round_error() { return 0; } Chris@16: BOOST_STATIC_CONSTEXPR int min_exponent = 0; Chris@16: BOOST_STATIC_CONSTEXPR int min_exponent10 = 0; Chris@16: BOOST_STATIC_CONSTEXPR int max_exponent = 0; Chris@16: BOOST_STATIC_CONSTEXPR int max_exponent10 = 0; Chris@16: BOOST_STATIC_CONSTEXPR bool has_infinity = false; Chris@16: BOOST_STATIC_CONSTEXPR bool has_quiet_NaN = false; Chris@16: BOOST_STATIC_CONSTEXPR bool has_signaling_NaN = false; Chris@16: BOOST_STATIC_CONSTEXPR float_denorm_style has_denorm = denorm_absent; Chris@16: BOOST_STATIC_CONSTEXPR bool has_denorm_loss = false; Chris@16: static number_type infinity() { return 0; } Chris@16: static number_type quiet_NaN() { return 0; } Chris@16: static number_type signaling_NaN() { return 0; } Chris@16: static number_type denorm_min() { return 0; } Chris@16: BOOST_STATIC_CONSTEXPR bool is_iec559 = false; Chris@16: BOOST_STATIC_CONSTEXPR bool is_bounded = boost::multiprecision::backends::is_fixed_precision::value; Chris@16: BOOST_STATIC_CONSTEXPR bool is_modulo = (boost::multiprecision::backends::is_fixed_precision::value && (Checked == boost::multiprecision::unchecked)); Chris@16: BOOST_STATIC_CONSTEXPR bool traps = false; Chris@16: BOOST_STATIC_CONSTEXPR bool tinyness_before = false; Chris@16: BOOST_STATIC_CONSTEXPR float_round_style round_style = round_toward_zero; Chris@16: }; Chris@16: Chris@16: template Chris@16: const typename numeric_limits, ExpressionTemplates> >::inititializer numeric_limits, ExpressionTemplates> >::init; Chris@16: Chris@16: #ifndef BOOST_NO_INCLASS_MEMBER_INITIALIZATION Chris@16: Chris@16: template Chris@16: BOOST_CONSTEXPR_OR_CONST int numeric_limits, ExpressionTemplates> >::digits; Chris@16: template Chris@16: BOOST_CONSTEXPR_OR_CONST int numeric_limits, ExpressionTemplates> >::digits10; Chris@16: template Chris@16: BOOST_CONSTEXPR_OR_CONST int numeric_limits, ExpressionTemplates> >::max_digits10; Chris@16: template Chris@16: BOOST_CONSTEXPR_OR_CONST bool numeric_limits, ExpressionTemplates> >::is_signed; Chris@16: template Chris@16: BOOST_CONSTEXPR_OR_CONST bool numeric_limits, ExpressionTemplates> >::is_integer; Chris@16: template Chris@16: BOOST_CONSTEXPR_OR_CONST bool numeric_limits, ExpressionTemplates> >::is_exact; Chris@16: template Chris@16: BOOST_CONSTEXPR_OR_CONST int numeric_limits, ExpressionTemplates> >::radix; Chris@16: template Chris@16: BOOST_CONSTEXPR_OR_CONST int numeric_limits, ExpressionTemplates> >::min_exponent; Chris@16: template Chris@16: BOOST_CONSTEXPR_OR_CONST int numeric_limits, ExpressionTemplates> >::min_exponent10; Chris@16: template Chris@16: BOOST_CONSTEXPR_OR_CONST int numeric_limits, ExpressionTemplates> >::max_exponent; Chris@16: template Chris@16: BOOST_CONSTEXPR_OR_CONST int numeric_limits, ExpressionTemplates> >::max_exponent10; Chris@16: template Chris@16: BOOST_CONSTEXPR_OR_CONST bool numeric_limits, ExpressionTemplates> >::has_infinity; Chris@16: template Chris@16: BOOST_CONSTEXPR_OR_CONST bool numeric_limits, ExpressionTemplates> >::has_quiet_NaN; Chris@16: template Chris@16: BOOST_CONSTEXPR_OR_CONST bool numeric_limits, ExpressionTemplates> >::has_signaling_NaN; Chris@16: template Chris@16: BOOST_CONSTEXPR_OR_CONST float_denorm_style numeric_limits, ExpressionTemplates> >::has_denorm; Chris@16: template Chris@16: BOOST_CONSTEXPR_OR_CONST bool numeric_limits, ExpressionTemplates> >::has_denorm_loss; Chris@16: template Chris@16: BOOST_CONSTEXPR_OR_CONST bool numeric_limits, ExpressionTemplates> >::is_iec559; Chris@16: template Chris@16: BOOST_CONSTEXPR_OR_CONST bool numeric_limits, ExpressionTemplates> >::is_bounded; Chris@16: template Chris@16: BOOST_CONSTEXPR_OR_CONST bool numeric_limits, ExpressionTemplates> >::is_modulo; Chris@16: template Chris@16: BOOST_CONSTEXPR_OR_CONST bool numeric_limits, ExpressionTemplates> >::traps; Chris@16: template Chris@16: BOOST_CONSTEXPR_OR_CONST bool numeric_limits, ExpressionTemplates> >::tinyness_before; Chris@16: template Chris@16: BOOST_CONSTEXPR_OR_CONST float_round_style numeric_limits, ExpressionTemplates> >::round_style; Chris@16: Chris@16: #endif Chris@16: Chris@16: } // namespace std Chris@16: Chris@16: #endif