mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-08-11 19:29:02 +08:00
Change the sign operator in Eigen to return NaN for NaN arguments, not zero.
This commit is contained in:
parent
cb63153183
commit
6964ae8d52
@ -904,9 +904,9 @@ struct functor_traits<scalar_boolean_not_op<Scalar> > {
|
|||||||
* \brief Template functor to compute the signum of a scalar
|
* \brief Template functor to compute the signum of a scalar
|
||||||
* \sa class CwiseUnaryOp, Cwise::sign()
|
* \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>
|
template<typename Scalar>
|
||||||
struct scalar_sign_op<Scalar,false> {
|
struct scalar_sign_op<Scalar, false, true> {
|
||||||
EIGEN_EMPTY_STRUCT_CTOR(scalar_sign_op)
|
EIGEN_EMPTY_STRUCT_CTOR(scalar_sign_op)
|
||||||
EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const
|
EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const
|
||||||
{
|
{
|
||||||
@ -916,8 +916,21 @@ struct scalar_sign_op<Scalar,false> {
|
|||||||
//template <typename Packet>
|
//template <typename Packet>
|
||||||
//EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::psign(a); }
|
//EIGEN_DEVICE_FUNC inline Packet packetOp(const Packet& a) const { return internal::psign(a); }
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename Scalar>
|
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_EMPTY_STRUCT_CTOR(scalar_sign_op)
|
||||||
EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const
|
EIGEN_DEVICE_FUNC inline const Scalar operator() (const Scalar& a) const
|
||||||
{
|
{
|
||||||
|
@ -205,7 +205,7 @@ template<typename Scalar, typename NewType> struct scalar_cast_op;
|
|||||||
template<typename Scalar> struct scalar_random_op;
|
template<typename Scalar> struct scalar_random_op;
|
||||||
template<typename Scalar> struct scalar_constant_op;
|
template<typename Scalar> struct scalar_constant_op;
|
||||||
template<typename Scalar> struct scalar_identity_op;
|
template<typename Scalar> struct scalar_identity_op;
|
||||||
template<typename Scalar,bool iscpx> struct scalar_sign_op;
|
template<typename Scalar,bool is_complex, bool is_integer> struct scalar_sign_op;
|
||||||
template<typename Scalar,typename ScalarExponent> struct scalar_pow_op;
|
template<typename Scalar,typename ScalarExponent> struct scalar_pow_op;
|
||||||
template<typename LhsScalar,typename RhsScalar=LhsScalar> struct scalar_hypot_op;
|
template<typename LhsScalar,typename RhsScalar=LhsScalar> struct scalar_hypot_op;
|
||||||
template<typename LhsScalar,typename RhsScalar=LhsScalar> struct scalar_product_op;
|
template<typename LhsScalar,typename RhsScalar=LhsScalar> struct scalar_product_op;
|
||||||
|
@ -309,7 +309,7 @@ template<typename ArrayType> void array_real(const ArrayType& m)
|
|||||||
VERIFY_IS_APPROX(m1.cube(), cube(m1));
|
VERIFY_IS_APPROX(m1.cube(), cube(m1));
|
||||||
VERIFY_IS_APPROX(cos(m1+RealScalar(3)*m2), cos((m1+RealScalar(3)*m2).eval()));
|
VERIFY_IS_APPROX(cos(m1+RealScalar(3)*m2), cos((m1+RealScalar(3)*m2).eval()));
|
||||||
VERIFY_IS_APPROX(m1.sign(), sign(m1));
|
VERIFY_IS_APPROX(m1.sign(), sign(m1));
|
||||||
|
VERIFY((m1.sqrt().sign().isNaN() == (Eigen::isnan)(sign(sqrt(m1)))).all());
|
||||||
|
|
||||||
// avoid NaNs with abs() so verification doesn't fail
|
// avoid NaNs with abs() so verification doesn't fail
|
||||||
m3 = m1.abs();
|
m3 = m1.abs();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user