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
This commit is contained in:
Keir Mierle
2012-06-24 17:23:57 -07:00
parent 57a3458e56
commit 58ede2772e
7 changed files with 97 additions and 46 deletions
+2 -1
View File
@@ -32,6 +32,7 @@
#include <cmath>
#include <cstddef>
#include "ceres/fpclassify.h"
namespace ceres {
namespace internal {
@@ -46,7 +47,7 @@ const double kImpossibleValue = 1e302;
bool IsArrayValid(const int size, const double* x) {
if (x != NULL) {
for (int i = 0; i < size; ++i) {
if (!isfinite(x[i]) || (x[i] == kImpossibleValue)) {
if (!IsFinite(x[i]) || (x[i] == kImpossibleValue)) {
return false;
}
}