diff options
author | 2019-08-08 16:27:32 -0700 | |
---|---|---|
committer | 2019-08-08 16:27:32 -0700 | |
commit | d55d392e7b1136655b4223bea8e99cb2fe0a8afd (patch) | |
tree | f9ca738e2df8ab2d6944395145682d0c048daa7c | |
parent | 85928e5f4746c50c546fd67a0762beeb99625404 (diff) |
Fix bugs in log1p and expm1 where repeated using statements would clobber each other.
Add specializations for complex types since std::log1p and std::exp1m do not support complex.
-rw-r--r-- | Eigen/src/Core/MathFunctions.h | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/Eigen/src/Core/MathFunctions.h b/Eigen/src/Core/MathFunctions.h index 685042dc0..8bef59354 100644 --- a/Eigen/src/Core/MathFunctions.h +++ b/Eigen/src/Core/MathFunctions.h @@ -512,12 +512,22 @@ struct expm1_impl { EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar) #if EIGEN_HAS_CXX11_MATH using std::expm1; - #endif + #else using std_fallback::expm1; + #endif return expm1(x); } }; +// Specialization for complex types that are not supported by std::expm1. +template <typename RealScalar> +struct expm1_impl<std::complex<RealScalar> > { + EIGEN_DEVICE_FUNC static inline std::complex<RealScalar> run( + const std::complex<RealScalar>& x) { + EIGEN_STATIC_ASSERT_NON_INTEGER(RealScalar) + return std_fallback::expm1(x); + } +}; template<typename Scalar> struct expm1_retval @@ -549,12 +559,22 @@ struct log1p_impl { EIGEN_STATIC_ASSERT_NON_INTEGER(Scalar) #if EIGEN_HAS_CXX11_MATH using std::log1p; - #endif + #else using std_fallback::log1p; + #endif return log1p(x); } }; +// Specialization for complex types that are not supported by std::log1p. +template <typename RealScalar> +struct log1p_impl<std::complex<RealScalar> > { + EIGEN_DEVICE_FUNC static inline std::complex<RealScalar> run( + const std::complex<RealScalar>& x) { + EIGEN_STATIC_ASSERT_NON_INTEGER(RealScalar) + return std_fallback::log1p(x); + } +}; template<typename Scalar> struct log1p_retval |