#ifndef NUMERIC_UTILS_H #define NUMERIC_UTILS_H 1 #include template bool is_nan(T number) { using namespace std; if (numeric_limits::is_integer) return false; return ! (number == number); } template struct _power { T value(T a) { return a * _power(a); } }; template struct _power<0,T> { T value(T a) { return 1; } }; template T power(T a) { return _power().value(a); } template bool is_finite(T number) { using namespace std; if (numeric_limits::is_integer) return true; const T inf = numeric_limits::infinity(); if (number == inf || is_nan(number)) // NaN detection return false; return true; }; #endif