chiark / gitweb /
more robustness to underflow etc. (fix #36)
[nlopt.git] / api / general.c
index dfe20102de0d8d9a2a1d8ddb46bd75948b5fee41..dc2fb3818323b232f58ca2358ff4d085fe66abf7 100644 (file)
@@ -39,6 +39,33 @@ int nlopt_isfinite(double x) {
     return fabs(x) <= DBL_MAX;
 }
 
+int nlopt_istiny(double x)
+{
+#if defined(HAVE_FPCLASSIFY)
+    return x == 0.0 || fpclassify(x) == FP_SUBNORMAL;
+#elif defined(_WIN32)
+    if (x == 0.0)
+        return 1;
+    else {
+        int c = _fpclass(x);
+        return c == _FPCLASS_ND || c == _FPCLASS_PD;
+    }
+#else
+    return fabs(x) < 2.2250738585072014e-308; /* assume IEEE 754 double */
+#endif
+}
+
+int nlopt_isnan(double x)
+{
+#if defined(HAVE_ISNAN)
+    return isnan(x);
+#elif defined(_WIN32)
+    return _isnan(x);
+#else
+    return x != x; /* might fail with aggressive optimization */
+#endif
+}
+
 /*************************************************************************/
 
 void NLOPT_STDCALL nlopt_version(int *major, int *minor, int *bugfix)