|
Szabolcs Nagy |
47d0dd |
#include <stdio.h>
|
|
Szabolcs Nagy |
47d0dd |
#include <math.h>
|
|
Szabolcs Nagy |
47d0dd |
|
|
Szabolcs Nagy |
47d0dd |
#define T(a,b) {__LINE__, a, b},
|
|
Szabolcs Nagy |
47d0dd |
#define length(a) (sizeof(a)/sizeof*(a))
|
|
Szabolcs Nagy |
47d0dd |
|
|
Szabolcs Nagy |
47d0dd |
static struct {
|
|
Szabolcs Nagy |
47d0dd |
int line;
|
|
Szabolcs Nagy |
47d0dd |
float f;
|
|
Szabolcs Nagy |
47d0dd |
int class;
|
|
Szabolcs Nagy |
47d0dd |
} tf[] = {
|
|
Szabolcs Nagy |
47d0dd |
T(0.0/0.0, FP_NAN)
|
|
Szabolcs Nagy |
47d0dd |
T(-0.0/0.0, FP_NAN)
|
|
Szabolcs Nagy |
47d0dd |
T(1/0.0, FP_INFINITE)
|
|
Szabolcs Nagy |
47d0dd |
T(-1/0.0, FP_INFINITE)
|
|
Szabolcs Nagy |
47d0dd |
T(0x1.ffffp127, FP_NORMAL)
|
|
Szabolcs Nagy |
47d0dd |
T(-0x1.ffffp127, FP_NORMAL)
|
|
Szabolcs Nagy |
47d0dd |
T(0x1p-127, FP_SUBNORMAL)
|
|
Szabolcs Nagy |
47d0dd |
T(-0x1p-127, FP_SUBNORMAL)
|
|
Szabolcs Nagy |
47d0dd |
T(0.0, FP_ZERO)
|
|
Szabolcs Nagy |
47d0dd |
T(-0.0, FP_ZERO)
|
|
Szabolcs Nagy |
47d0dd |
T(3.14, FP_NORMAL)
|
|
Szabolcs Nagy |
47d0dd |
T(-42, FP_NORMAL)
|
|
Szabolcs Nagy |
47d0dd |
};
|
|
Szabolcs Nagy |
47d0dd |
|
|
Szabolcs Nagy |
47d0dd |
static struct {
|
|
Szabolcs Nagy |
47d0dd |
int line;
|
|
Szabolcs Nagy |
47d0dd |
double f;
|
|
Szabolcs Nagy |
47d0dd |
int class;
|
|
Szabolcs Nagy |
47d0dd |
} td[] = {
|
|
Szabolcs Nagy |
47d0dd |
T(0.0/0.0, FP_NAN)
|
|
Szabolcs Nagy |
47d0dd |
T(-0.0/0.0, FP_NAN)
|
|
Szabolcs Nagy |
47d0dd |
T(1/0.0, FP_INFINITE)
|
|
Szabolcs Nagy |
47d0dd |
T(-1/0.0, FP_INFINITE)
|
|
Szabolcs Nagy |
47d0dd |
T(0x1.ffffp1023, FP_NORMAL)
|
|
Szabolcs Nagy |
47d0dd |
T(-0x1.ffffp1023, FP_NORMAL)
|
|
Szabolcs Nagy |
47d0dd |
T(0x1p-1023, FP_SUBNORMAL)
|
|
Szabolcs Nagy |
47d0dd |
T(-0x1p-1023, FP_SUBNORMAL)
|
|
Szabolcs Nagy |
47d0dd |
T(0.0, FP_ZERO)
|
|
Szabolcs Nagy |
47d0dd |
T(-0.0, FP_ZERO)
|
|
Szabolcs Nagy |
47d0dd |
T(3.14, FP_NORMAL)
|
|
Szabolcs Nagy |
47d0dd |
T(-42, FP_NORMAL)
|
|
Szabolcs Nagy |
47d0dd |
};
|
|
Szabolcs Nagy |
47d0dd |
|
|
Szabolcs Nagy |
47d0dd |
static struct {
|
|
Szabolcs Nagy |
47d0dd |
int line;
|
|
Szabolcs Nagy |
47d0dd |
long double f;
|
|
Szabolcs Nagy |
47d0dd |
int class;
|
|
Szabolcs Nagy |
47d0dd |
} tl[] = {
|
|
Szabolcs Nagy |
47d0dd |
T(0.0/0.0, FP_NAN)
|
|
Szabolcs Nagy |
47d0dd |
T(-0.0/0.0, FP_NAN)
|
|
Szabolcs Nagy |
47d0dd |
T(1/0.0, FP_INFINITE)
|
|
Szabolcs Nagy |
47d0dd |
T(-1/0.0, FP_INFINITE)
|
|
Szabolcs Nagy |
e444a9 |
#if LDBL_MAX_EXP==16384
|
|
Szabolcs Nagy |
47d0dd |
T(0x1.ffffp16383L, FP_NORMAL)
|
|
Szabolcs Nagy |
47d0dd |
T(-0x1.ffffp16383L, FP_NORMAL)
|
|
Szabolcs Nagy |
47d0dd |
T(0x1p-16383L, FP_SUBNORMAL)
|
|
Szabolcs Nagy |
47d0dd |
T(-0x1p-16383L, FP_SUBNORMAL)
|
|
Szabolcs Nagy |
e444a9 |
#elif LDBL_MAX_EXP==1024
|
|
Szabolcs Nagy |
e444a9 |
T(0x1.ffffp1023L, FP_NORMAL)
|
|
Szabolcs Nagy |
e444a9 |
T(-0x1.ffffp1023L, FP_NORMAL)
|
|
Szabolcs Nagy |
e444a9 |
T(0x1p-1023L, FP_SUBNORMAL)
|
|
Szabolcs Nagy |
e444a9 |
T(-0x1p-1023L, FP_SUBNORMAL)
|
|
Szabolcs Nagy |
e444a9 |
#endif
|
|
Szabolcs Nagy |
47d0dd |
T(0.0, FP_ZERO)
|
|
Szabolcs Nagy |
47d0dd |
T(-0.0, FP_ZERO)
|
|
Szabolcs Nagy |
47d0dd |
T(3.14, FP_NORMAL)
|
|
Szabolcs Nagy |
47d0dd |
T(-42, FP_NORMAL)
|
|
Szabolcs Nagy |
47d0dd |
};
|
|
Szabolcs Nagy |
47d0dd |
|
|
Szabolcs Nagy |
47d0dd |
static char *strclass(int c)
|
|
Szabolcs Nagy |
47d0dd |
{
|
|
Szabolcs Nagy |
47d0dd |
#define C(n) case n: return #n;
|
|
Szabolcs Nagy |
47d0dd |
switch (c) {
|
|
Szabolcs Nagy |
47d0dd |
C(FP_NAN)
|
|
Szabolcs Nagy |
47d0dd |
C(FP_INFINITE)
|
|
Szabolcs Nagy |
47d0dd |
C(FP_ZERO)
|
|
Szabolcs Nagy |
47d0dd |
C(FP_SUBNORMAL)
|
|
Szabolcs Nagy |
47d0dd |
C(FP_NORMAL)
|
|
Szabolcs Nagy |
47d0dd |
}
|
|
Szabolcs Nagy |
47d0dd |
return "invalid";
|
|
Szabolcs Nagy |
47d0dd |
}
|
|
Szabolcs Nagy |
47d0dd |
|
|
Szabolcs Nagy |
47d0dd |
#define error(t,c) err++, printf("%s:%d: (at line %d) %La has class %d (%s), but %s returns %d\n", \
|
|
Szabolcs Nagy |
47d0dd |
__FILE__, __LINE__, t.line, (long double)t.f, t.class, strclass(t.class), #c, c(t.f))
|
|
Szabolcs Nagy |
47d0dd |
|
|
Szabolcs Nagy |
47d0dd |
int main()
|
|
Szabolcs Nagy |
47d0dd |
{
|
|
Szabolcs Nagy |
47d0dd |
int i;
|
|
Szabolcs Nagy |
47d0dd |
int err = 0;
|
|
Szabolcs Nagy |
47d0dd |
|
|
Szabolcs Nagy |
47d0dd |
for (i = 0; i < length(tf); i++) {
|
|
Szabolcs Nagy |
47d0dd |
if (fpclassify(tf[i].f) != tf[i].class)
|
|
Szabolcs Nagy |
47d0dd |
error(tf[i], fpclassify);
|
|
Szabolcs Nagy |
47d0dd |
if (!!isinf(tf[i].f) != (tf[i].class == FP_INFINITE))
|
|
Szabolcs Nagy |
47d0dd |
error(tf[i], isinf);
|
|
Szabolcs Nagy |
47d0dd |
if (!!isnan(tf[i].f) != (tf[i].class == FP_NAN))
|
|
Szabolcs Nagy |
47d0dd |
error(tf[i], isnan);
|
|
Szabolcs Nagy |
47d0dd |
if (!!isnormal(tf[i].f) != (tf[i].class == FP_NORMAL))
|
|
Szabolcs Nagy |
47d0dd |
error(tf[i], isnormal);
|
|
Szabolcs Nagy |
47d0dd |
if (!!isfinite(tf[i].f) != (tf[i].class > FP_INFINITE))
|
|
Szabolcs Nagy |
47d0dd |
error(tf[i], isfinite);
|
|
Szabolcs Nagy |
47d0dd |
}
|
|
Szabolcs Nagy |
47d0dd |
|
|
Szabolcs Nagy |
47d0dd |
for (i = 0; i < length(td); i++) {
|
|
Szabolcs Nagy |
47d0dd |
if (fpclassify(td[i].f) != td[i].class)
|
|
Szabolcs Nagy |
47d0dd |
error(td[i], fpclassify);
|
|
Szabolcs Nagy |
47d0dd |
if (!!isinf(td[i].f) != (td[i].class == FP_INFINITE))
|
|
Szabolcs Nagy |
47d0dd |
error(td[i], isinf);
|
|
Szabolcs Nagy |
47d0dd |
if (!!isnan(td[i].f) != (td[i].class == FP_NAN))
|
|
Szabolcs Nagy |
47d0dd |
error(td[i], isnan);
|
|
Szabolcs Nagy |
47d0dd |
if (!!isnormal(td[i].f) != (td[i].class == FP_NORMAL))
|
|
Szabolcs Nagy |
47d0dd |
error(td[i], isnormal);
|
|
Szabolcs Nagy |
47d0dd |
if (!!isfinite(td[i].f) != (td[i].class > FP_INFINITE))
|
|
Szabolcs Nagy |
47d0dd |
error(td[i], isfinite);
|
|
Szabolcs Nagy |
47d0dd |
}
|
|
Szabolcs Nagy |
47d0dd |
|
|
Szabolcs Nagy |
47d0dd |
for (i = 0; i < length(tl); i++) {
|
|
Szabolcs Nagy |
47d0dd |
if (fpclassify(tl[i].f) != tl[i].class)
|
|
Szabolcs Nagy |
47d0dd |
error(tl[i], fpclassify);
|
|
Szabolcs Nagy |
47d0dd |
if (!!isinf(tl[i].f) != (tl[i].class == FP_INFINITE))
|
|
Szabolcs Nagy |
47d0dd |
error(tl[i], isinf);
|
|
Szabolcs Nagy |
47d0dd |
if (!!isnan(tl[i].f) != (tl[i].class == FP_NAN))
|
|
Szabolcs Nagy |
47d0dd |
error(tl[i], isnan);
|
|
Szabolcs Nagy |
47d0dd |
if (!!isnormal(tl[i].f) != (tl[i].class == FP_NORMAL))
|
|
Szabolcs Nagy |
47d0dd |
error(tl[i], isnormal);
|
|
Szabolcs Nagy |
47d0dd |
if (!!isfinite(tl[i].f) != (tl[i].class > FP_INFINITE))
|
|
Szabolcs Nagy |
47d0dd |
error(tl[i], isfinite);
|
|
Szabolcs Nagy |
47d0dd |
}
|
|
Szabolcs Nagy |
47d0dd |
|
|
Szabolcs Nagy |
47d0dd |
return !!err;
|
|
Szabolcs Nagy |
47d0dd |
}
|