From 93635cafee3865aca4f0319bb9ea98561f18e2b4 Mon Sep 17 00:00:00 2001 From: ITimer Date: Mon, 10 Aug 2015 15:11:10 +0800 Subject: [PATCH 1/5] Fixed a spelling error --- doc/TopicMultithreading.dox | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/TopicMultithreading.dox b/doc/TopicMultithreading.dox index 66028d7a8..95f6bf287 100644 --- a/doc/TopicMultithreading.dox +++ b/doc/TopicMultithreading.dox @@ -8,7 +8,7 @@ Some Eigen's algorithms can exploit the multiple cores present in your hardware. * GCC: \c -fopenmp * ICC: \c -openmp * MSVC: check the respective option in the build properties. -You can control the number of thread that will be used using either the OpenMP API or Eiegn's API using the following priority: +You can control the number of thread that will be used using either the OpenMP API or Eigen's API using the following priority: \code OMP_NUM_THREADS=n ./my_program omp_set_num_threads(n); From a5d1bb2be8340e446d6f8ce24e0b1a8987e9be95 Mon Sep 17 00:00:00 2001 From: Christoph Hertzberg Date: Fri, 14 Aug 2015 15:30:59 +0200 Subject: [PATCH 2/5] bug #1054: Use set(EIGEN_CXX_FLAG_VERSION "/version") only for Intel compilers on Windows. Also removed code calling `head -n1` and always use integrated REGEX functionality. --- cmake/EigenTesting.cmake | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/cmake/EigenTesting.cmake b/cmake/EigenTesting.cmake index 0774b5d81..5022397a7 100644 --- a/cmake/EigenTesting.cmake +++ b/cmake/EigenTesting.cmake @@ -367,23 +367,15 @@ macro(ei_get_compilerver VAR) # on all other system we rely on ${CMAKE_CXX_COMPILER} # supporting a "--version" or "/version" flag - if(WIN32 AND NOT CYGWIN AND NOT MINGW) + if(WIN32 AND ${CMAKE_CXX_COMPILER_ID} EQUAL "Intel") set(EIGEN_CXX_FLAG_VERSION "/version") else() set(EIGEN_CXX_FLAG_VERSION "--version") endif() - # check whether the head command exists - find_program(HEAD_EXE head NO_CMAKE_ENVIRONMENT_PATH NO_CMAKE_PATH NO_CMAKE_SYSTEM_PATH) - if(HEAD_EXE) - execute_process(COMMAND ${CMAKE_CXX_COMPILER} ${EIGEN_CXX_FLAG_VERSION} - COMMAND head -n 1 - OUTPUT_VARIABLE eigen_cxx_compiler_version_string OUTPUT_STRIP_TRAILING_WHITESPACE) - else() - execute_process(COMMAND ${CMAKE_CXX_COMPILER} ${EIGEN_CXX_FLAG_VERSION} - OUTPUT_VARIABLE eigen_cxx_compiler_version_string OUTPUT_STRIP_TRAILING_WHITESPACE) - string(REGEX REPLACE "[\n\r].*" "" eigen_cxx_compiler_version_string ${eigen_cxx_compiler_version_string}) - endif() + execute_process(COMMAND ${CMAKE_CXX_COMPILER} ${EIGEN_CXX_FLAG_VERSION} + OUTPUT_VARIABLE eigen_cxx_compiler_version_string OUTPUT_STRIP_TRAILING_WHITESPACE) + string(REGEX REPLACE "[\n\r].*" "" eigen_cxx_compiler_version_string ${eigen_cxx_compiler_version_string}) ei_get_compilerver_from_cxx_version_string("${eigen_cxx_compiler_version_string}" CNAME CVER) set(${VAR} "${CNAME}-${CVER}") From 712e2fed1705746847d1cbdce01094eb42a45139 Mon Sep 17 00:00:00 2001 From: Christoph Hertzberg Date: Fri, 14 Aug 2015 16:09:48 +0200 Subject: [PATCH 3/5] bug #829: Introduce macro EIGEN_HAS_CXX11_CONTAINERS and do not specialize std-containers if it is enabled. --- Eigen/src/Core/util/Macros.h | 9 +++++++++ Eigen/src/StlSupport/StdDeque.h | 2 +- Eigen/src/StlSupport/StdList.h | 4 ++-- Eigen/src/StlSupport/StdVector.h | 5 +++++ 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/Eigen/src/Core/util/Macros.h b/Eigen/src/Core/util/Macros.h index e491d3389..b792f5ed4 100644 --- a/Eigen/src/Core/util/Macros.h +++ b/Eigen/src/Core/util/Macros.h @@ -370,6 +370,15 @@ #endif #endif +// Does the compiler support proper C++11 containers? +#ifndef EIGEN_HAS_CXX11_CONTAINERS + #if ((__cplusplus >= 201103L) && (EIGEN_COMP_GNUC_STRICT || EIGEN_COMP_CLANG)) || EIGEN_COMP_MSVC >= 1900 + #define EIGEN_HAS_CXX11_CONTAINERS 1 + #else + #define EIGEN_HAS_CXX11_CONTAINERS 0 + #endif +#endif + /** Allows to disable some optimizations which might affect the accuracy of the result. * Such optimization are enabled by default, and set EIGEN_FAST_MATH to 0 to disable them. * They currently include: diff --git a/Eigen/src/StlSupport/StdDeque.h b/Eigen/src/StlSupport/StdDeque.h index 909600476..25930cb85 100644 --- a/Eigen/src/StlSupport/StdDeque.h +++ b/Eigen/src/StlSupport/StdDeque.h @@ -53,7 +53,7 @@ namespace std \ } // check whether we really need the std::deque specialization -#if !(defined(_GLIBCXX_DEQUE) && (!EIGEN_GNUC_AT_LEAST(4,1))) /* Note that before gcc-4.1 we already have: std::deque::resize(size_type,const T&). */ +#if !EIGEN_HAS_CXX11_CONTAINERS && !(defined(_GLIBCXX_DEQUE) && (!EIGEN_GNUC_AT_LEAST(4,1))) /* Note that before gcc-4.1 we already have: std::deque::resize(size_type,const T&). */ namespace std { diff --git a/Eigen/src/StlSupport/StdList.h b/Eigen/src/StlSupport/StdList.h index 265b46f8e..7412b50aa 100644 --- a/Eigen/src/StlSupport/StdList.h +++ b/Eigen/src/StlSupport/StdList.h @@ -51,8 +51,8 @@ namespace std \ }; \ } -// check whether we really need the std::vector specialization -#if !(defined(_GLIBCXX_VECTOR) && (!EIGEN_GNUC_AT_LEAST(4,1))) /* Note that before gcc-4.1 we already have: std::list::resize(size_type,const T&). */ +// check whether we really need the std::list specialization +#if !EIGEN_HAS_CXX11_CONTAINERS && !(defined(_GLIBCXX_LIST) && (!EIGEN_GNUC_AT_LEAST(4,1))) /* Note that before gcc-4.1 we already have: std::list::resize(size_type,const T&). */ namespace std { diff --git a/Eigen/src/StlSupport/StdVector.h b/Eigen/src/StlSupport/StdVector.h index 611664a2e..ec22821d2 100644 --- a/Eigen/src/StlSupport/StdVector.h +++ b/Eigen/src/StlSupport/StdVector.h @@ -44,6 +44,9 @@ namespace std \ }; \ } +// Don't specialize if containers are implemented according to C++11 +#if !EIGEN_HAS_CXX11_CONTAINERS + namespace std { #define EIGEN_STD_VECTOR_SPECIALIZATION_BODY \ @@ -122,5 +125,7 @@ namespace std { #endif }; } +#endif // !EIGEN_HAS_CXX11_CONTAINERS + #endif // EIGEN_STDVECTOR_H From 61e0977e10f49d43e76b1de0f9433379fa985d96 Mon Sep 17 00:00:00 2001 From: Christoph Hertzberg Date: Fri, 14 Aug 2015 17:32:34 +0200 Subject: [PATCH 4/5] Protect all calls to isnan, isinf and isfinite with parentheses. --- Eigen/src/Core/GlobalFunctions.h | 2 +- Eigen/src/Core/MathFunctions.h | 12 +++++------ Eigen/src/Core/functors/UnaryFunctors.h | 6 +++--- test/array.cpp | 28 ++++++++++++------------- test/main.h | 3 +++ 5 files changed, 27 insertions(+), 24 deletions(-) diff --git a/Eigen/src/Core/GlobalFunctions.h b/Eigen/src/Core/GlobalFunctions.h index 90d6b6e28..aaa076701 100644 --- a/Eigen/src/Core/GlobalFunctions.h +++ b/Eigen/src/Core/GlobalFunctions.h @@ -14,7 +14,7 @@ #define EIGEN_ARRAY_DECLARE_GLOBAL_UNARY(NAME,FUNCTOR) \ template \ inline const Eigen::CwiseUnaryOp, const Derived> \ - NAME(const Eigen::ArrayBase& x) { \ + (NAME)(const Eigen::ArrayBase& x) { \ return Eigen::CwiseUnaryOp, const Derived>(x.derived()); \ } diff --git a/Eigen/src/Core/MathFunctions.h b/Eigen/src/Core/MathFunctions.h index f2d5b4879..6aa062198 100644 --- a/Eigen/src/Core/MathFunctions.h +++ b/Eigen/src/Core/MathFunctions.h @@ -788,7 +788,7 @@ bool (isfinite)(const T& x) { #if EIGEN_HAS_CXX11_MATH using std::isfinite; - return isfinite(x); + return isfinite EIGEN_NOT_A_MACRO (x); #else return x::highest() && x>NumTraits::lowest(); #endif @@ -800,7 +800,7 @@ bool (isnan)(const T& x) { #if EIGEN_HAS_CXX11_MATH using std::isnan; - return isnan(x); + return isnan EIGEN_NOT_A_MACRO (x); #else return x != x; #endif @@ -812,7 +812,7 @@ bool (isinf)(const T& x) { #if EIGEN_HAS_CXX11_MATH using std::isinf; - return isinf(x); + return isinf EIGEN_NOT_A_MACRO (x); #else return x>NumTraits::highest() || x::lowest(); #endif @@ -821,19 +821,19 @@ bool (isinf)(const T& x) template bool (isfinite)(const std::complex& x) { - return numext::isfinite(numext::real(x)) && numext::isfinite(numext::imag(x)); + return (numext::isfinite)(numext::real(x)) && (numext::isfinite)(numext::imag(x)); } template bool (isnan)(const std::complex& x) { - return numext::isnan(numext::real(x)) || numext::isnan(numext::imag(x)); + return (numext::isnan)(numext::real(x)) || (numext::isnan)(numext::imag(x)); } template bool (isinf)(const std::complex& x) { - return (numext::isinf(numext::real(x)) || numext::isinf(numext::imag(x))) && (!numext::isnan(x)); + return ((numext::isinf)(numext::real(x)) || (numext::isinf)(numext::imag(x))) && (!(numext::isnan)(x)); } template diff --git a/Eigen/src/Core/functors/UnaryFunctors.h b/Eigen/src/Core/functors/UnaryFunctors.h index 9b4f49c3c..260e8f834 100644 --- a/Eigen/src/Core/functors/UnaryFunctors.h +++ b/Eigen/src/Core/functors/UnaryFunctors.h @@ -591,7 +591,7 @@ struct functor_traits > template struct scalar_isnan_op { EIGEN_EMPTY_STRUCT_CTOR(scalar_isnan_op) typedef bool result_type; - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const { return numext::isnan(a); } + EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const { return (numext::isnan)(a); } }; template struct functor_traits > @@ -609,7 +609,7 @@ struct functor_traits > template struct scalar_isinf_op { EIGEN_EMPTY_STRUCT_CTOR(scalar_isinf_op) typedef bool result_type; - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const { return numext::isinf(a); } + EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const { return (numext::isinf)(a); } }; template struct functor_traits > @@ -627,7 +627,7 @@ struct functor_traits > template struct scalar_isfinite_op { EIGEN_EMPTY_STRUCT_CTOR(scalar_isfinite_op) typedef bool result_type; - EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const { return numext::isfinite(a); } + EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE result_type operator() (const Scalar& a) const { return (numext::isfinite)(a); } }; template struct functor_traits > diff --git a/test/array.cpp b/test/array.cpp index 3d00d1d2d..9f61c4b26 100644 --- a/test/array.cpp +++ b/test/array.cpp @@ -221,9 +221,9 @@ template void array_real(const ArrayType& m) VERIFY_IS_APPROX(m1.round(), round(m1)); VERIFY_IS_APPROX(m1.floor(), floor(m1)); VERIFY_IS_APPROX(m1.ceil(), ceil(m1)); - VERIFY((m1.isNaN() == Eigen::isnan(m1)).all()); - VERIFY((m1.isInf() == Eigen::isinf(m1)).all()); - VERIFY((m1.isFinite() == Eigen::isfinite(m1)).all()); + VERIFY((m1.isNaN() == (Eigen::isnan)(m1)).all()); + VERIFY((m1.isInf() == (Eigen::isinf)(m1)).all()); + VERIFY((m1.isFinite() == (Eigen::isfinite)(m1)).all()); VERIFY_IS_APPROX(m1.inverse(), inverse(m1)); VERIFY_IS_APPROX(m1.abs(), abs(m1)); VERIFY_IS_APPROX(m1.abs2(), abs2(m1)); @@ -249,9 +249,9 @@ template void array_real(const ArrayType& m) VERIFY_IS_APPROX(tanh(m1), (0.5*(exp(m1)-exp(-m1)))/(0.5*(exp(m1)+exp(-m1)))); VERIFY_IS_APPROX(arg(m1), ((ArrayType)(m1<0))*std::acos(-1.0)); VERIFY((round(m1) <= ceil(m1) && round(m1) >= floor(m1)).all()); - VERIFY(Eigen::isnan((m1*0.0)/0.0).all()); - VERIFY(Eigen::isinf(m4/0.0).all()); - VERIFY((Eigen::isfinite(m1) && (!Eigen::isfinite(m1*0.0/0.0)) && (!Eigen::isfinite(m4/0.0))).all()); + VERIFY((Eigen::isnan)((m1*0.0)/0.0).all()); + VERIFY((Eigen::isinf)(m4/0.0).all()); + VERIFY(((Eigen::isfinite)(m1) && (!(Eigen::isfinite)(m1*0.0/0.0)) && (!(Eigen::isfinite)(m4/0.0))).all()); VERIFY_IS_APPROX(inverse(inverse(m1)),m1); VERIFY((abs(m1) == m1 || abs(m1) == -m1).all()); VERIFY_IS_APPROX(m3, sqrt(abs2(m1))); @@ -336,9 +336,9 @@ template void array_complex(const ArrayType& m) VERIFY_IS_APPROX(m1.cosh(), cosh(m1)); VERIFY_IS_APPROX(m1.tanh(), tanh(m1)); VERIFY_IS_APPROX(m1.arg(), arg(m1)); - VERIFY((m1.isNaN() == Eigen::isnan(m1)).all()); - VERIFY((m1.isInf() == Eigen::isinf(m1)).all()); - VERIFY((m1.isFinite() == Eigen::isfinite(m1)).all()); + VERIFY((m1.isNaN() == (Eigen::isnan)(m1)).all()); + VERIFY((m1.isInf() == (Eigen::isinf)(m1)).all()); + VERIFY((m1.isFinite() == (Eigen::isfinite)(m1)).all()); VERIFY_IS_APPROX(m1.inverse(), inverse(m1)); VERIFY_IS_APPROX(m1.log(), log(m1)); VERIFY_IS_APPROX(m1.log10(), log10(m1)); @@ -364,20 +364,20 @@ template void array_complex(const ArrayType& m) VERIFY_IS_APPROX(arg(m1), m3); std::complex zero(0.0,0.0); - VERIFY(Eigen::isnan(m1*zero/zero).all()); + VERIFY((Eigen::isnan)(m1*zero/zero).all()); #if EIGEN_COMP_CLANG // clang's complex division is notoriously broken - if(numext::isinf(m4(0,0)/RealScalar(0))) { + if((numext::isinf)(m4(0,0)/RealScalar(0))) { #endif - VERIFY(Eigen::isinf(m4/zero).all()); + VERIFY((Eigen::isinf)(m4/zero).all()); #if EIGEN_COMP_CLANG } else { - VERIFY(Eigen::isinf(m4.real()/zero.real()).all()); + VERIFY((Eigen::isinf)(m4.real()/zero.real()).all()); } #endif - VERIFY((Eigen::isfinite(m1) && (!Eigen::isfinite(m1*zero/zero)) && (!Eigen::isfinite(m1/zero))).all()); + VERIFY(((Eigen::isfinite)(m1) && (!(Eigen::isfinite)(m1*zero/zero)) && (!(Eigen::isfinite)(m1/zero))).all()); VERIFY_IS_APPROX(inverse(inverse(m1)),m1); VERIFY_IS_APPROX(conj(m1.conjugate()), m1); diff --git a/test/main.h b/test/main.h index 0d03d4853..2797e8623 100644 --- a/test/main.h +++ b/test/main.h @@ -55,6 +55,9 @@ // compiler error. #define min(A,B) please_protect_your_min_with_parentheses #define max(A,B) please_protect_your_max_with_parentheses +#define isnan(X) please_protect_your_isnan_with_parentheses +#define isinf(X) please_protect_your_isinf_with_parentheses +#define isfinite(X) please_protect_your_isfinite_with_parentheses #define FORBIDDEN_IDENTIFIER (this_identifier_is_forbidden_to_avoid_clashes) this_identifier_is_forbidden_to_avoid_clashes // B0 is defined in POSIX header termios.h From d6a4805fdf6ef4cb13c05c218006cda32a8c857a Mon Sep 17 00:00:00 2001 From: Christoph Hertzberg Date: Sun, 16 Aug 2015 14:00:02 +0200 Subject: [PATCH 5/5] Protect further isnan/isfinite/isinf calls --- Eigen/src/Eigenvalues/EigenSolver.h | 4 +- test/packetmath.cpp | 16 +++--- test/stable_norm.cpp | 50 +++++++++---------- unsupported/test/cxx11_tensor_thread_pool.cpp | 8 +-- unsupported/test/mpreal/mpreal.h | 16 +++--- 5 files changed, 47 insertions(+), 47 deletions(-) diff --git a/Eigen/src/Eigenvalues/EigenSolver.h b/Eigen/src/Eigenvalues/EigenSolver.h index 25eaa0609..8bc82df83 100644 --- a/Eigen/src/Eigenvalues/EigenSolver.h +++ b/Eigen/src/Eigenvalues/EigenSolver.h @@ -399,7 +399,7 @@ EigenSolver::compute(const MatrixType& matrix, bool computeEigenvect if (i == matrix.cols() - 1 || m_matT.coeff(i+1, i) == Scalar(0)) { m_eivalues.coeffRef(i) = m_matT.coeff(i, i); - if(!isfinite(m_eivalues.coeffRef(i))) + if(!(isfinite)(m_eivalues.coeffRef(i))) { m_isInitialized = true; m_eigenvectorsOk = false; @@ -426,7 +426,7 @@ EigenSolver::compute(const MatrixType& matrix, bool computeEigenvect m_eivalues.coeffRef(i) = ComplexScalar(m_matT.coeff(i+1, i+1) + p, z); m_eivalues.coeffRef(i+1) = ComplexScalar(m_matT.coeff(i+1, i+1) + p, -z); - if(!(isfinite(m_eivalues.coeffRef(i)) && isfinite(m_eivalues.coeffRef(i+1)))) + if(!((isfinite)(m_eivalues.coeffRef(i)) && (isfinite)(m_eivalues.coeffRef(i+1)))) { m_isInitialized = true; m_eigenvectorsOk = false; diff --git a/test/packetmath.cpp b/test/packetmath.cpp index 3cf82eae0..1cc7a9cd9 100644 --- a/test/packetmath.cpp +++ b/test/packetmath.cpp @@ -318,7 +318,7 @@ template void packetmath_real() data1[1] = std::numeric_limits::epsilon(); packet_helper::HasExp,Packet> h; h.store(data2, internal::pexp(h.load(data1))); - VERIFY(numext::isnan(data2[0])); + VERIFY((numext::isnan)(data2[0])); VERIFY_IS_EQUAL(std::exp(std::numeric_limits::epsilon()), data2[1]); data1[0] = -std::numeric_limits::epsilon(); @@ -354,34 +354,34 @@ template void packetmath_real() data1[1] = std::numeric_limits::epsilon(); packet_helper::HasLog,Packet> h; h.store(data2, internal::plog(h.load(data1))); - VERIFY(std::isnan(data2[0])); + VERIFY((numext::isnan)(data2[0])); // VERIFY_IS_EQUAL(std::log(std::numeric_limits::epsilon()), data2[1]); data1[0] = -std::numeric_limits::epsilon(); data1[1] = 0; h.store(data2, internal::plog(h.load(data1))); - VERIFY(std::isnan(data2[0])); + VERIFY((numext::isnan)(data2[0])); // VERIFY_IS_EQUAL(std::log(0), data2[1]); data1[0] = (std::numeric_limits::min)(); data1[1] = -(std::numeric_limits::min)(); h.store(data2, internal::plog(h.load(data1))); VERIFY_IS_EQUAL(std::log((std::numeric_limits::min)()), data2[0]); - // VERIFY(std::isnan(data2[1])); + // VERIFY((numext::isnan)(data2[1])); data1[0] = std::numeric_limits::denorm_min(); data1[1] = -std::numeric_limits::denorm_min(); h.store(data2, internal::plog(h.load(data1))); // VERIFY_IS_EQUAL(std::log(std::numeric_limits::denorm_min()), data2[0]); - // VERIFY(std::isnan(data2[1])); + // VERIFY((numext::isnan)(data2[1])); data1[0] = -1.0f; h.store(data2, internal::plog(h.load(data1))); - VERIFY(std::isnan(data2[0])); + VERIFY((numext::isnan)(data2[0])); #if !EIGEN_FAST_MATH h.store(data2, internal::psqrt(h.load(data1))); - VERIFY(numext::isnan(data2[0])); - VERIFY(numext::isnan(data2[1])); + VERIFY((numext::isnan)(data2[0])); + VERIFY((numext::isnan)(data2[1])); #endif } } diff --git a/test/stable_norm.cpp b/test/stable_norm.cpp index 99cb0d5a6..7561ae8be 100644 --- a/test/stable_norm.cpp +++ b/test/stable_norm.cpp @@ -40,7 +40,7 @@ template void stable_norm(const MatrixType& m) && "the stable norm algorithm cannot be guaranteed on this computer"); Scalar inf = std::numeric_limits::infinity(); - if(NumTraits::IsComplex && numext::isnan(inf*RealScalar(1)) ) + if(NumTraits::IsComplex && (numext::isnan)(inf*RealScalar(1)) ) { complex_real_product_ok = false; static bool first = true; @@ -81,18 +81,18 @@ template void stable_norm(const MatrixType& m) RealScalar size = static_cast(m.size()); // test numext::isfinite - VERIFY(!numext::isfinite( std::numeric_limits::infinity())); - VERIFY(!numext::isfinite(sqrt(-abs(big)))); + VERIFY(!(numext::isfinite)( std::numeric_limits::infinity())); + VERIFY(!(numext::isfinite)(sqrt(-abs(big)))); // test overflow - VERIFY(numext::isfinite(sqrt(size)*abs(big))); + VERIFY((numext::isfinite)(sqrt(size)*abs(big))); VERIFY_IS_NOT_APPROX(sqrt(copy(vbig.squaredNorm())), abs(sqrt(size)*big)); // here the default norm must fail VERIFY_IS_APPROX(vbig.stableNorm(), sqrt(size)*abs(big)); VERIFY_IS_APPROX(vbig.blueNorm(), sqrt(size)*abs(big)); VERIFY_IS_APPROX(vbig.hypotNorm(), sqrt(size)*abs(big)); // test underflow - VERIFY(numext::isfinite(sqrt(size)*abs(small))); + VERIFY((numext::isfinite)(sqrt(size)*abs(small))); VERIFY_IS_NOT_APPROX(sqrt(copy(vsmall.squaredNorm())), abs(sqrt(size)*small)); // here the default norm must fail VERIFY_IS_APPROX(vsmall.stableNorm(), sqrt(size)*abs(small)); VERIFY_IS_APPROX(vsmall.blueNorm(), sqrt(size)*abs(small)); @@ -115,39 +115,39 @@ template void stable_norm(const MatrixType& m) { v = vrand; v(i,j) = std::numeric_limits::quiet_NaN(); - VERIFY(!numext::isfinite(v.squaredNorm())); VERIFY(numext::isnan(v.squaredNorm())); - VERIFY(!numext::isfinite(v.norm())); VERIFY(numext::isnan(v.norm())); - VERIFY(!numext::isfinite(v.stableNorm())); VERIFY(numext::isnan(v.stableNorm())); - VERIFY(!numext::isfinite(v.blueNorm())); VERIFY(numext::isnan(v.blueNorm())); - VERIFY(!numext::isfinite(v.hypotNorm())); VERIFY(numext::isnan(v.hypotNorm())); + VERIFY(!(numext::isfinite)(v.squaredNorm())); VERIFY((numext::isnan)(v.squaredNorm())); + VERIFY(!(numext::isfinite)(v.norm())); VERIFY((numext::isnan)(v.norm())); + VERIFY(!(numext::isfinite)(v.stableNorm())); VERIFY((numext::isnan)(v.stableNorm())); + VERIFY(!(numext::isfinite)(v.blueNorm())); VERIFY((numext::isnan)(v.blueNorm())); + VERIFY(!(numext::isfinite)(v.hypotNorm())); VERIFY((numext::isnan)(v.hypotNorm())); } // +inf { v = vrand; v(i,j) = std::numeric_limits::infinity(); - VERIFY(!numext::isfinite(v.squaredNorm())); VERIFY(isPlusInf(v.squaredNorm())); - VERIFY(!numext::isfinite(v.norm())); VERIFY(isPlusInf(v.norm())); - VERIFY(!numext::isfinite(v.stableNorm())); + VERIFY(!(numext::isfinite)(v.squaredNorm())); VERIFY(isPlusInf(v.squaredNorm())); + VERIFY(!(numext::isfinite)(v.norm())); VERIFY(isPlusInf(v.norm())); + VERIFY(!(numext::isfinite)(v.stableNorm())); if(complex_real_product_ok){ VERIFY(isPlusInf(v.stableNorm())); } - VERIFY(!numext::isfinite(v.blueNorm())); VERIFY(isPlusInf(v.blueNorm())); - VERIFY(!numext::isfinite(v.hypotNorm())); VERIFY(isPlusInf(v.hypotNorm())); + VERIFY(!(numext::isfinite)(v.blueNorm())); VERIFY(isPlusInf(v.blueNorm())); + VERIFY(!(numext::isfinite)(v.hypotNorm())); VERIFY(isPlusInf(v.hypotNorm())); } // -inf { v = vrand; v(i,j) = -std::numeric_limits::infinity(); - VERIFY(!numext::isfinite(v.squaredNorm())); VERIFY(isPlusInf(v.squaredNorm())); - VERIFY(!numext::isfinite(v.norm())); VERIFY(isPlusInf(v.norm())); - VERIFY(!numext::isfinite(v.stableNorm())); + VERIFY(!(numext::isfinite)(v.squaredNorm())); VERIFY(isPlusInf(v.squaredNorm())); + VERIFY(!(numext::isfinite)(v.norm())); VERIFY(isPlusInf(v.norm())); + VERIFY(!(numext::isfinite)(v.stableNorm())); if(complex_real_product_ok) { VERIFY(isPlusInf(v.stableNorm())); } - VERIFY(!numext::isfinite(v.blueNorm())); VERIFY(isPlusInf(v.blueNorm())); - VERIFY(!numext::isfinite(v.hypotNorm())); VERIFY(isPlusInf(v.hypotNorm())); + VERIFY(!(numext::isfinite)(v.blueNorm())); VERIFY(isPlusInf(v.blueNorm())); + VERIFY(!(numext::isfinite)(v.hypotNorm())); VERIFY(isPlusInf(v.hypotNorm())); } // mix @@ -157,11 +157,11 @@ template void stable_norm(const MatrixType& m) v = vrand; v(i,j) = -std::numeric_limits::infinity(); v(i2,j2) = std::numeric_limits::quiet_NaN(); - VERIFY(!numext::isfinite(v.squaredNorm())); VERIFY(numext::isnan(v.squaredNorm())); - VERIFY(!numext::isfinite(v.norm())); VERIFY(numext::isnan(v.norm())); - VERIFY(!numext::isfinite(v.stableNorm())); VERIFY(numext::isnan(v.stableNorm())); - VERIFY(!numext::isfinite(v.blueNorm())); VERIFY(numext::isnan(v.blueNorm())); - VERIFY(!numext::isfinite(v.hypotNorm())); VERIFY(numext::isnan(v.hypotNorm())); + VERIFY(!(numext::isfinite)(v.squaredNorm())); VERIFY((numext::isnan)(v.squaredNorm())); + VERIFY(!(numext::isfinite)(v.norm())); VERIFY((numext::isnan)(v.norm())); + VERIFY(!(numext::isfinite)(v.stableNorm())); VERIFY((numext::isnan)(v.stableNorm())); + VERIFY(!(numext::isfinite)(v.blueNorm())); VERIFY((numext::isnan)(v.blueNorm())); + VERIFY(!(numext::isfinite)(v.hypotNorm())); VERIFY((numext::isnan)(v.hypotNorm())); } } diff --git a/unsupported/test/cxx11_tensor_thread_pool.cpp b/unsupported/test/cxx11_tensor_thread_pool.cpp index 5ec7c8bf4..e28cf55e2 100644 --- a/unsupported/test/cxx11_tensor_thread_pool.cpp +++ b/unsupported/test/cxx11_tensor_thread_pool.cpp @@ -126,7 +126,7 @@ static void test_contraction_corner_cases() m_result = m_left.transpose() * m_right; for (ptrdiff_t i = 0; i < t_result.size(); i++) { - assert(!std::isnan(t_result.data()[i])); + assert(!(numext::isnan)(t_result.data()[i])); if (fabs(t_result.data()[i] - m_result.data()[i]) >= 1e-4) { std::cout << "mismatch detected at index " << i << " : " << t_result.data()[i] << " vs " << m_result.data()[i] << std::endl; assert(false); @@ -141,7 +141,7 @@ static void test_contraction_corner_cases() new(&m_left) MapXf(t_left.data(), 32, 1); m_result = m_left.transpose() * m_right; for (ptrdiff_t i = 0; i < t_result.size(); i++) { - assert(!std::isnan(t_result.data()[i])); + assert(!(numext::isnan)(t_result.data()[i])); if (fabs(t_result.data()[i] - m_result.data()[i]) >= 1e-4) { std::cout << "mismatch detected: " << t_result.data()[i] << " vs " << m_result.data()[i] << std::endl; assert(false); @@ -159,7 +159,7 @@ static void test_contraction_corner_cases() new(&m_right) MapXf(t_right.data(), 32, 4); m_result = m_left.transpose() * m_right; for (ptrdiff_t i = 0; i < t_result.size(); i++) { - assert(!std::isnan(t_result.data()[i])); + assert(!(numext::isnan)(t_result.data()[i])); if (fabs(t_result.data()[i] - m_result.data()[i]) >= 1e-4) { std::cout << "mismatch detected: " << t_result.data()[i] << " vs " << m_result.data()[i] << std::endl; assert(false); @@ -177,7 +177,7 @@ static void test_contraction_corner_cases() new(&m_right) MapXf(t_right.data(), 32, 4); m_result = m_left.transpose() * m_right; for (ptrdiff_t i = 0; i < t_result.size(); i++) { - assert(!std::isnan(t_result.data()[i])); + assert(!(numext::isnan)(t_result.data()[i])); if (fabs(t_result.data()[i] - m_result.data()[i]) >= 1e-4) { std::cout << "mismatch detected: " << t_result.data()[i] << " vs " << m_result.data()[i] << std::endl; assert(false); diff --git a/unsupported/test/mpreal/mpreal.h b/unsupported/test/mpreal/mpreal.h index 7d6f4e79f..b643309c0 100644 --- a/unsupported/test/mpreal/mpreal.h +++ b/unsupported/test/mpreal/mpreal.h @@ -72,13 +72,13 @@ // Detect compiler using signatures from http://predef.sourceforge.net/ #if defined(__GNUC__) && defined(__INTEL_COMPILER) - #define IsInf(x) isinf(x) // Intel ICC compiler on Linux + #define IsInf(x) (isinf)(x) // Intel ICC compiler on Linux #elif defined(_MSC_VER) // Microsoft Visual C++ #define IsInf(x) (!_finite(x)) #else - #define IsInf(x) std::isinf(x) // GNU C/C++ (and/or other compilers), just hope for C99 conformance + #define IsInf(x) (std::isinf)(x) // GNU C/C++ (and/or other compilers), just hope for C99 conformance #endif // A Clang feature extension to determine compiler features. @@ -530,9 +530,9 @@ public: #endif // Instance Checkers - friend bool isnan (const mpreal& v); - friend bool isinf (const mpreal& v); - friend bool isfinite (const mpreal& v); + friend bool (isnan) (const mpreal& v); + friend bool (isinf) (const mpreal& v); + friend bool (isfinite) (const mpreal& v); friend bool isnum (const mpreal& v); friend bool iszero (const mpreal& v); @@ -1687,9 +1687,9 @@ inline bool operator == (const mpreal& a, const long double b ){ return inline bool operator == (const mpreal& a, const double b ){ return (mpfr_cmp_d (a.mpfr_srcptr(),b) == 0 ); } -inline bool isnan (const mpreal& op){ return (mpfr_nan_p (op.mpfr_srcptr()) != 0 ); } -inline bool isinf (const mpreal& op){ return (mpfr_inf_p (op.mpfr_srcptr()) != 0 ); } -inline bool isfinite (const mpreal& op){ return (mpfr_number_p (op.mpfr_srcptr()) != 0 ); } +inline bool (isnan) (const mpreal& op){ return (mpfr_nan_p (op.mpfr_srcptr()) != 0 ); } +inline bool (isinf) (const mpreal& op){ return (mpfr_inf_p (op.mpfr_srcptr()) != 0 ); } +inline bool (isfinite) (const mpreal& op){ return (mpfr_number_p (op.mpfr_srcptr()) != 0 ); } inline bool iszero (const mpreal& op){ return (mpfr_zero_p (op.mpfr_srcptr()) != 0 ); } inline bool isint (const mpreal& op){ return (mpfr_integer_p(op.mpfr_srcptr()) != 0 ); }