From 2f712771059624d2c948e71fa1fb7f88888493cb Mon Sep 17 00:00:00 2001 From: Gael Guennebaud Date: Thu, 3 Feb 2011 14:45:21 +0100 Subject: [PATCH] add global tan function --- Eigen/src/Core/GlobalFunctions.h | 2 ++ Eigen/src/Core/MathFunctions.h | 38 ++++++++++++++++++++++++++++++++ test/array.cpp | 2 ++ 3 files changed, 42 insertions(+) diff --git a/Eigen/src/Core/GlobalFunctions.h b/Eigen/src/Core/GlobalFunctions.h index c94b578dd..f049bff42 100644 --- a/Eigen/src/Core/GlobalFunctions.h +++ b/Eigen/src/Core/GlobalFunctions.h @@ -56,6 +56,7 @@ namespace std EIGEN_ARRAY_DECLARE_GLOBAL_STD_UNARY(imag,scalar_imag_op) EIGEN_ARRAY_DECLARE_GLOBAL_STD_UNARY(sin,scalar_sin_op) EIGEN_ARRAY_DECLARE_GLOBAL_STD_UNARY(cos,scalar_cos_op) + EIGEN_ARRAY_DECLARE_GLOBAL_STD_UNARY(tan,scalar_tan_op) EIGEN_ARRAY_DECLARE_GLOBAL_STD_UNARY(exp,scalar_exp_op) EIGEN_ARRAY_DECLARE_GLOBAL_STD_UNARY(log,scalar_log_op) EIGEN_ARRAY_DECLARE_GLOBAL_STD_UNARY(abs,scalar_abs_op) @@ -76,6 +77,7 @@ namespace Eigen EIGEN_ARRAY_DECLARE_GLOBAL_EIGEN_UNARY(imag,scalar_imag_op) EIGEN_ARRAY_DECLARE_GLOBAL_EIGEN_UNARY(sin,scalar_sin_op) EIGEN_ARRAY_DECLARE_GLOBAL_EIGEN_UNARY(cos,scalar_cos_op) + EIGEN_ARRAY_DECLARE_GLOBAL_EIGEN_UNARY(tan,scalar_tan_op) EIGEN_ARRAY_DECLARE_GLOBAL_EIGEN_UNARY(exp,scalar_exp_op) EIGEN_ARRAY_DECLARE_GLOBAL_EIGEN_UNARY(log,scalar_log_op) EIGEN_ARRAY_DECLARE_GLOBAL_EIGEN_UNARY(abs,scalar_abs_op) diff --git a/Eigen/src/Core/MathFunctions.h b/Eigen/src/Core/MathFunctions.h index 8e7def187..4138ab436 100644 --- a/Eigen/src/Core/MathFunctions.h +++ b/Eigen/src/Core/MathFunctions.h @@ -567,6 +567,44 @@ inline EIGEN_MATHFUNC_RETVAL(sin, Scalar) sin(const Scalar& x) return EIGEN_MATHFUNC_IMPL(sin, Scalar)::run(x); } +/**************************************************************************** +* Implementation of tan * +****************************************************************************/ + +template +struct tan_default_impl +{ + static inline Scalar run(const Scalar& x) + { + return std::tan(x); + } +}; + +template +struct tan_default_impl +{ + static inline Scalar run(const Scalar&) + { + EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar) + return Scalar(0); + } +}; + +template +struct tan_impl : tan_default_impl::IsInteger> {}; + +template +struct tan_retval +{ + typedef Scalar type; +}; + +template +inline EIGEN_MATHFUNC_RETVAL(tan, Scalar) tan(const Scalar& x) +{ + return EIGEN_MATHFUNC_IMPL(tan, Scalar)::run(x); +} + /**************************************************************************** * Implementation of log * ****************************************************************************/ diff --git a/test/array.cpp b/test/array.cpp index 7da4c998c..26c6c33b7 100644 --- a/test/array.cpp +++ b/test/array.cpp @@ -173,6 +173,8 @@ template void array_real(const ArrayType& m) VERIFY_IS_APPROX(m1.sin(), internal::sin(m1)); VERIFY_IS_APPROX(m1.cos(), std::cos(m1)); VERIFY_IS_APPROX(m1.cos(), internal::cos(m1)); + VERIFY_IS_APPROX(m1.tan(), std::tan(m1)); + VERIFY_IS_APPROX(m1.tan(), internal::tan(m1)); VERIFY_IS_APPROX(internal::cos(m1+RealScalar(3)*m2), internal::cos((m1+RealScalar(3)*m2).eval())); VERIFY_IS_APPROX(std::cos(m1+RealScalar(3)*m2), std::cos((m1+RealScalar(3)*m2).eval()));