1 // Boost pow.hpp header file
2 // Computes a power with exponent known at compile-time
4 // (C) Copyright Bruno Lalande 2008.
5 // Distributed under the Boost Software License, Version 1.0.
6 // (See accompanying file LICENSE_1_0.txt or copy at
7 // http://www.boost.org/LICENSE_1_0.txt)
9 // See http://www.boost.org for updates, documentation, and revision history.
12 #ifndef BOOST_MATH_POW_HPP
13 #define BOOST_MATH_POW_HPP
16 #include <boost/math/special_functions/math_fwd.hpp>
17 #include <boost/math/policies/policy.hpp>
18 #include <boost/math/policies/error_handling.hpp>
19 #include <boost/math/tools/promotion.hpp>
20 #include <boost/mpl/greater_equal.hpp>
28 #pragma warning(disable:4702) // Unreachable code, only triggered in release mode and /W4
34 template <int N, int M = N%2>
38 static T result(T base)
40 T power = positive_power<N/2>::result(base);
46 struct positive_power<N, 1>
49 static T result(T base)
51 T power = positive_power<N/2>::result(base);
52 return base * power * power;
57 struct positive_power<1, 1>
60 static T result(T base){ return base; }
64 template <int N, bool>
65 struct power_if_positive
67 template <typename T, class Policy>
68 static T result(T base, const Policy&)
69 { return positive_power<N>::result(base); }
73 struct power_if_positive<N, false>
75 template <typename T, class Policy>
76 static T result(T base, const Policy& policy)
80 return policies::raise_overflow_error<T>(
81 "boost::math::pow(%1%)",
82 "Attempted to compute a negative power of 0",
87 return T(1) / positive_power<-N>::result(base);
92 struct power_if_positive<0, true>
94 template <typename T, class Policy>
95 static T result(T base, const Policy& policy)
99 return policies::raise_indeterminate_result_error<T>(
100 "boost::math::pow(%1%)",
101 "The result of pow<0>(%1%) is undetermined",
114 struct select_power_if_positive
116 typedef typename mpl::greater_equal<
121 typedef power_if_positive<N, is_positive::value> type;
125 } // namespace detail
128 template <int N, typename T, class Policy>
129 inline typename tools::promote_args<T>::type pow(T base, const Policy& policy)
131 typedef typename tools::promote_args<T>::type result_type;
132 return detail::select_power_if_positive<N>::type::result(static_cast<result_type>(base), policy);
136 template <int N, typename T>
137 inline typename tools::promote_args<T>::type pow(T base)
138 { return pow<N>(base, policies::policy<>()); }