mirror of
https://gitlab.com/libeigen/eigen.git
synced 2026-04-10 11:34:33 +08:00
Add truncation op
This commit is contained in:
committed by
Rasmus Munk Larsen
parent
d5524fc57b
commit
fb95e90f7f
@@ -40,6 +40,7 @@ template <typename Scalar, std::enable_if_t<!NumTraits<Scalar>::IsInteger, int>
|
||||
std::vector<Scalar> special_values() {
|
||||
const Scalar zero = Scalar(0);
|
||||
const Scalar eps = Eigen::NumTraits<Scalar>::epsilon();
|
||||
const Scalar one_half = Scalar(0.5);
|
||||
const Scalar one = Scalar(1);
|
||||
const Scalar two = Scalar(2);
|
||||
const Scalar three = Scalar(3);
|
||||
@@ -51,7 +52,7 @@ std::vector<Scalar> special_values() {
|
||||
const Scalar min = (std::numeric_limits<Scalar>::min)();
|
||||
const Scalar max = (std::numeric_limits<Scalar>::max)();
|
||||
const Scalar max_exp = (static_cast<Scalar>(int(Eigen::NumTraits<Scalar>::max_exponent())) * Scalar(EIGEN_LN2)) / eps;
|
||||
return {zero, denorm_min, min, eps, sqrt_half, one, sqrt2, two, three, max_exp, max, inf, nan};
|
||||
return {zero, denorm_min, min, eps, sqrt_half, one_half, one, sqrt2, two, three, max_exp, max, inf, nan};
|
||||
}
|
||||
|
||||
template <typename Scalar>
|
||||
@@ -184,6 +185,11 @@ void unary_ops_test() {
|
||||
unary_op_test<Scalar>(UNARY_FUNCTOR_TEST_ARGS(asinh));
|
||||
unary_op_test<Scalar>(UNARY_FUNCTOR_TEST_ARGS(acosh));
|
||||
unary_op_test<Scalar>(UNARY_FUNCTOR_TEST_ARGS(atanh));
|
||||
unary_op_test<Scalar>(UNARY_FUNCTOR_TEST_ARGS(rint));
|
||||
unary_op_test<Scalar>(UNARY_FUNCTOR_TEST_ARGS(floor));
|
||||
unary_op_test<Scalar>(UNARY_FUNCTOR_TEST_ARGS(ceil));
|
||||
unary_op_test<Scalar>(UNARY_FUNCTOR_TEST_ARGS(round));
|
||||
unary_op_test<Scalar>(UNARY_FUNCTOR_TEST_ARGS(trunc));
|
||||
/* FIXME: Enable when the behavior of rsqrt on denormals for half and double is fixed.
|
||||
unary_op_test<Scalar>("rsqrt",
|
||||
[](const auto& x) { return Eigen::rsqrt(x); },
|
||||
@@ -791,6 +797,7 @@ void array_real(const ArrayType& m) {
|
||||
VERIFY_IS_APPROX(m1.rint(), rint(m1));
|
||||
VERIFY_IS_APPROX(m1.floor(), floor(m1));
|
||||
VERIFY_IS_APPROX(m1.ceil(), ceil(m1));
|
||||
VERIFY_IS_APPROX(m1.trunc(), trunc(m1));
|
||||
VERIFY((m1.isNaN() == (Eigen::isnan)(m1)).all());
|
||||
VERIFY((m1.isInf() == (Eigen::isinf)(m1)).all());
|
||||
VERIFY((m1.isFinite() == (Eigen::isfinite)(m1)).all());
|
||||
|
||||
@@ -866,15 +866,16 @@ void packetmath_real() {
|
||||
CHECK_CWISE1_IF(PacketTraits::HasTan, std::tan, internal::ptan);
|
||||
|
||||
CHECK_CWISE1_EXACT_IF(PacketTraits::HasRound, numext::round, internal::pround);
|
||||
CHECK_CWISE1_EXACT_IF(PacketTraits::HasCeil, numext::ceil, internal::pceil);
|
||||
CHECK_CWISE1_EXACT_IF(PacketTraits::HasFloor, numext::floor, internal::pfloor);
|
||||
CHECK_CWISE1_EXACT_IF(PacketTraits::HasRint, numext::rint, internal::print);
|
||||
CHECK_CWISE1_EXACT_IF(PacketTraits::HasRound, numext::ceil, internal::pceil);
|
||||
CHECK_CWISE1_EXACT_IF(PacketTraits::HasRound, numext::floor, internal::pfloor);
|
||||
CHECK_CWISE1_EXACT_IF(PacketTraits::HasRound, numext::rint, internal::print);
|
||||
CHECK_CWISE1_EXACT_IF(PacketTraits::HasRound, numext::trunc, internal::ptrunc);
|
||||
CHECK_CWISE1_IF(PacketTraits::HasSign, numext::sign, internal::psign);
|
||||
|
||||
packetmath_boolean_mask_ops_real<Scalar, Packet>();
|
||||
|
||||
// Rounding edge cases.
|
||||
if (PacketTraits::HasRound || PacketTraits::HasCeil || PacketTraits::HasFloor || PacketTraits::HasRint) {
|
||||
if (PacketTraits::HasRound) {
|
||||
typedef typename internal::make_integer<Scalar>::type IntType;
|
||||
// Start with values that cannot fit inside an integer, work down to less than one.
|
||||
Scalar val =
|
||||
@@ -908,9 +909,10 @@ void packetmath_real() {
|
||||
for (size_t k = 0; k < values.size(); ++k) {
|
||||
data1[0] = values[k];
|
||||
CHECK_CWISE1_EXACT_IF(PacketTraits::HasRound, numext::round, internal::pround);
|
||||
CHECK_CWISE1_EXACT_IF(PacketTraits::HasCeil, numext::ceil, internal::pceil);
|
||||
CHECK_CWISE1_EXACT_IF(PacketTraits::HasFloor, numext::floor, internal::pfloor);
|
||||
CHECK_CWISE1_EXACT_IF(PacketTraits::HasRint, numext::rint, internal::print);
|
||||
CHECK_CWISE1_EXACT_IF(PacketTraits::HasRound, numext::ceil, internal::pceil);
|
||||
CHECK_CWISE1_EXACT_IF(PacketTraits::HasRound, numext::floor, internal::pfloor);
|
||||
CHECK_CWISE1_EXACT_IF(PacketTraits::HasRound, numext::rint, internal::print);
|
||||
CHECK_CWISE1_EXACT_IF(PacketTraits::HasRound, numext::trunc, internal::ptrunc);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user