#ifndef DOUBLE_EQ
#define DOUBLE_EQ(obt, exp) \
    (((exp - DBL_EPSILON) < obt) && (obt < (exp + DBL_EPSILON)))
#endif

#ifndef FLOAT_EQ
#define FLOAT_EQ(obt, exp) \
    (((exp - FLT_EPSILON) < obt) && (obt < (exp + FLT_EPSILON)))
#endif

#define CHECK(exp) { if ( !exp ) { \
    fprintf(stderr, "Check failed on line %d\n", __LINE__); \
    exit(EXIT_FAILURE); } }

/* FIXME: uses C99 integral type, might be not portable */
#define CHECK_EQUALS(obt, exp) { if ( (long long)obt != (long long)exp ) { \
    fprintf(stderr, "Check failed on line %d\n", __LINE__); \
    exit(EXIT_FAILURE); } }

#define CHECK_EQUALS_FLOAT(obt, exp) { if (FLOAT_EQ(obt, exp)) { \
    fprintf(stderr, "Check failed on line %d\n", __LINE__); \
    exit(EXIT_FAILURE); } }

#define CHECK_EQUALS_DOUBLE(obt, exp) { if (DOUBLE_EQ(obt, exp)) { \
    fprintf(stderr, "Check failed on line %d\n", __LINE__); \
    exit(EXIT_FAILURE); } }

