|
Szabolcs Nagy |
e81f47 |
#include <math.h>
|
|
Szabolcs Nagy |
e81f47 |
#include "mtest.h"
|
|
Szabolcs Nagy |
e81f47 |
#include "test.h"
|
|
Szabolcs Nagy |
e81f47 |
|
|
Szabolcs Nagy |
e81f47 |
enum {LESS,EQUAL,GREATER,UNORD};
|
|
Szabolcs Nagy |
e81f47 |
|
|
Szabolcs Nagy |
e81f47 |
#define TEST(f,want) do{ \
|
|
Szabolcs Nagy |
e81f47 |
int r, e; \
|
|
Szabolcs Nagy |
e81f47 |
feclearexcept(FE_ALL_EXCEPT); \
|
|
Szabolcs Nagy |
e81f47 |
r = (f); \
|
|
Szabolcs Nagy |
e81f47 |
e = fetestexcept(FE_ALL_EXCEPT); \
|
|
Szabolcs Nagy |
e81f47 |
if (r != (want)) \
|
|
Szabolcs Nagy |
e81f47 |
t_error(#f " failed: got %d want %d\n", r, (want)); \
|
|
Szabolcs Nagy |
e81f47 |
if (e & INVALID) \
|
|
Szabolcs Nagy |
e81f47 |
t_error(#f " raised the invalid exception\n"); \
|
|
Szabolcs Nagy |
e81f47 |
}while(0)
|
|
Szabolcs Nagy |
e81f47 |
|
|
Szabolcs Nagy |
e81f47 |
#undef T
|
|
Szabolcs Nagy |
e81f47 |
#define T(a,b,rel) do{ \
|
|
Szabolcs Nagy |
e81f47 |
TEST(isunordered(a, b), rel == UNORD); \
|
|
Szabolcs Nagy |
e81f47 |
TEST(isless(a, b), rel == LESS); \
|
|
Szabolcs Nagy |
e81f47 |
TEST(islessequal(a, b), rel == LESS || rel == EQUAL); \
|
|
Szabolcs Nagy |
e81f47 |
TEST(islessgreater(a, b), rel == LESS || rel == GREATER); \
|
|
Szabolcs Nagy |
e81f47 |
TEST(isgreater(a, b), rel == GREATER); \
|
|
Szabolcs Nagy |
e81f47 |
TEST(isgreaterequal(a, b), rel == GREATER || rel == EQUAL); \
|
|
Szabolcs Nagy |
e81f47 |
}while(0)
|
|
Szabolcs Nagy |
e81f47 |
|
|
Szabolcs Nagy |
e81f47 |
int main()
|
|
Szabolcs Nagy |
e81f47 |
{
|
|
Szabolcs Nagy |
e81f47 |
#pragma STDC FENV_ACCESS ON
|
|
Szabolcs Nagy |
e81f47 |
volatile double huge = DBL_MAX;
|
|
Szabolcs Nagy |
e81f47 |
volatile double tiny = DBL_MIN;
|
|
Szabolcs Nagy |
e81f47 |
volatile double eps = DBL_EPSILON;
|
|
Szabolcs Nagy |
e81f47 |
volatile float hugef = FLT_MAX;
|
|
Szabolcs Nagy |
e81f47 |
volatile float tinyf = FLT_MIN;
|
|
Szabolcs Nagy |
e81f47 |
volatile float epsf = FLT_EPSILON;
|
|
Szabolcs Nagy |
e81f47 |
volatile long double hugel = LDBL_MAX;
|
|
Szabolcs Nagy |
e81f47 |
volatile long double tinyl = LDBL_MIN;
|
|
Szabolcs Nagy |
e81f47 |
volatile long double epsl = LDBL_EPSILON;
|
|
Szabolcs Nagy |
e81f47 |
|
|
Szabolcs Nagy |
e81f47 |
T(nan, 1.0, UNORD);
|
|
Szabolcs Nagy |
e81f47 |
T(1.0, nan, UNORD);
|
|
Szabolcs Nagy |
e81f47 |
T(nan, nan, UNORD);
|
|
Szabolcs Nagy |
e81f47 |
T(nan, nan+1.0, UNORD);
|
|
Szabolcs Nagy |
e81f47 |
T(nan, nan+1.0L, UNORD);
|
|
Szabolcs Nagy |
e81f47 |
|
|
Szabolcs Nagy |
e81f47 |
T(1.0, 1.1, LESS);
|
|
Szabolcs Nagy |
e81f47 |
T(1.0, 1.0+eps, LESS);
|
|
Szabolcs Nagy |
e81f47 |
T(1.0+eps, 1.0, GREATER);
|
|
Szabolcs Nagy |
e81f47 |
T(huge-1, huge, EQUAL);
|
|
Szabolcs Nagy |
e81f47 |
T(huge, huge*huge, LESS);
|
|
Szabolcs Nagy |
e81f47 |
T(-0.0, 0.0, EQUAL);
|
|
Szabolcs Nagy |
e81f47 |
T(-tiny, 0.0, LESS);
|
|
Szabolcs Nagy |
e81f47 |
T(tiny, 2*tiny, LESS);
|
|
Szabolcs Nagy |
e81f47 |
T(tiny*0x1p-9, tiny*0x1p-8, LESS);
|
|
Szabolcs Nagy |
e81f47 |
|
|
Szabolcs Nagy |
e81f47 |
T(1.0f, 1.1f, LESS);
|
|
Szabolcs Nagy |
e81f47 |
T(1.0f, 1.0f+epsf, LESS);
|
|
Szabolcs Nagy |
e81f47 |
T(1.0f+epsf, 1.0f, GREATER);
|
|
Szabolcs Nagy |
e81f47 |
T(hugef-1, hugef, EQUAL);
|
|
Szabolcs Nagy |
e81f47 |
T(hugef, hugef*hugef, LESS);
|
|
Szabolcs Nagy |
e81f47 |
T(-0.0f, 0.0f, EQUAL);
|
|
Szabolcs Nagy |
e81f47 |
T(-tinyf, 0.0f, LESS);
|
|
Szabolcs Nagy |
e81f47 |
T(tinyf, 2*tinyf, LESS);
|
|
Szabolcs Nagy |
e81f47 |
T(tinyf*0x1p-9f, tinyf*0x1p-8f, LESS);
|
|
Szabolcs Nagy |
e81f47 |
|
|
Szabolcs Nagy |
e81f47 |
T(1.0L, 1.1L, LESS);
|
|
Szabolcs Nagy |
e81f47 |
T(1.0L, 1.0L+epsl, LESS);
|
|
Szabolcs Nagy |
e81f47 |
T(1.0L+epsl, 1.0L, GREATER);
|
|
Szabolcs Nagy |
e81f47 |
T(hugel-1, hugel, EQUAL);
|
|
Szabolcs Nagy |
e81f47 |
T(hugel, hugel*hugel, LESS);
|
|
Szabolcs Nagy |
e81f47 |
T(-0.0L, 0.0L, EQUAL);
|
|
Szabolcs Nagy |
e81f47 |
T(-tinyl, 0.0L, LESS);
|
|
Szabolcs Nagy |
e81f47 |
T(tinyl, 2*tinyl, LESS);
|
|
Szabolcs Nagy |
e81f47 |
T(tinyl*0x1p-9L, tinyl*0x1p-8L, LESS);
|
|
Szabolcs Nagy |
e81f47 |
|
|
Szabolcs Nagy |
e81f47 |
#if FLT_EVAL_METHOD == 2
|
|
Szabolcs Nagy |
e81f47 |
T(huge*huge, huge*huge*2, LESS);
|
|
Szabolcs Nagy |
e81f47 |
T(tiny*tiny*0.5, tiny*tiny, LESS);
|
|
Szabolcs Nagy |
e81f47 |
T(-tiny*tiny, 0.0, LESS);
|
|
Szabolcs Nagy |
e81f47 |
T(1.0, 1.0+eps*0.25, LESS);
|
|
Szabolcs Nagy |
e81f47 |
#else
|
|
Szabolcs Nagy |
e81f47 |
T(huge*huge, huge*huge*2, EQUAL);
|
|
Szabolcs Nagy |
e81f47 |
T(tiny*tiny*0.5, tiny*tiny, EQUAL);
|
|
Szabolcs Nagy |
e81f47 |
T(-tiny*tiny, 0.0, EQUAL);
|
|
Szabolcs Nagy |
e81f47 |
T(1.0, 1.0+eps*0.25, EQUAL);
|
|
Szabolcs Nagy |
e81f47 |
#endif
|
|
Szabolcs Nagy |
e81f47 |
|
|
Szabolcs Nagy |
e81f47 |
#if FLT_EVAL_METHOD >= 1
|
|
Szabolcs Nagy |
e81f47 |
T(hugef*hugef, hugef*hugef*2, LESS);
|
|
Bobby Bingham |
ec474b |
T(tinyf*tinyf*0.5f, tinyf*tinyf, LESS);
|
|
Bobby Bingham |
ec474b |
T(-tinyf*tinyf, 0.0f, LESS);
|
|
Szabolcs Nagy |
e81f47 |
T(1.0f, 1.0f+epsf*0.25f, LESS);
|
|
Szabolcs Nagy |
e81f47 |
#else
|
|
Szabolcs Nagy |
e81f47 |
T(hugef*hugef, hugef*hugef*2, EQUAL);
|
|
Bobby Bingham |
ec474b |
T(tinyf*tinyf*0.5f, tinyf*tinyf, EQUAL);
|
|
Bobby Bingham |
ec474b |
T(-tinyf*tinyf, 0.0f, EQUAL);
|
|
Szabolcs Nagy |
e81f47 |
T(1.0f, 1.0f+epsf*0.25f, EQUAL);
|
|
Szabolcs Nagy |
e81f47 |
#endif
|
|
Szabolcs Nagy |
e81f47 |
|
|
Szabolcs Nagy |
e81f47 |
T(hugel*hugel, hugel*hugel*2, EQUAL);
|
|
Szabolcs Nagy |
e81f47 |
T(tinyl*tinyl*0.5L, tinyl*tinyl, EQUAL);
|
|
Szabolcs Nagy |
e81f47 |
T(-tinyl*tinyl, 0.0L, EQUAL);
|
|
Szabolcs Nagy |
e81f47 |
T(1.0L, 1.0L+epsl*0.25L, EQUAL);
|
|
Szabolcs Nagy |
e81f47 |
|
|
Szabolcs Nagy |
e81f47 |
return t_status;
|
|
Szabolcs Nagy |
e81f47 |
}
|