From fa6b1ad9ea9cfbceb9f124256ba4068265b97d5c Mon Sep 17 00:00:00 2001 From: John Maddock Date: Tue, 4 Oct 2011 18:23:26 +0000 Subject: [PATCH] Add exponent_type as a requirement for floating point backends. Made use of that type in code, and suppressed a few warnings. [SVN r74704] --- .../multiprecision/arithmetic_backend.hpp | 1 + .../concepts/mp_number_architypes.hpp | 1 + .../multiprecision/detail/functions/pow.hpp | 21 ++++++++++++------- include/boost/multiprecision/gmp.hpp | 1 + include/boost/multiprecision/mpfr.hpp | 1 + 5 files changed, 17 insertions(+), 8 deletions(-) diff --git a/include/boost/multiprecision/arithmetic_backend.hpp b/include/boost/multiprecision/arithmetic_backend.hpp index f5429c48..a58a2b6d 100644 --- a/include/boost/multiprecision/arithmetic_backend.hpp +++ b/include/boost/multiprecision/arithmetic_backend.hpp @@ -21,6 +21,7 @@ struct arithmetic_backend typedef mpl::list signed_types; typedef mpl::list unsigned_types; typedef mpl::list real_types; + typedef int exponent_type; arithmetic_backend(){} arithmetic_backend(const arithmetic_backend& o) diff --git a/include/boost/multiprecision/concepts/mp_number_architypes.hpp b/include/boost/multiprecision/concepts/mp_number_architypes.hpp index 032f78f7..92402dbc 100644 --- a/include/boost/multiprecision/concepts/mp_number_architypes.hpp +++ b/include/boost/multiprecision/concepts/mp_number_architypes.hpp @@ -28,6 +28,7 @@ struct mp_number_backend_real_architype typedef mpl::list signed_types; typedef mpl::list unsigned_types; typedef mpl::list real_types; + typedef int exponent_type; mp_number_backend_real_architype() { diff --git a/include/boost/multiprecision/detail/functions/pow.hpp b/include/boost/multiprecision/detail/functions/pow.hpp index 63f6f223..44a70c53 100644 --- a/include/boost/multiprecision/detail/functions/pow.hpp +++ b/include/boost/multiprecision/detail/functions/pow.hpp @@ -143,7 +143,10 @@ void eval_exp(T& result, const T& x) eval_exp(temp, x); result = temp; } - typedef typename mpl::front::type ui_type; + typedef typename boost::multiprecision::detail::canonical::type ui_type; + typedef typename boost::multiprecision::detail::canonical::type si_type; + typedef typename T::exponent_type exp_type; + typedef typename boost::multiprecision::detail::canonical::type canonical_exp_type; // Handle special arguments. int type = eval_fpclassify(x); bool isneg = get_sign(x) < 0; @@ -174,7 +177,7 @@ void eval_exp(T& result, const T& x) xx.negate(); // Check the range of the argument. - static const boost::intmax_t maximum_arg_for_exp = std::numeric_limits >::max_exponent == 0 ? std::numeric_limits::max() : std::numeric_limits >::max_exponent; + static const canonical_exp_type maximum_arg_for_exp = std::numeric_limits >::max_exponent == 0 ? std::numeric_limits::max() : std::numeric_limits >::max_exponent; if(xx.compare(maximum_arg_for_exp) >= 0) { @@ -213,13 +216,13 @@ void eval_exp(T& result, const T& x) if(b_scale) { divide(result, xx, get_constant_ln2()); - boost::intmax_t n; + exp_type n; convert_to(&n, result); // The scaling is 2^11 = 2048. - static const long long p2 = static_cast(boost::uint32_t(1u) << 11); + static const si_type p2 = static_cast(si_type(1) << 11); - multiply(exp_series, get_constant_ln2(), n); + multiply(exp_series, get_constant_ln2(), static_cast(n)); subtract(exp_series, xx); divide(exp_series, p2); exp_series.negate(); @@ -257,14 +260,16 @@ void eval_log(T& result, const T& arg) result = temp; } - typedef typename boost::multiprecision::detail::canonical::type long_type; + typedef typename boost::multiprecision::detail::canonical::type si_type; typedef typename boost::multiprecision::detail::canonical::type ui_type; + typedef typename T::exponent_type exp_type; + typedef typename boost::multiprecision::detail::canonical::type canonical_exp_type; - int e; + exp_type e; T t; eval_frexp(t, arg, &e); - multiply(result, get_constant_ln2(), long_type(e)); + multiply(result, get_constant_ln2(), canonical_exp_type(e)); subtract(t, ui_type(1)); /* -0.5 <= t <= 0 */ t.negate(); /* 0 <= t <= 0.5 */ T pow = t; diff --git a/include/boost/multiprecision/gmp.hpp b/include/boost/multiprecision/gmp.hpp index bcaaf1e0..7aab73ab 100644 --- a/include/boost/multiprecision/gmp.hpp +++ b/include/boost/multiprecision/gmp.hpp @@ -28,6 +28,7 @@ struct gmp_real_imp typedef mpl::list signed_types; typedef mpl::list unsigned_types; typedef mpl::list real_types; + typedef long exponent_type; gmp_real_imp(){} diff --git a/include/boost/multiprecision/mpfr.hpp b/include/boost/multiprecision/mpfr.hpp index 062d926a..b4d6286e 100644 --- a/include/boost/multiprecision/mpfr.hpp +++ b/include/boost/multiprecision/mpfr.hpp @@ -30,6 +30,7 @@ struct mpfr_real_imp typedef mpl::list signed_types; typedef mpl::list unsigned_types; typedef mpl::list real_types; + typedef long exponent_type; mpfr_real_imp(){}