Fix three flaky tests: packetmath, array_cwise, polynomialsolver

libeigen/eigen!2267

Co-authored-by: Rasmus Munk Larsen <rmlarsen@gmail.com>
This commit is contained in:
Rasmus Munk Larsen
2026-03-08 14:59:23 -07:00
parent dd81698aed
commit 8eaa7552fe
3 changed files with 29 additions and 29 deletions

View File

@@ -1006,21 +1006,10 @@ void array_complex(const ArrayType& m) {
std::complex<RealScalar> zero(0.0, 0.0);
VERIFY((Eigen::isnan)(m1 * zero / zero).all());
#if EIGEN_COMP_MSVC
// msvc complex division is not robust
VERIFY((Eigen::isinf)(m4 / RealScalar(0)).all());
#else
#if EIGEN_COMP_CLANG
// clang's complex division is notoriously broken too
if ((numext::isinf)(m4(0, 0) / RealScalar(0))) {
#endif
VERIFY((Eigen::isinf)(m4 / zero).all());
#if EIGEN_COMP_CLANG
} else {
VERIFY((Eigen::isinf)(m4.real() / zero.real()).all());
}
#endif
#endif // MSVC
// Complex division by zero may produce inf or NaN depending on the std::complex
// implementation (algebraic formula gives 0/0=NaN for some components). Only require
// the result to be non-finite.
VERIFY((!(Eigen::isfinite)(m4 / zero)).all());
VERIFY(((Eigen::isfinite)(m1) && (!(Eigen::isfinite)(m1 * zero / zero)) && (!(Eigen::isfinite)(m1 / zero))).all());

View File

@@ -1221,7 +1221,17 @@ std::enable_if_t<Cond, void> run_ieee_cases(const FunctorT& fun) {
const Scalar norm_max = (std::numeric_limits<Scalar>::max)();
const Scalar inf = (std::numeric_limits<Scalar>::infinity)();
const Scalar nan = (std::numeric_limits<Scalar>::quiet_NaN)();
std::vector<Scalar> values{norm_min, Scalar(0), Scalar(1), norm_max, inf, nan};
std::vector<Scalar> values{Scalar(0), Scalar(1), norm_max, inf, nan};
// On ARM, NEON flush-to-zero mode can flush intermediate subnormal results to zero,
// causing functions like sin(norm_min) to return 0 instead of norm_min. Skip norm_min
// in that case, along with truly subnormal values.
if (!SkipDenorms) {
values.push_back(norm_min);
if (std::numeric_limits<Scalar>::has_denorm == std::denorm_present) {
values.push_back(std::numeric_limits<Scalar>::denorm_min());
values.push_back(norm_min / Scalar(2));
}
}
constexpr int size = PacketSize * 2;
EIGEN_ALIGN_MAX Scalar data1[size];
@@ -1231,11 +1241,6 @@ std::enable_if_t<Cond, void> run_ieee_cases(const FunctorT& fun) {
data1[i] = data2[i] = ref[i] = Scalar(0);
}
if (Cond && !SkipDenorms && std::numeric_limits<Scalar>::has_denorm == std::denorm_present) {
values.push_back(std::numeric_limits<Scalar>::denorm_min());
values.push_back(norm_min / Scalar(2));
}
for (Scalar abs_value : values) {
data1[0] = abs_value;
data1[1] = -data1[0];