Add a portable floating point classification API
Ceres has traditionally battled with portability issues
when trying to classify floating point values as one
type or another. For example, in C99 'isnan' is a
macro. Since it is a macro, it is impossible to
override the name in other namespaces.
Instead of trying to use preprocessor hacks to work
around the issue, define our own set of camel-case
names for use internally and by Ceres clients. For
example do this:
template<typename T>
void MyFunction(T x, T y) {
if (ceres::IsNaN(x)) {
...
}
}
instead of using "isnan" or "std::isnan". Note that
while GCC and Apple GCC both import 'isnan' into
the std namespace, it is not standard until C++11
which Ceres will not require for some years.
Change-Id: Ibcc96a8bb4ba63aa67cbbc58658b2e5671cd5824
diff --git a/internal/ceres/rotation_test.cc b/internal/ceres/rotation_test.cc
index a8351d5..55a4fbb 100644
--- a/internal/ceres/rotation_test.cc
+++ b/internal/ceres/rotation_test.cc
@@ -591,8 +591,8 @@
bool IsClose(double x, double y) {
- EXPECT_FALSE(isnan(x));
- EXPECT_FALSE(isnan(y));
+ EXPECT_FALSE(IsNaN(x));
+ EXPECT_FALSE(IsNaN(y));
double absdiff = fabs(x - y);
if (x == 0 || y == 0) {
return absdiff <= kTolerance;