Fix arm32 float division and related bugs

(cherry picked from commit 81b48065ea)
This commit is contained in:
Charles Schlosser
2023-08-29 00:36:07 +00:00
committed by C. Antonio Sanchez
parent 526a6328e2
commit 72f77ccb3e
3 changed files with 188 additions and 77 deletions

View File

@@ -22,7 +22,7 @@ void pow_test() {
const Scalar sqrt2 = Scalar(std::sqrt(2));
const Scalar inf = Eigen::NumTraits<Scalar>::infinity();
const Scalar nan = Eigen::NumTraits<Scalar>::quiet_NaN();
const Scalar denorm_min = std::numeric_limits<Scalar>::denorm_min();
const Scalar denorm_min = EIGEN_ARCH_ARM ? zero : std::numeric_limits<Scalar>::denorm_min();
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;
@@ -356,7 +356,12 @@ template<typename ArrayType> void array_real(const ArrayType& m)
m3(rows, cols),
m4 = m1;
m4 = (m4.abs()==Scalar(0)).select(Scalar(1),m4);
// avoid denormalized values so verification doesn't fail on platforms that don't support them
// denormalized behavior is tested elsewhere (unary_op_test, binary_ops_test)
const Scalar min = (std::numeric_limits<Scalar>::min)();
m1 = (m1.abs()<min).select(Scalar(0),m1);
m2 = (m2.abs()<min).select(Scalar(0),m2);
m4 = (m4.abs()<min).select(Scalar(1),m4);
Scalar s1 = internal::random<Scalar>();
@@ -396,6 +401,7 @@ template<typename ArrayType> void array_real(const ArrayType& m)
// avoid inf and NaNs so verification doesn't fail
m3 = m4.abs();
VERIFY_IS_APPROX(m3.sqrt(), sqrt(abs(m3)));
VERIFY_IS_APPROX(m3.rsqrt(), Scalar(1)/sqrt(abs(m3)));
VERIFY_IS_APPROX(rsqrt(m3), Scalar(1)/sqrt(abs(m3)));