summaryrefslogtreecommitdiffstats
path: root/funtools/util/NaN.h.in
diff options
context:
space:
mode:
Diffstat (limited to 'funtools/util/NaN.h.in')
-rw-r--r--funtools/util/NaN.h.in70
1 files changed, 70 insertions, 0 deletions
diff --git a/funtools/util/NaN.h.in b/funtools/util/NaN.h.in
new file mode 100644
index 0000000..7b331c1
--- /dev/null
+++ b/funtools/util/NaN.h.in
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 1999-2003 Smithsonian Astrophysical Observatory
+ */
+
+/*
+ *
+ * NaN.h -- include file to deal with IEEE NaN values
+ *
+ * Idea taken from fitsio2.h in the cfitsio package by William Pence (HEASARC),
+ * to whom grateful acknowledgement is made.
+ *
+ * These functions tests whether the float value is a reserved IEEE
+ * value such as a Not-a-Number (NaN), or underflow, overflow, or
+ * infinity. The functions returns 1 if the value is a NaN, overflow
+ * or infinity; otherwise it returns 0.
+ *
+ * isnanf tests floats, isnand tests doubles.
+ *
+ */
+#ifndef __nan_h
+#define __nan_h
+
+#include "prsetup.h"
+
+#define _BIG_ENDIAN @BIGENDIAN@
+
+#if _BIG_ENDIAN
+
+#define FNANOFF 0
+#define DNANOFF 0
+
+#else
+
+#define FNANOFF 1
+#define DNANOFF 3
+
+#endif
+
+#define FNANMASK 0x7F80 /* mask bits 1 - 8; all set on NaNs */
+ /* all 0 on underflow or 0. */
+
+#define DNANMASK 0x7FF0 /* mask bits 1 - 11; all set on NaNs */
+ /* all 0 on underflow or 0. */
+
+#ifndef isnanf
+typedef union {
+ float f;
+ short x[2];
+} uffu;
+
+#define isnanf(X) ((((uffu*)&X)->x[FNANOFF] & FNANMASK) == FNANMASK)
+#endif
+
+#ifndef isnand
+typedef union {
+ double d;
+ short x[4];
+} uddu;
+
+#define isnand(X) ((((uddu*)&X)->x[DNANOFF] & DNANMASK) == DNANMASK)
+#endif
+
+_PRbeg
+
+float getnanf _PRx((void));
+double getnand _PRx((void));
+
+_PRend
+
+#endif