aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Deanna Hood <deanna.m.hood@gmail.com>2015-04-20 13:14:06 -0400
committerGravatar Deanna Hood <deanna.m.hood@gmail.com>2015-04-20 13:14:06 -0400
commit0339502a4feb6340f1e9f6f6ca8b3ef4d263f366 (patch)
treeace7179ac0806b1beb94af791d1d79a591801d0d
parent085aa8e6019f7ff8edc3108cc851c09c5213f8ee (diff)
Only use std::isnan and std::isinf if they are available
-rw-r--r--Eigen/src/Core/MathFunctions.h54
-rw-r--r--Eigen/src/Core/util/Macros.h8
2 files changed, 47 insertions, 15 deletions
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<T>& x)
using std::imag;
return isfinite(real(x)) && isfinite(imag(x));
}
-
-template<typename T>
-EIGEN_DEVICE_FUNC
-bool (isNaN)(const T& x)
-{
- using std::isnan;
- return isnan(x);
-}
+#import <iostream>
+// 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<typename T>
+ EIGEN_DEVICE_FUNC
+ bool (isNaN)(const T& x)
+ {
+ using std::isnan;
+ return isnan(x);
+ }
+#else
+ template<typename T>
+ EIGEN_DEVICE_FUNC
+ bool (isNaN)(const T& x)
+ {
+ return x == x;
+ }
+#endif
template<typename T>
EIGEN_DEVICE_FUNC
@@ -809,13 +821,25 @@ bool (isNaN)(const std::complex<T>& x)
return isnan(real(x)) || isnan(imag(x));
}
-template<typename T>
-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<typename T>
+ EIGEN_DEVICE_FUNC
+ bool (isInf)(const T& x)
+ {
+ using std::isinf;
+ return isinf(x);
+ }
+#else
+ template<typename T>
+ EIGEN_DEVICE_FUNC
+ bool (isInf)(const T& x)
+ {
+ return x>NumTraits<T>::highest() || x<NumTraits<T>::lowest();
+ }
+#endif
template<typename T>
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: