diff options
author | 2012-08-30 23:40:30 +0800 | |
---|---|---|
committer | 2012-08-30 23:40:30 +0800 | |
commit | d23134e4a7d689431a717a1ecf376b12b01afa24 (patch) | |
tree | d28a79e969a31a2bf70549d11b1a5938fdbd7828 /Eigen | |
parent | 9da41cc527ec595feb3377d089db6cd3adc9a5c8 (diff) |
Avoid inefficient 2x2 LU. Move atanh to internal for maintainability.
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 * ****************************************************************************/ |