check_function_exists(gettimeofday HAVE_GETTIMEOFDAY)
check_function_exists(isnan HAVE_ISNAN)
check_function_exists(_isnan HAVE__ISNAN)
-check_function_exists(isfinite HAVE_ISFINITE)
-check_function_exists(_isfinite HAVE__ISFINITE)
check_function_exists(fsync HAVE_FSYNC)
check_function_exists(_fileno HAVE__FILENO)
check_function_exists(fileno HAVE_FILENO)
include(gmxTestPipes)
gmx_test_pipes(HAVE_PIPES)
+include(gmxTestIsfinite)
+gmx_test_isfinite(HAVE_ISFINITE)
+gmx_test__isfinite(HAVE__ISFINITE)
+gmx_test__finite(HAVE__FINITE)
+
include(gmxTestInlineASM)
gmx_test_inline_asm_gcc_x86(GMX_X86_GCC_INLINE_ASM)
gmx_test_inline_asm_msvc_x86(GMX_X86_MSVC_INLINE_ASM)
--- /dev/null
+# - Define macro to check if isfinite or _isfinite exists
+#
+# gmx_test_isfinite(VARIABLE)
+#
+# VARIABLE will be set to true if isfinite exists
+#
+# gmx_test__isfinite(VARIABLE)
+#
+# VARIABLE will be set to true if _isfinite exists
+#
+# gmx_test__finite(VARIABLE) - disabled since it doesn't seem to work the way the MSVC docs suggest
+#
+# VARIABLE will be set to true if _finite exists
+#
+
+MACRO(gmx_test_isfinite VARIABLE)
+ MESSAGE(STATUS "Checking for isfinite")
+
+ set(CMAKE_REQUIRED_INCLUDES "math.h")
+ set(CMAKE_REQUIRED_LIBRARIES "m")
+ check_c_source_compiles(
+ "#include <math.h>
+int main(void) {
+ float f;
+ isfinite(f);
+}" isfinite_compile_ok)
+
+ if(isfinite_compile_ok)
+ MESSAGE(STATUS "Checking for isfinite - yes")
+ set(${VARIABLE} ${isfinite_compile_ok}
+ "Result of test for isfinite")
+ else(isfinite_compile_ok)
+ MESSAGE(STATUS "Checking for isfinite - no")
+ endif(isfinite_compile_ok)
+ENDMACRO(gmx_test_isfinite VARIABLE)
+
+MACRO(gmx_test__isfinite VARIABLE)
+ MESSAGE(STATUS "Checking for _isfinite")
+
+ set(CMAKE_REQUIRED_INCLUDES "math.h")
+ set(CMAKE_REQUIRED_LIBRARIES "m")
+ check_c_source_compiles(
+ "#include <math.h>
+int main(void) {
+ float f;
+ _isfinite(f);
+}" _isfinite_compile_ok)
+
+ if(_isfinite_compile_ok)
+ MESSAGE(STATUS "Checking for _isfinite - yes")
+ set(${VARIABLE} ${_isfinite_compile_ok}
+ "Result of test for _isfinite")
+ else(_isfinite_compile_ok)
+ MESSAGE(STATUS "Checking for _isfinite - no")
+ endif(_isfinite_compile_ok)
+ENDMACRO(gmx_test__isfinite VARIABLE)
+
+# Necessary for MSVC
+MACRO(gmx_test__finite VARIABLE)
+ MESSAGE(STATUS "Checking for _finite")
+
+ set(CMAKE_REQUIRED_INCLUDES "float.h")
+ check_c_source_compiles(
+ "#include <float.h>
+int main(void) {
+ float f;
+ _finite(f);
+}" _finite_compile_ok)
+
+ if(_finite_compile_ok)
+ MESSAGE(STATUS "Checking for _finite - yes")
+ set(${VARIABLE} ${_finite_compile_ok}
+ "Result of test for _finite")
+ else(_finite_compile_ok)
+ MESSAGE(STATUS "Checking for _finite - no")
+ endif(_finite_compile_ok)
+ENDMACRO(gmx_test__finite VARIABLE)
#include <math.h>
#include <limits.h>
#include "maths.h"
+#ifdef HAVE__FINITE
+#include "float.h"
+#endif
int gmx_nint(real a)
{
t*(-0.82215223+t*0.17087277)))))))));
return ans;
}
+
+gmx_bool gmx_isfinite(real x)
+{
+ gmx_bool returnval = TRUE;
+ /* If no suitable function was found, assume the value is
+ * finite. */
+
+#ifdef HAVE_ISFINITE
+ returnval = isfinite(x);
+#elif defined HAVE__ISFINITE
+ returnval = _isfinite(x);
+#elif defined HAVE__FINITE
+ returnval = _finite(x);
+#endif
+ return returnval;
+}