diff options
Diffstat (limited to 'funtools/util/NaN.h.in')
-rw-r--r-- | funtools/util/NaN.h.in | 70 |
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 |