-#define isinf(x) (fpclassify(x) == FP_INFINITE)
-#define isnan(x) (fpclassify(x) == FP_NAN)
-#define isnormal(x) (fpclassify(x) == FP_NORMAL)
-#define isfinite(x) (fpclassify(x) > FP_INFINITE)
+#define isinf(x) ( \
+ sizeof(x) == sizeof(float) ? (__FLOAT_BITS(x) & 0x7fffffff) == 0x7f800000 : \
+ sizeof(x) == sizeof(double) ? (__DOUBLE_BITS(x) & ~((__uint64_t)1<<63)) == (__uint64_t)0x7ff<<52 : \
+ __fpclassifyl(x) == FP_INFINITE)
+
+#define isnan(x) ( \
+ sizeof(x) == sizeof(float) ? (__FLOAT_BITS(x) & 0x7fffffff) > 0x7f800000 : \
+ sizeof(x) == sizeof(double) ? (__DOUBLE_BITS(x) & ~((__uint64_t)1<<63)) > (__uint64_t)0x7ff<<52 : \
+ __fpclassifyl(x) == FP_NAN)
+
+#define isnormal(x) ( \
+ sizeof(x) == sizeof(float) ? (__FLOAT_BITS(x)+0x00800000 & 0x7fffffff) >= 0x01000000 : \
+ sizeof(x) == sizeof(double) ? (__DOUBLE_BITS(x)+((__uint64_t)1<<52) & ~((__uint64_t)1<<63)) >= (__uint64_t)1<<53 : \
+ __fpclassifyl(x) == FP_NORMAL)
+
+#define isfinite(x) ( \
+ sizeof(x) == sizeof(float) ? (__FLOAT_BITS(x) & 0x7fffffff) < 0x7f800000 : \
+ sizeof(x) == sizeof(double) ? (__DOUBLE_BITS(x) & ~((__uint64_t)1<<63)) < (__uint64_t)0x7ff<<52 : \
+ __fpclassifyl(x) > FP_INFINITE)