2018-09-23 17:23:38 -04:00
|
|
|
#pragma once
|
|
|
|
|
|
2018-09-30 14:56:07 -04:00
|
|
|
#define MAX(a, b) \
|
2018-09-25 00:04:11 -04:00
|
|
|
({ __typeof__ (a) _a = (a); \
|
|
|
|
|
__typeof__ (b) _b = (b); \
|
|
|
|
|
_a > _b ? _a : _b; })
|
2018-09-23 17:23:38 -04:00
|
|
|
|
2018-09-30 14:56:07 -04:00
|
|
|
#define MIN(a, b) \
|
2018-09-25 00:04:11 -04:00
|
|
|
({ __typeof__ (a) _a = (a); \
|
|
|
|
|
__typeof__ (b) _b = (b); \
|
|
|
|
|
_a < _b ? _a : _b; })
|
2018-09-30 14:56:07 -04:00
|
|
|
|
|
|
|
|
#define FP_NAN 0
|
|
|
|
|
#define FP_INFINITE 1
|
|
|
|
|
#define FP_ZERO 2
|
|
|
|
|
#define FP_SUBNORMAL 3
|
|
|
|
|
#define FP_NORMAL 4
|
|
|
|
|
|
|
|
|
|
int __fpclassify(double);
|
|
|
|
|
int __fpclassifyf(float);
|
|
|
|
|
int __fpclassifyl(long double);
|
|
|
|
|
|
|
|
|
|
static inline unsigned __FLOAT_BITS(float __f) {
|
|
|
|
|
union {
|
|
|
|
|
float __f;
|
|
|
|
|
unsigned __i;
|
|
|
|
|
} __u;
|
|
|
|
|
__u.__f = __f;
|
|
|
|
|
return __u.__i;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static inline unsigned long long __DOUBLE_BITS(double __f) {
|
|
|
|
|
union {
|
|
|
|
|
double __f;
|
|
|
|
|
unsigned long long __i;
|
|
|
|
|
} __u;
|
|
|
|
|
__u.__f = __f;
|
|
|
|
|
return __u.__i;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#define isfinite(x) ( \
|
|
|
|
|
sizeof(x) == sizeof(float) ? (__FLOAT_BITS(x) & 0x7fffffff) < 0x7f800000 : \
|
|
|
|
|
sizeof(x) == sizeof(double) ? (__DOUBLE_BITS(x) & -1ULL>>1) < 0x7ffULL<<52 : \
|
|
|
|
|
__fpclassifyl(x) > FP_INFINITE)
|
|
|
|
|
|
|
|
|
|
int __signbit(double);
|
|
|
|
|
int __signbitf(float);
|
|
|
|
|
int __signbitl(long double);
|
|
|
|
|
|
|
|
|
|
#define signbit(x) ( \
|
|
|
|
|
sizeof(x) == sizeof(float) ? (int)(__FLOAT_BITS(x)>>31) : \
|
|
|
|
|
sizeof(x) == sizeof(double) ? (int)(__DOUBLE_BITS(x)>>63) : \
|
|
|
|
|
__signbitl(x) )
|
|
|
|
|
|
|
|
|
|
long double frexpl(long double x, int *e);
|