aboutsummaryrefslogtreecommitdiff
path: root/src/port/isinf.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/port/isinf.c')
-rw-r--r--src/port/isinf.c82
1 files changed, 82 insertions, 0 deletions
diff --git a/src/port/isinf.c b/src/port/isinf.c
new file mode 100644
index 00000000000..3156591999e
--- /dev/null
+++ b/src/port/isinf.c
@@ -0,0 +1,82 @@
+/* $Id: isinf.c,v 1.1 2002/07/18 04:13:59 momjian Exp $ */
+
+#include "c.h"
+
+#include <math.h>
+
+#if HAVE_FPCLASS /* this is _not_ HAVE_FP_CLASS, and not
+ * typo */
+
+#if HAVE_IEEEFP_H
+#include <ieeefp.h>
+#endif
+int
+isinf(double d)
+{
+ fpclass_t type = fpclass(d);
+
+ switch (type)
+ {
+ case FP_NINF:
+ case FP_PINF:
+ return 1;
+ default:
+ break;
+ }
+ return 0;
+}
+
+#else
+
+#if defined(HAVE_FP_CLASS) || defined(HAVE_FP_CLASS_D)
+
+#if HAVE_FP_CLASS_H
+#include <fp_class.h>
+#endif
+int
+isinf(x)
+double x;
+{
+#if HAVE_FP_CLASS
+ int fpclass = fp_class(x);
+
+#else
+ int fpclass = fp_class_d(x);
+#endif
+
+ if (fpclass == FP_POS_INF)
+ return 1;
+ if (fpclass == FP_NEG_INF)
+ return -1;
+ return 0;
+}
+
+#elif defined(HAVE_CLASS)
+int
+isinf(double x)
+{
+ int fpclass = class(x);
+
+ if (fpclass == FP_PLUS_INF)
+ return 1;
+ if (fpclass == FP_MINUS_INF)
+ return -1;
+ return 0;
+}
+#endif
+#endif
+
+#ifdef __QNX__
+#include <float.h>
+
+int
+isinf(double x)
+{
+ if (x == HUGE_VAL)
+ return 1;
+ if (x == -HUGE_VAL)
+ return -1;
+ return 0;
+}
+
+#endif