diff options
author | Anas Nashif <anas.nashif@intel.com> | 2012-10-30 12:57:26 -0700 |
---|---|---|
committer | Anas Nashif <anas.nashif@intel.com> | 2012-10-30 12:57:26 -0700 |
commit | 1a78a62555be32868418fe52f8e330c9d0f95d5a (patch) | |
tree | d3765a80e7d3b9640ec2e930743630cd6b9fce2b /boost/math/special_functions/powm1.hpp | |
download | boost-1a78a62555be32868418fe52f8e330c9d0f95d5a.tar.gz boost-1a78a62555be32868418fe52f8e330c9d0f95d5a.tar.bz2 boost-1a78a62555be32868418fe52f8e330c9d0f95d5a.zip |
Imported Upstream version 1.49.0upstream/1.49.0
Diffstat (limited to 'boost/math/special_functions/powm1.hpp')
-rw-r--r-- | boost/math/special_functions/powm1.hpp | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/boost/math/special_functions/powm1.hpp b/boost/math/special_functions/powm1.hpp new file mode 100644 index 0000000000..cb33ae03d0 --- /dev/null +++ b/boost/math/special_functions/powm1.hpp @@ -0,0 +1,61 @@ +// (C) Copyright John Maddock 2006. +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + +#ifndef BOOST_MATH_POWM1 +#define BOOST_MATH_POWM1 + +#ifdef _MSC_VER +#pragma once +#endif + +#include <boost/math/special_functions/log1p.hpp> +#include <boost/math/special_functions/expm1.hpp> +#include <boost/math/special_functions/math_fwd.hpp> +#include <boost/assert.hpp> + +namespace boost{ namespace math{ namespace detail{ + +template <class T, class Policy> +inline T powm1_imp(const T a, const T z, const Policy& pol) +{ + BOOST_MATH_STD_USING + + if((fabs(a) < 1) || (fabs(z) < 1)) + { + T p = log(a) * z; + if(fabs(p) < 2) + return boost::math::expm1(p, pol); + // otherwise fall though: + } + return pow(a, z) - 1; +} + +} // detail + +template <class T1, class T2> +inline typename tools::promote_args<T1, T2>::type + powm1(const T1 a, const T2 z) +{ + typedef typename tools::promote_args<T1, T2>::type result_type; + return detail::powm1_imp(static_cast<result_type>(a), static_cast<result_type>(z), policies::policy<>()); +} + +template <class T1, class T2, class Policy> +inline typename tools::promote_args<T1, T2>::type + powm1(const T1 a, const T2 z, const Policy& pol) +{ + typedef typename tools::promote_args<T1, T2>::type result_type; + return detail::powm1_imp(static_cast<result_type>(a), static_cast<result_type>(z), pol); +} + +} // namespace math +} // namespace boost + +#endif // BOOST_MATH_POWM1 + + + + + |