00001
00002
00003
00004
00005
00006 #ifndef PIKE_FLOAT_H
00007 #define PIKE_FLOAT_H
00008
00009 #include "global.h"
00010
00011 #ifdef HAVE_FLOATINGPOINT_H
00012 #include <floatingpoint.h>
00013 #endif
00014 #ifdef HAVE_IEEEFP_H
00015 #include <ieeefp.h>
00016 #endif
00017 #ifdef HAVE_FP_CLASS_H
00018 #include <fp_class.h>
00019 #endif
00020
00021
00022
00023 #ifdef HAVE_ISNAN
00024 #if defined(HAVE__ISNAN) && defined(__NT__)
00025
00026
00027
00028
00029 #define PIKE_ISNAN(X) _isnan(X)
00030 #else
00031 #define PIKE_ISNAN(X) isnan(X)
00032 #endif
00033 #else
00034 #ifdef HAVE__ISNAN
00035 #define PIKE_ISNAN(X) _isnan(X)
00036 #else
00037
00038 static INLINE int pike_isnan(double x)
00039 {
00040 return ((x == 0.0) == (x < 0.0)) &&
00041 ((x == 0.0) == (x > 0.0));
00042 }
00043 #define PIKE_ISNAN(X) pike_isnan(X)
00044 #endif
00045 #endif
00046
00047
00048
00049 #ifdef HAVE_ISINF
00050 #define PIKE_ISINF(X) isinf(X)
00051 #else
00052 #define PIKE_ISINF(X) ((X) && ((X)+(X) == (X)))
00053 #endif
00054
00055 #ifdef HAVE_ISUNORDERED
00056 #define PIKE_ISUNORDERED(X,Y) isunordered(X,Y)
00057 #else
00058 #define PIKE_ISUNORDERED(X,Y) (PIKE_ISNAN(X)||PIKE_ISNAN(Y))
00059 #endif
00060
00061 #ifndef FLOAT_IS_IEEE_BIG
00062 #ifndef FLOAT_IS_IEEE_LITTLE
00063 #define NEED_CUSTOM_IEEE
00064 #endif
00065 #endif
00066 #ifndef NEED_CUSTOM_IEEE
00067 #ifndef DOUBLE_IS_IEEE_BIG
00068 #ifndef DOUBLE_IS_IEEE_LITTLE
00069 #define NEED_CUSTOM_IEEE
00070 #endif
00071 #endif
00072 #endif
00073
00074 #endif