Augment NumTraits with min/max_exponent() again.

Replace usage of `std::numeric_limits<...>::min/max_exponent` in
codebase where possible.  Also replaced some other `numeric_limits`
usages in affected tests with the `NumTraits` equivalent.

The previous MR !443 failed for c++03 due to lack of `constexpr`.
Because of this, we need to keep around the `std::numeric_limits`
version in enum expressions until the switch to c++11.

Fixes #2148
This commit is contained in:
Antonio Sanchez
2021-03-16 20:12:46 -07:00
parent eb71e5db98
commit 8dfe1029a5
6 changed files with 70 additions and 50 deletions

View File

@@ -135,7 +135,7 @@ Packet pldexp_generic(const Packet& a, const Packet& exponent) {
// Explicitly multiplies
// a * (2^e)
// clamping e to the range
// [numeric_limits<Scalar>::min_exponent-2, numeric_limits<Scalar>::max_exponent]
// [NumTraits<Scalar>::min_exponent()-2, NumTraits<Scalar>::max_exponent()]
//
// This is approx 7x faster than pldexp_impl, but will prematurely over/underflow
// if 2^e doesn't fit into a normal floating-point Scalar.
@@ -1480,8 +1480,8 @@ Packet generic_pow(const Packet& x, const Packet& y) {
const Packet y_is_nan = pandnot(ptrue(y), pcmp_eq(y, y));
const Packet abs_y_is_inf = pcmp_eq(pabs(y), cst_pos_inf);
EIGEN_CONSTEXPR Scalar huge_exponent =
(std::numeric_limits<Scalar>::max_exponent * Scalar(EIGEN_LN2)) /
std::numeric_limits<Scalar>::epsilon();
(NumTraits<Scalar>::max_exponent() * Scalar(EIGEN_LN2)) /
NumTraits<Scalar>::epsilon();
const Packet abs_y_is_huge = pcmp_le(pset1<Packet>(huge_exponent), pabs(y));
// Predicates for whether y is integer and/or even.