diff options
author | Gael Guennebaud <g.gael@free.fr> | 2012-09-08 12:16:49 +0200 |
---|---|---|
committer | Gael Guennebaud <g.gael@free.fr> | 2012-09-08 12:16:49 +0200 |
commit | 24f371bdb433745d56ae0247b08a207bdebec5b5 (patch) | |
tree | 7b024016e727ae9707d48b45e74a9792406a2380 /Eigen | |
parent | 721671cc4e5950e8cb1c905be720d4318bf9fcdb (diff) | |
parent | 1b61aadcbe0f3d8c6898d28b7605347a7643190d (diff) |
Merged in jdh8/eigen (pull request PR-16)
Diffstat (limited to 'Eigen')
-rw-r--r-- | Eigen/src/Core/MathFunctions.h | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/Eigen/src/Core/MathFunctions.h b/Eigen/src/Core/MathFunctions.h index 05e913f2f..5b57c2ff2 100644 --- a/Eigen/src/Core/MathFunctions.h +++ b/Eigen/src/Core/MathFunctions.h @@ -520,6 +520,53 @@ inline EIGEN_MATHFUNC_RETVAL(atan2, Scalar) atan2(const Scalar& x, const Scalar& } /**************************************************************************** +* Implementation of atanh2 * +****************************************************************************/ + +template<typename Scalar, bool IsInteger> +struct atanh2_default_impl +{ + typedef Scalar retval; + typedef typename NumTraits<Scalar>::Real RealScalar; + static inline Scalar run(const Scalar& x, const Scalar& y) + { + using std::abs; + using std::log; + using std::sqrt; + Scalar z = x / y; + if (abs(z) > sqrt(NumTraits<RealScalar>::epsilon())) + return RealScalar(0.5) * log((y + x) / (y - x)); + else + return z + z*z*z / RealScalar(3); + } +}; + +template<typename Scalar> +struct atanh2_default_impl<Scalar, true> +{ + static inline Scalar run(const Scalar&, const Scalar&) + { + EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar) + return Scalar(0); + } +}; + +template<typename Scalar> +struct atanh2_impl : atanh2_default_impl<Scalar, NumTraits<Scalar>::IsInteger> {}; + +template<typename Scalar> +struct atanh2_retval +{ + typedef Scalar type; +}; + +template<typename Scalar> +inline EIGEN_MATHFUNC_RETVAL(atanh2, Scalar) atanh2(const Scalar& x, const Scalar& y) +{ + return EIGEN_MATHFUNC_IMPL(atanh2, Scalar)::run(x, y); +} + +/**************************************************************************** * Implementation of pow * ****************************************************************************/ |