/* we need some special math function */
+#ifndef _ISOC99_SOURCE
#define _ISOC99_SOURCE
+#endif
#include <math.h>
/* which are not defined on FreeBSD */
+#ifdef __GNUC__
+
#ifndef isunordered
# define isunordered(u, v) \
(__extension__ \
!isunordered(__x, __y) && __x > __y; }))
#endif
+#else
+
+/* isunordered seems to crash on HPUX when built 64 bits
+ so use generic implementation.
+*/
+#if defined(__hpux) && SIZEOF_VOID_P == 8
+#undef isunordered
+#undef islessgreater
+#undef islessequal
+#undef isless
+#undef isgreater
+#endif
+
+#ifndef isunordered
+# define isunordered(u, v) (isnan(u) || isnan(v))
+#endif
+
+#ifndef islessgreater
+# define islessgreater(x, u) (!isunordered (x, y) && (x < y) || (y < x))
+#endif
+
+#ifndef islessequal
+# define islessequal(x, y) (!isunordered(x, y) && x <= y)
+#endif
+
+#ifndef isless
+# define isless(x, y) (!isunordered(x, y) && x < y)
+#endif
+
+#ifndef isgreater
+# define isgreater(x, y) (!isunordered(x, y) && x > y)
+#endif
+
+#endif
+
/*
* Attempt at using the goto label construct of GNU GCC:
* it turns out this does give some benefit: 5-15% speedup.