diff options
author | Rasmus Munk Larsen <rmlarsen@google.com> | 2020-07-07 01:54:04 +0000 |
---|---|---|
committer | Rasmus Munk Larsen <rmlarsen@google.com> | 2020-07-07 01:54:04 +0000 |
commit | 6964ae8d52d42d2821572fc8359e56c821289e00 (patch) | |
tree | 18eee0bf5a4d10d026420a540879d908e9bb9fc6 /Eigen/src/Core/functors | |
parent | cb6315318316653479b184db447bc29040be8e6e (diff) |
Change the sign operator in Eigen to return NaN for NaN arguments, not zero.
Diffstat (limited to 'Eigen/src/Core/functors')
-rw-r--r-- | Eigen/src/Core/functors/UnaryFunctors.h | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/Eigen/src/Core/functors/UnaryFunctors.h b/Eigen/src/Core/functors/UnaryFunctors.h index 735d28ac8..a9cbfd967 100644 --- a/Eigen/src/Core/functors/UnaryFunctors.h +++ b/Eigen/src/Core/functors/UnaryFunctors.h @@ -904,9 +904,9 @@ struct functor_traits<scalar_boolean_not_op<Scalar> > { * \brief Template functor to compute the signum of a scalar * \sa class CwiseUnaryOp, Cwise::sign() */ -template<typename Scalar,bool iscpx=(NumTraits<Scalar>::IsComplex!=0) > struct scalar_sign_op; +template<typename Scalar,bool is_complex=(NumTraits<Scalar>::IsComplex!=0), bool is_integer=(NumTraits<Scalar>::IsInteger!=0) > struct scalar_sign_op; template<typename Scalar> -struct scalar_sign_op<Scalar,false> { +struct scalar_sign_op<Scalar, false, true> { EIGEN_EMPTY_STRUCT_CTOR(scalar_sign_op) EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { @@ -916,8 +916,21 @@ struct scalar_sign_op<Scalar,false> { //template <typename Packet> //EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::psign(a); } }; + template<typename Scalar> -struct scalar_sign_op<Scalar,true> { +struct scalar_sign_op<Scalar, false, false> { + EIGEN_EMPTY_STRUCT_CTOR(scalar_sign_op) + EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const + { + return (numext::isnan)(a) ? a : Scalar( (a>Scalar(0)) - (a<Scalar(0)) ); + } + //TODO + //template <typename Packet> + //EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::psign(a); } +}; + +template<typename Scalar, bool is_integer> +struct scalar_sign_op<Scalar,true, is_integer> { EIGEN_EMPTY_STRUCT_CTOR(scalar_sign_op) EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const { |