mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-08-14 04:35:57 +08:00
Fix psign for unsigned integer types, such as bool.
This commit is contained in:
parent
1a09defce7
commit
6aad0f821b
@ -855,7 +855,7 @@ Packet psqrt_complex(const Packet& a) {
|
|||||||
|
|
||||||
/** \internal \returns -1 if a is strictly negative, 0 otherwise, +1 if a is
|
/** \internal \returns -1 if a is strictly negative, 0 otherwise, +1 if a is
|
||||||
strictly positive. */
|
strictly positive. */
|
||||||
template<typename Packet>
|
template<typename Packet>
|
||||||
EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
|
EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
|
||||||
std::enable_if_t<(!NumTraits<typename unpacket_traits<Packet>::type>::IsComplex &&
|
std::enable_if_t<(!NumTraits<typename unpacket_traits<Packet>::type>::IsComplex &&
|
||||||
!NumTraits<typename unpacket_traits<Packet>::type>::IsInteger), Packet>
|
!NumTraits<typename unpacket_traits<Packet>::type>::IsInteger), Packet>
|
||||||
@ -877,6 +877,7 @@ psign(const Packet& a) {
|
|||||||
template<typename Packet>
|
template<typename Packet>
|
||||||
EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
|
EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
|
||||||
std::enable_if_t<(!NumTraits<typename unpacket_traits<Packet>::type>::IsComplex &&
|
std::enable_if_t<(!NumTraits<typename unpacket_traits<Packet>::type>::IsComplex &&
|
||||||
|
NumTraits<typename unpacket_traits<Packet>::type>::IsSigned &&
|
||||||
NumTraits<typename unpacket_traits<Packet>::type>::IsInteger), Packet>
|
NumTraits<typename unpacket_traits<Packet>::type>::IsInteger), Packet>
|
||||||
psign(const Packet& a) {
|
psign(const Packet& a) {
|
||||||
using Scalar = typename unpacket_traits<Packet>::type;
|
using Scalar = typename unpacket_traits<Packet>::type;
|
||||||
@ -892,6 +893,20 @@ psign(const Packet& a) {
|
|||||||
return por(positive, negative);
|
return por(positive, negative);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename Packet>
|
||||||
|
EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
|
||||||
|
std::enable_if_t<(!NumTraits<typename unpacket_traits<Packet>::type>::IsComplex &&
|
||||||
|
!NumTraits<typename unpacket_traits<Packet>::type>::IsSigned &&
|
||||||
|
NumTraits<typename unpacket_traits<Packet>::type>::IsInteger), Packet>
|
||||||
|
psign(const Packet& a) {
|
||||||
|
using Scalar = typename unpacket_traits<Packet>::type;
|
||||||
|
const Packet cst_one = pset1<Packet>(Scalar(1));
|
||||||
|
const Packet cst_zero = pzero(a);
|
||||||
|
|
||||||
|
const Packet zero_mask = pcmp_eq(cst_zero, a);
|
||||||
|
return pandnot(cst_one, zero_mask);
|
||||||
|
}
|
||||||
|
|
||||||
// \internal \returns the the sign of a complex number z, defined as z / abs(z).
|
// \internal \returns the the sign of a complex number z, defined as z / abs(z).
|
||||||
template<typename Packet>
|
template<typename Packet>
|
||||||
EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
|
EIGEN_DEFINE_FUNCTION_ALLOWING_MULTIPLE_DEFINITIONS
|
||||||
|
@ -218,7 +218,6 @@ template<> struct packet_traits<bool> : default_packet_traits
|
|||||||
HasMin = 0,
|
HasMin = 0,
|
||||||
HasMax = 0,
|
HasMax = 0,
|
||||||
HasConj = 0,
|
HasConj = 0,
|
||||||
HasSign = 0,
|
|
||||||
HasSqrt = 1
|
HasSqrt = 1
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user