diff options
-rw-r--r-- | Eigen/src/Core/NumTraits.h | 22 | ||||
-rw-r--r-- | Eigen/src/Core/StableNorm.h | 6 | ||||
-rw-r--r-- | Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h | 14 | ||||
-rw-r--r-- | bench/bench_norm.cpp | 12 | ||||
-rw-r--r-- | test/array_cwise.cpp | 10 | ||||
-rw-r--r-- | test/packetmath.cpp | 64 |
6 files changed, 54 insertions, 74 deletions
diff --git a/Eigen/src/Core/NumTraits.h b/Eigen/src/Core/NumTraits.h index aa7b66f02..609e11402 100644 --- a/Eigen/src/Core/NumTraits.h +++ b/Eigen/src/Core/NumTraits.h @@ -135,18 +135,9 @@ EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Tgt bit_cast(const Src& src) { * \li A dummy_precision() function returning a weak epsilon value. It is mainly used as a default * value by the fuzzy comparison operators. * \li highest() and lowest() functions returning the highest and lowest possible values respectively. - * \li digits() function returning the number of radix digits (non-sign digits for integers, mantissa for floating-point). This is - * the analogue of <a href="http://en.cppreference.com/w/cpp/types/numeric_limits/digits">std::numeric_limits<T>::digits</a> - * which is used as the default implementation if specialized. * \li digits10() function returning the number of decimal digits that can be represented without change. This is * the analogue of <a href="http://en.cppreference.com/w/cpp/types/numeric_limits/digits10">std::numeric_limits<T>::digits10</a> * which is used as the default implementation if specialized. - * \li min_exponent() and max_exponent() functions returning the highest and lowest possible values, respectively, - * such that the radix raised to the power exponent-1 is a normalized floating-point number. These are equivalent to - * <a href="http://en.cppreference.com/w/cpp/types/numeric_limits/min_exponent">std::numeric_limits<T>::min_exponent</a>/ - * <a href="http://en.cppreference.com/w/cpp/types/numeric_limits/max_exponent">std::numeric_limits<T>::max_exponent</a>. - * \li infinity() function returning a representation of positive infinity, if available. - * \li quiet_NaN function returning a non-signaling "not-a-number", if available. */ template<typename T> struct GenericNumTraits @@ -187,18 +178,6 @@ template<typename T> struct GenericNumTraits { return internal::default_digits_impl<T>::run(); } - - EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR - static inline int min_exponent() - { - return numext::numeric_limits<T>::min_exponent; - } - - EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR - static inline int max_exponent() - { - return numext::numeric_limits<T>::max_exponent; - } EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static inline Real dummy_precision() @@ -207,6 +186,7 @@ template<typename T> struct GenericNumTraits return Real(0); } + EIGEN_DEVICE_FUNC EIGEN_CONSTEXPR static inline T highest() { return (numext::numeric_limits<T>::max)(); diff --git a/Eigen/src/Core/StableNorm.h b/Eigen/src/Core/StableNorm.h index 4a3f0cca8..04fe0b371 100644 --- a/Eigen/src/Core/StableNorm.h +++ b/Eigen/src/Core/StableNorm.h @@ -134,9 +134,9 @@ blueNorm_impl(const EigenBase<Derived>& _vec) // statements can be replaced static const int ibeta = std::numeric_limits<RealScalar>::radix; // base for floating-point numbers static const int it = NumTraits<RealScalar>::digits(); // number of base-beta digits in mantissa - static const int iemin = NumTraits<RealScalar>::min_exponent(); // minimum exponent - static const int iemax = NumTraits<RealScalar>::max_exponent(); // maximum exponent - static const RealScalar rbig = NumTraits<RealScalar>::highest(); // largest floating-point number + static const int iemin = std::numeric_limits<RealScalar>::min_exponent; // minimum exponent + static const int iemax = std::numeric_limits<RealScalar>::max_exponent; // maximum exponent + static const RealScalar rbig = (std::numeric_limits<RealScalar>::max)(); // largest floating-point number static const RealScalar b1 = RealScalar(pow(RealScalar(ibeta),RealScalar(-((1-iemin)/2)))); // lower boundary of midrange static const RealScalar b2 = RealScalar(pow(RealScalar(ibeta),RealScalar((iemax + 1 - it)/2))); // upper boundary of midrange static const RealScalar s1m = RealScalar(pow(RealScalar(ibeta),RealScalar((2-iemin)/2))); // scaling factor for lower range diff --git a/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h b/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h index 75de2d28f..411640ee8 100644 --- a/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h +++ b/Eigen/src/Core/arch/Default/GenericPacketMathFunctions.h @@ -36,7 +36,7 @@ template<typename Packet> EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC Packet pfrexp_generic_get_biased_exponent(const Packet& a) { typedef typename unpacket_traits<Packet>::type Scalar; typedef typename unpacket_traits<Packet>::integer_packet PacketI; - enum { mantissa_bits = NumTraits<Scalar>::digits() - 1}; + enum { mantissa_bits = numext::numeric_limits<Scalar>::digits - 1}; return pcast<PacketI, Packet>(plogical_shift_right<mantissa_bits>(preinterpret<PacketI>(pabs(a)))); } @@ -48,7 +48,7 @@ Packet pfrexp_generic(const Packet& a, Packet& exponent) { typedef typename make_unsigned<typename make_integer<Scalar>::type>::type ScalarUI; enum { TotalBits = sizeof(Scalar) * CHAR_BIT, - MantissaBits = NumTraits<Scalar>::digits() - 1, + MantissaBits = numext::numeric_limits<Scalar>::digits - 1, ExponentBits = int(TotalBits) - int(MantissaBits) - 1 }; @@ -116,7 +116,7 @@ Packet pldexp_generic(const Packet& a, const Packet& exponent) { typedef typename unpacket_traits<PacketI>::type ScalarI; enum { TotalBits = sizeof(Scalar) * CHAR_BIT, - MantissaBits = NumTraits<Scalar>::digits() - 1, + MantissaBits = numext::numeric_limits<Scalar>::digits - 1, ExponentBits = int(TotalBits) - int(MantissaBits) - 1 }; @@ -135,7 +135,7 @@ Packet pldexp_generic(const Packet& a, const Packet& exponent) { // Explicitly multiplies // a * (2^e) // clamping e to the range -// [NumTraits<Scalar>::min_exponent()-2, NumTraits<Scalar>::max_exponent()] +// [numeric_limits<Scalar>::min_exponent-2, numeric_limits<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. @@ -148,7 +148,7 @@ struct pldexp_fast_impl { typedef typename unpacket_traits<PacketI>::type ScalarI; enum { TotalBits = sizeof(Scalar) * CHAR_BIT, - MantissaBits = NumTraits<Scalar>::digits() - 1, + MantissaBits = numext::numeric_limits<Scalar>::digits - 1, ExponentBits = int(TotalBits) - int(MantissaBits) - 1 }; @@ -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 = - (NumTraits<Scalar>::max_exponent() * Scalar(EIGEN_LN2)) / - NumTraits<Scalar>::epsilon(); + (std::numeric_limits<Scalar>::max_exponent * Scalar(EIGEN_LN2)) / + std::numeric_limits<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. diff --git a/bench/bench_norm.cpp b/bench/bench_norm.cpp index 592f25d66..a86153945 100644 --- a/bench/bench_norm.cpp +++ b/bench/bench_norm.cpp @@ -111,12 +111,12 @@ EIGEN_DONT_INLINE typename T::Scalar pblueNorm(const T& v) int nbig, ibeta, it, iemin, iemax, iexp; Scalar abig, eps; - nbig = NumTraits<int>::highest(); // largest integer - ibeta = std::numeric_limits<Scalar>::radix; // NumTraits<Scalar>::Base; // base for floating-point numbers - it = NumTraits<Scalar>::digits(); // NumTraits<Scalar>::Mantissa; // number of base-beta digits in mantissa - iemin = NumTraits<Scalar>::min_exponent(); // minimum exponent - iemax = NumTraits<Scalar>::max_exponent(); // maximum exponent - rbig = NumTraits<Scalar>::highest(); // largest floating-point number + nbig = std::numeric_limits<int>::max(); // largest integer + ibeta = std::numeric_limits<Scalar>::radix; //NumTraits<Scalar>::Base; // base for floating-point numbers + it = std::numeric_limits<Scalar>::digits; //NumTraits<Scalar>::Mantissa; // number of base-beta digits in mantissa + iemin = std::numeric_limits<Scalar>::min_exponent; // minimum exponent + iemax = std::numeric_limits<Scalar>::max_exponent; // maximum exponent + rbig = std::numeric_limits<Scalar>::max(); // largest floating-point number // Check the basic machine-dependent constants. if(iemin > 1 - 2*it || 1+it>iemax || (it==2 && ibeta<5) diff --git a/test/array_cwise.cpp b/test/array_cwise.cpp index 1bc8e19f9..6a88e0e27 100644 --- a/test/array_cwise.cpp +++ b/test/array_cwise.cpp @@ -14,18 +14,18 @@ template<typename Scalar> void pow_test() { const Scalar zero = Scalar(0); - const Scalar eps = Eigen::NumTraits<Scalar>::epsilon(); + const Scalar eps = std::numeric_limits<Scalar>::epsilon(); const Scalar one = Scalar(1); const Scalar two = Scalar(2); const Scalar three = Scalar(3); const Scalar sqrt_half = Scalar(std::sqrt(0.5)); const Scalar sqrt2 = Scalar(std::sqrt(2)); - const Scalar inf = Eigen::NumTraits<Scalar>::infinity(); - const Scalar nan = Eigen::NumTraits<Scalar>::quiet_NaN(); + const Scalar inf = std::numeric_limits<Scalar>::infinity(); + const Scalar nan = std::numeric_limits<Scalar>::quiet_NaN(); const Scalar denorm_min = 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; + const Scalar max_exp = (static_cast<Scalar>(int(std::numeric_limits<Scalar>::max_exponent)) * Scalar(EIGEN_LN2)) / eps; const static Scalar abs_vals[] = {zero, denorm_min, @@ -613,7 +613,7 @@ template<typename ArrayType> void min_max(const ArrayType& m) // min/max with various NaN propagation options. if (m1.size() > 1 && !NumTraits<Scalar>::IsInteger) { - m1(0,0) = NumTraits<Scalar>::quiet_NaN(); + m1(0,0) = std::numeric_limits<Scalar>::quiet_NaN(); maxM1 = m1.template maxCoeff<PropagateNaN>(); minM1 = m1.template minCoeff<PropagateNaN>(); VERIFY((numext::isnan)(maxM1)); diff --git a/test/packetmath.cpp b/test/packetmath.cpp index 67d329a67..f5cce6436 100644 --- a/test/packetmath.cpp +++ b/test/packetmath.cpp @@ -273,7 +273,7 @@ void packetmath_boolean_mask_ops() { //Test NaN for (int i = 0; i < PacketSize; ++i) { - data1[i] = NumTraits<Scalar>::quiet_NaN(); + data1[i] = std::numeric_limits<Scalar>::quiet_NaN(); data1[i + PacketSize] = internal::random<bool>() ? data1[i] : Scalar(0); } CHECK_CWISE2_IF(true, internal::pcmp_eq, internal::pcmp_eq); @@ -634,7 +634,7 @@ void packetmath_real() { if (PacketTraits::HasExp) { // Check denormals: for (int j=0; j<3; ++j) { - data1[0] = Scalar(std::ldexp(1, NumTraits<Scalar>::min_exponent()-j)); + data1[0] = Scalar(std::ldexp(1, std::numeric_limits<Scalar>::min_exponent-j)); CHECK_CWISE1_BYREF1_IF(PacketTraits::HasExp, REF_FREXP, internal::pfrexp); data1[0] = -data1[0]; CHECK_CWISE1_BYREF1_IF(PacketTraits::HasExp, REF_FREXP, internal::pfrexp); @@ -671,10 +671,10 @@ void packetmath_real() { if (PacketTraits::HasExp) { data1[0] = Scalar(-1); // underflow to zero - data1[PacketSize] = Scalar(NumTraits<Scalar>::min_exponent()-55); + data1[PacketSize] = Scalar(std::numeric_limits<Scalar>::min_exponent-55); CHECK_CWISE2_IF(PacketTraits::HasExp, REF_LDEXP, internal::pldexp); // overflow to inf - data1[PacketSize] = Scalar(NumTraits<Scalar>::max_exponent()+10); + data1[PacketSize] = Scalar(std::numeric_limits<Scalar>::max_exponent+10); CHECK_CWISE2_IF(PacketTraits::HasExp, REF_LDEXP, internal::pldexp); // NaN stays NaN data1[0] = NumTraits<Scalar>::quiet_NaN(); @@ -682,21 +682,21 @@ void packetmath_real() { VERIFY((numext::isnan)(data2[0])); // inf stays inf data1[0] = NumTraits<Scalar>::infinity(); - data1[PacketSize] = Scalar(NumTraits<Scalar>::min_exponent()-10); + data1[PacketSize] = Scalar(std::numeric_limits<Scalar>::min_exponent-10); CHECK_CWISE2_IF(PacketTraits::HasExp, REF_LDEXP, internal::pldexp); // zero stays zero data1[0] = Scalar(0); - data1[PacketSize] = Scalar(NumTraits<Scalar>::max_exponent()+10); + data1[PacketSize] = Scalar(std::numeric_limits<Scalar>::max_exponent+10); CHECK_CWISE2_IF(PacketTraits::HasExp, REF_LDEXP, internal::pldexp); // Small number big exponent. - data1[0] = Scalar(std::ldexp(Scalar(1.0), NumTraits<Scalar>::min_exponent()-1)); - data1[PacketSize] = Scalar(-NumTraits<Scalar>::min_exponent() - +NumTraits<Scalar>::max_exponent()); + data1[0] = Scalar(std::ldexp(Scalar(1.0), std::numeric_limits<Scalar>::min_exponent-1)); + data1[PacketSize] = Scalar(-std::numeric_limits<Scalar>::min_exponent + +std::numeric_limits<Scalar>::max_exponent); CHECK_CWISE2_IF(PacketTraits::HasExp, REF_LDEXP, internal::pldexp); // Big number small exponent. - data1[0] = Scalar(std::ldexp(Scalar(1.0), NumTraits<Scalar>::max_exponent()-1)); - data1[PacketSize] = Scalar(+NumTraits<Scalar>::min_exponent() - -NumTraits<Scalar>::max_exponent()); + data1[0] = Scalar(std::ldexp(Scalar(1.0), std::numeric_limits<Scalar>::max_exponent-1)); + data1[PacketSize] = Scalar(+std::numeric_limits<Scalar>::min_exponent + -std::numeric_limits<Scalar>::max_exponent); CHECK_CWISE2_IF(PacketTraits::HasExp, REF_LDEXP, internal::pldexp); } @@ -707,8 +707,8 @@ void packetmath_real() { data1[0] = Scalar(1e-20); CHECK_CWISE1_IF(PacketTraits::HasTanh, std::tanh, internal::ptanh); if (PacketTraits::HasExp && PacketSize >= 2) { - const Scalar small = NumTraits<Scalar>::epsilon(); - data1[0] = NumTraits<Scalar>::quiet_NaN(); + const Scalar small = std::numeric_limits<Scalar>::epsilon(); + data1[0] = std::numeric_limits<Scalar>::quiet_NaN(); data1[1] = small; test::packet_helper<PacketTraits::HasExp, Packet> h; h.store(data2, internal::pexp(h.load(data1))); @@ -742,7 +742,7 @@ void packetmath_real() { if (PacketTraits::HasTanh) { // NOTE this test migh fail with GCC prior to 6.3, see MathFunctionsImpl.h for details. - data1[0] = NumTraits<Scalar>::quiet_NaN(); + data1[0] = std::numeric_limits<Scalar>::quiet_NaN(); test::packet_helper<internal::packet_traits<Scalar>::HasTanh, Packet> h; h.store(data2, internal::ptanh(h.load(data1))); VERIFY((numext::isnan)(data2[0])); @@ -762,17 +762,17 @@ void packetmath_real() { } #if EIGEN_HAS_C99_MATH && (EIGEN_COMP_CXXVER >= 11) - data1[0] = NumTraits<Scalar>::infinity(); + data1[0] = std::numeric_limits<Scalar>::infinity(); data1[1] = Scalar(-1); CHECK_CWISE1_IF(PacketTraits::HasLog1p, std::log1p, internal::plog1p); - data1[0] = NumTraits<Scalar>::infinity(); - data1[1] = -NumTraits<Scalar>::infinity(); + data1[0] = std::numeric_limits<Scalar>::infinity(); + data1[1] = -std::numeric_limits<Scalar>::infinity(); CHECK_CWISE1_IF(PacketTraits::HasExpm1, std::expm1, internal::pexpm1); #endif if (PacketSize >= 2) { - data1[0] = NumTraits<Scalar>::quiet_NaN(); - data1[1] = NumTraits<Scalar>::epsilon(); + data1[0] = std::numeric_limits<Scalar>::quiet_NaN(); + data1[1] = std::numeric_limits<Scalar>::epsilon(); if (PacketTraits::HasLog) { test::packet_helper<PacketTraits::HasLog, Packet> h; h.store(data2, internal::plog(h.load(data1))); @@ -782,7 +782,7 @@ void packetmath_real() { VERIFY_IS_APPROX(std::log(data1[1]), data2[1]); } - data1[0] = -NumTraits<Scalar>::epsilon(); + data1[0] = -std::numeric_limits<Scalar>::epsilon(); data1[1] = Scalar(0); h.store(data2, internal::plog(h.load(data1))); VERIFY((numext::isnan)(data2[0])); @@ -813,14 +813,14 @@ void packetmath_real() { h.store(data2, internal::plog(h.load(data1))); VERIFY((numext::isnan)(data2[0])); - data1[0] = NumTraits<Scalar>::infinity(); + data1[0] = std::numeric_limits<Scalar>::infinity(); h.store(data2, internal::plog(h.load(data1))); VERIFY((numext::isinf)(data2[0])); } if (PacketTraits::HasLog1p) { test::packet_helper<PacketTraits::HasLog1p, Packet> h; data1[0] = Scalar(-2); - data1[1] = -NumTraits<Scalar>::infinity(); + data1[1] = -std::numeric_limits<Scalar>::infinity(); h.store(data2, internal::plog1p(h.load(data1))); VERIFY((numext::isnan)(data2[0])); VERIFY((numext::isnan)(data2[1])); @@ -831,7 +831,7 @@ void packetmath_real() { if (std::numeric_limits<Scalar>::has_denorm == std::denorm_present) { data1[1] = -std::numeric_limits<Scalar>::denorm_min(); } else { - data1[1] = -NumTraits<Scalar>::epsilon(); + data1[1] = -std::numeric_limits<Scalar>::epsilon(); } h.store(data2, internal::psqrt(h.load(data1))); VERIFY((numext::isnan)(data2[0])); @@ -842,7 +842,7 @@ void packetmath_real() { && !internal::is_same<Scalar, half>::value && !internal::is_same<Scalar, bfloat16>::value) { test::packet_helper<PacketTraits::HasCos, Packet> h; - for (Scalar k = Scalar(1); k < Scalar(10000) / NumTraits<Scalar>::epsilon(); k *= Scalar(2)) { + for (Scalar k = Scalar(1); k < Scalar(10000) / std::numeric_limits<Scalar>::epsilon(); k *= Scalar(2)) { for (int k1 = 0; k1 <= 1; ++k1) { data1[0] = Scalar((2 * double(k) + k1) * double(EIGEN_PI) / 2 * internal::random<double>(0.8, 1.2)); data1[1] = Scalar((2 * double(k) + 2 + k1) * double(EIGEN_PI) / 2 * internal::random<double>(0.8, 1.2)); @@ -863,8 +863,8 @@ void packetmath_real() { } } - data1[0] = NumTraits<Scalar>::infinity(); - data1[1] = -NumTraits<Scalar>::infinity(); + data1[0] = std::numeric_limits<Scalar>::infinity(); + data1[1] = -std::numeric_limits<Scalar>::infinity(); h.store(data2, internal::psin(h.load(data1))); VERIFY((numext::isnan)(data2[0])); VERIFY((numext::isnan)(data2[1])); @@ -873,7 +873,7 @@ void packetmath_real() { VERIFY((numext::isnan)(data2[0])); VERIFY((numext::isnan)(data2[1])); - data1[0] = NumTraits<Scalar>::quiet_NaN(); + data1[0] = std::numeric_limits<Scalar>::quiet_NaN(); h.store(data2, internal::psin(h.load(data1))); VERIFY((numext::isnan)(data2[0])); h.store(data2, internal::pcos(h.load(data1))); @@ -997,13 +997,13 @@ void packetmath_notcomplex() { VERIFY(internal::isApprox(ref[0], internal::predux_max<PropagateNaN>(internal::pload<Packet>(data1))) && "internal::predux_max<PropagateNumbers>"); // A single NaN. const size_t index = std::numeric_limits<size_t>::quiet_NaN() % PacketSize; - data1[index] = NumTraits<Scalar>::quiet_NaN(); + data1[index] = std::numeric_limits<Scalar>::quiet_NaN(); VERIFY(PacketSize==1 || !(numext::isnan)(internal::predux_min<PropagateNumbers>(internal::pload<Packet>(data1)))); VERIFY((numext::isnan)(internal::predux_min<PropagateNaN>(internal::pload<Packet>(data1)))); VERIFY(PacketSize==1 || !(numext::isnan)(internal::predux_max<PropagateNumbers>(internal::pload<Packet>(data1)))); VERIFY((numext::isnan)(internal::predux_max<PropagateNaN>(internal::pload<Packet>(data1)))); // All NaNs. - for (int i = 0; i < 4 * PacketSize; ++i) data1[i] = NumTraits<Scalar>::quiet_NaN(); + for (int i = 0; i < 4 * PacketSize; ++i) data1[i] = std::numeric_limits<Scalar>::quiet_NaN(); VERIFY((numext::isnan)(internal::predux_min<PropagateNumbers>(internal::pload<Packet>(data1)))); VERIFY((numext::isnan)(internal::predux_min<PropagateNaN>(internal::pload<Packet>(data1)))); VERIFY((numext::isnan)(internal::predux_max<PropagateNumbers>(internal::pload<Packet>(data1)))); @@ -1011,8 +1011,8 @@ void packetmath_notcomplex() { // Test NaN propagation for coefficient-wise min and max. for (int i = 0; i < PacketSize; ++i) { - data1[i] = internal::random<bool>() ? NumTraits<Scalar>::quiet_NaN() : Scalar(0); - data1[i + PacketSize] = internal::random<bool>() ? NumTraits<Scalar>::quiet_NaN() : Scalar(0); + data1[i] = internal::random<bool>() ? std::numeric_limits<Scalar>::quiet_NaN() : Scalar(0); + data1[i + PacketSize] = internal::random<bool>() ? std::numeric_limits<Scalar>::quiet_NaN() : Scalar(0); } // Note: NaN propagation is implementation defined for pmin/pmax, so we do not test it here. CHECK_CWISE2_IF(PacketTraits::HasMin, propagate_number_min, (internal::pmin<PropagateNumbers>)); |