From 0339502a4feb6340f1e9f6f6ca8b3ef4d263f366 Mon Sep 17 00:00:00 2001 From: Deanna Hood Date: Mon, 20 Apr 2015 13:14:06 -0400 Subject: Only use std::isnan and std::isinf if they are available --- Eigen/src/Core/MathFunctions.h | 54 ++++++++++++++++++++++++++++++------------ Eigen/src/Core/util/Macros.h | 8 +++++++ 2 files changed, 47 insertions(+), 15 deletions(-) (limited to 'Eigen/src/Core') diff --git a/Eigen/src/Core/MathFunctions.h b/Eigen/src/Core/MathFunctions.h index 734a5e373..3bbebb345 100644 --- a/Eigen/src/Core/MathFunctions.h +++ b/Eigen/src/Core/MathFunctions.h @@ -790,14 +790,26 @@ bool (isfinite)(const std::complex& x) using std::imag; return isfinite(real(x)) && isfinite(imag(x)); } - -template -EIGEN_DEVICE_FUNC -bool (isNaN)(const T& x) -{ - using std::isnan; - return isnan(x); -} +#import +// Let's be conservative and enable the std::isnan implementation only if we are sure it exists +#if (__cplusplus >= 201103L) && (EIGEN_COMP_GNUC_STRICT || EIGEN_COMP_CLANG || EIGEN_COMP_MSVC || EIGEN_COMP_ICC) \ +&& (EIGEN_ARCH_i386_OR_x86_64) && (EIGEN_OS_GNULINUX || EIGEN_OS_WIN_STRICT || EIGEN_OS_MAC) \ +|| defined(EIGEN_HAS_C99_MATH) + template + EIGEN_DEVICE_FUNC + bool (isNaN)(const T& x) + { + using std::isnan; + return isnan(x); + } +#else + template + EIGEN_DEVICE_FUNC + bool (isNaN)(const T& x) + { + return x == x; + } +#endif template EIGEN_DEVICE_FUNC @@ -809,13 +821,25 @@ bool (isNaN)(const std::complex& x) return isnan(real(x)) || isnan(imag(x)); } -template -EIGEN_DEVICE_FUNC -bool (isInf)(const T& x) -{ - using std::isinf; - return isinf(x); -} +// Let's be conservative and enable the std::isinf implementation only if we are sure it exists +#if (__cplusplus >= 201103L) && (EIGEN_COMP_GNUC_STRICT || EIGEN_COMP_CLANG || EIGEN_COMP_MSVC || EIGEN_COMP_ICC) \ +&& (EIGEN_ARCH_i386_OR_x86_64) && (EIGEN_OS_GNULINUX || EIGEN_OS_WIN_STRICT || EIGEN_OS_MAC) \ +|| defined(EIGEN_HAS_C99_MATH) + template + EIGEN_DEVICE_FUNC + bool (isInf)(const T& x) + { + using std::isinf; + return isinf(x); + } +#else + template + EIGEN_DEVICE_FUNC + bool (isInf)(const T& x) + { + return x>NumTraits::highest() || x::lowest(); + } +#endif template EIGEN_DEVICE_FUNC diff --git a/Eigen/src/Core/util/Macros.h b/Eigen/src/Core/util/Macros.h index aaea9f035..754e2c7cc 100644 --- a/Eigen/src/Core/util/Macros.h +++ b/Eigen/src/Core/util/Macros.h @@ -398,6 +398,14 @@ #define EIGEN_HAS_CONSTEXPR 1 #endif +// Does the compiler support C99 math? +#if (EIGEN_COMP_GNUC_STRICT || \ + (EIGEN_COMP_ICC && EIGEN_COMP_GNUC) || \ + (EIGEN_COMP_CLANG) || \ + (EIGEN_COMP_MSVC >= 1800)) +#define EIGEN_HAS_C99_MATH 1 +#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: -- cgit v1.2.3