annotate DEPENDENCIES/generic/include/boost/math/special_functions/pow.hpp @ 125:34e428693f5d vext

Vext -> Repoint
author Chris Cannam
date Thu, 14 Jun 2018 11:15:39 +0100
parents c530137014c0
children
rev   line source
Chris@16 1 // Boost pow.hpp header file
Chris@16 2 // Computes a power with exponent known at compile-time
Chris@16 3
Chris@16 4 // (C) Copyright Bruno Lalande 2008.
Chris@16 5 // Distributed under the Boost Software License, Version 1.0.
Chris@16 6 // (See accompanying file LICENSE_1_0.txt or copy at
Chris@16 7 // http://www.boost.org/LICENSE_1_0.txt)
Chris@16 8
Chris@16 9 // See http://www.boost.org for updates, documentation, and revision history.
Chris@16 10
Chris@16 11
Chris@16 12 #ifndef BOOST_MATH_POW_HPP
Chris@16 13 #define BOOST_MATH_POW_HPP
Chris@16 14
Chris@16 15
Chris@101 16 #include <boost/math/special_functions/math_fwd.hpp>
Chris@16 17 #include <boost/math/policies/policy.hpp>
Chris@16 18 #include <boost/math/policies/error_handling.hpp>
Chris@16 19 #include <boost/math/tools/promotion.hpp>
Chris@16 20 #include <boost/mpl/greater_equal.hpp>
Chris@16 21
Chris@16 22
Chris@16 23 namespace boost {
Chris@16 24 namespace math {
Chris@16 25
Chris@101 26 #ifdef BOOST_MSVC
Chris@101 27 #pragma warning(push)
Chris@101 28 #pragma warning(disable:4702) // Unreachable code, only triggered in release mode and /W4
Chris@101 29 #endif
Chris@16 30
Chris@16 31 namespace detail {
Chris@16 32
Chris@16 33
Chris@16 34 template <int N, int M = N%2>
Chris@16 35 struct positive_power
Chris@16 36 {
Chris@16 37 template <typename T>
Chris@16 38 static T result(T base)
Chris@16 39 {
Chris@16 40 T power = positive_power<N/2>::result(base);
Chris@16 41 return power * power;
Chris@16 42 }
Chris@16 43 };
Chris@16 44
Chris@16 45 template <int N>
Chris@16 46 struct positive_power<N, 1>
Chris@16 47 {
Chris@16 48 template <typename T>
Chris@16 49 static T result(T base)
Chris@16 50 {
Chris@16 51 T power = positive_power<N/2>::result(base);
Chris@16 52 return base * power * power;
Chris@16 53 }
Chris@16 54 };
Chris@16 55
Chris@16 56 template <>
Chris@16 57 struct positive_power<1, 1>
Chris@16 58 {
Chris@16 59 template <typename T>
Chris@16 60 static T result(T base){ return base; }
Chris@16 61 };
Chris@16 62
Chris@16 63
Chris@16 64 template <int N, bool>
Chris@16 65 struct power_if_positive
Chris@16 66 {
Chris@16 67 template <typename T, class Policy>
Chris@16 68 static T result(T base, const Policy&)
Chris@16 69 { return positive_power<N>::result(base); }
Chris@16 70 };
Chris@16 71
Chris@16 72 template <int N>
Chris@16 73 struct power_if_positive<N, false>
Chris@16 74 {
Chris@16 75 template <typename T, class Policy>
Chris@16 76 static T result(T base, const Policy& policy)
Chris@16 77 {
Chris@16 78 if (base == 0)
Chris@16 79 {
Chris@16 80 return policies::raise_overflow_error<T>(
Chris@16 81 "boost::math::pow(%1%)",
Chris@16 82 "Attempted to compute a negative power of 0",
Chris@16 83 policy
Chris@16 84 );
Chris@16 85 }
Chris@16 86
Chris@16 87 return T(1) / positive_power<-N>::result(base);
Chris@16 88 }
Chris@16 89 };
Chris@16 90
Chris@16 91 template <>
Chris@16 92 struct power_if_positive<0, true>
Chris@16 93 {
Chris@16 94 template <typename T, class Policy>
Chris@16 95 static T result(T base, const Policy& policy)
Chris@16 96 {
Chris@16 97 if (base == 0)
Chris@16 98 {
Chris@16 99 return policies::raise_indeterminate_result_error<T>(
Chris@16 100 "boost::math::pow(%1%)",
Chris@16 101 "The result of pow<0>(%1%) is undetermined",
Chris@16 102 base,
Chris@16 103 T(1),
Chris@16 104 policy
Chris@16 105 );
Chris@16 106 }
Chris@16 107
Chris@16 108 return T(1);
Chris@16 109 }
Chris@16 110 };
Chris@16 111
Chris@16 112
Chris@16 113 template <int N>
Chris@16 114 struct select_power_if_positive
Chris@16 115 {
Chris@16 116 typedef typename mpl::greater_equal<
Chris@16 117 mpl::int_<N>,
Chris@16 118 mpl::int_<0>
Chris@16 119 >::type is_positive;
Chris@16 120
Chris@16 121 typedef power_if_positive<N, is_positive::value> type;
Chris@16 122 };
Chris@16 123
Chris@16 124
Chris@16 125 } // namespace detail
Chris@16 126
Chris@16 127
Chris@16 128 template <int N, typename T, class Policy>
Chris@16 129 inline typename tools::promote_args<T>::type pow(T base, const Policy& policy)
Chris@16 130 {
Chris@16 131 typedef typename tools::promote_args<T>::type result_type;
Chris@16 132 return detail::select_power_if_positive<N>::type::result(static_cast<result_type>(base), policy);
Chris@16 133 }
Chris@16 134
Chris@16 135
Chris@16 136 template <int N, typename T>
Chris@16 137 inline typename tools::promote_args<T>::type pow(T base)
Chris@16 138 { return pow<N>(base, policies::policy<>()); }
Chris@16 139
Chris@101 140 #ifdef BOOST_MSVC
Chris@101 141 #pragma warning(pop)
Chris@101 142 #endif
Chris@16 143
Chris@16 144 } // namespace math
Chris@16 145 } // namespace boost
Chris@16 146
Chris@16 147
Chris@16 148 #endif