|
Szabolcs Nagy |
9d9900 |
// commit: f657fe4b9f734d7fdea515af8dffbf7c28ce4fbc 2013-09-05
|
|
Szabolcs Nagy |
9d9900 |
// classify invalid x86 ld80 representations (this is ub, we follow the fpu)
|
|
Szabolcs Nagy |
7abafc |
// test printf("%La") as well
|
|
Szabolcs Nagy |
9d9900 |
#include <math.h>
|
|
Szabolcs Nagy |
9d9900 |
#include <float.h>
|
|
Szabolcs Nagy |
9d9900 |
#include <stdint.h>
|
|
Szabolcs Nagy |
7abafc |
#include <stdio.h>
|
|
Szabolcs Nagy |
7abafc |
#include <string.h>
|
|
Szabolcs Nagy |
9d9900 |
#include "test.h"
|
|
Szabolcs Nagy |
9d9900 |
|
|
Szabolcs Nagy |
9d9900 |
#if LDBL_MANT_DIG==64
|
|
Szabolcs Nagy |
9d9900 |
static char *strclass(int c)
|
|
Szabolcs Nagy |
9d9900 |
{
|
|
Szabolcs Nagy |
9d9900 |
#define C(n) case n: return #n;
|
|
Szabolcs Nagy |
9d9900 |
switch (c) {
|
|
Szabolcs Nagy |
9d9900 |
C(FP_NAN)
|
|
Szabolcs Nagy |
9d9900 |
C(FP_INFINITE)
|
|
Szabolcs Nagy |
9d9900 |
C(FP_ZERO)
|
|
Szabolcs Nagy |
9d9900 |
C(FP_SUBNORMAL)
|
|
Szabolcs Nagy |
9d9900 |
C(FP_NORMAL)
|
|
Szabolcs Nagy |
9d9900 |
}
|
|
Szabolcs Nagy |
9d9900 |
return "invalid";
|
|
Szabolcs Nagy |
9d9900 |
}
|
|
Szabolcs Nagy |
9d9900 |
|
|
Szabolcs Nagy |
7abafc |
#define T(f, desc, c, cwant, s, swant) do{ \
|
|
Szabolcs Nagy |
7abafc |
c = fpclassify(f); \
|
|
Szabolcs Nagy |
7abafc |
if (c != cwant) \
|
|
Szabolcs Nagy |
7abafc |
t_error("fpclassify(%s) failed: got %s want %s\n", desc, strclass(c), #cwant); \
|
|
Szabolcs Nagy |
7abafc |
memset(s, 0, sizeof(s)); \
|
|
Szabolcs Nagy |
7abafc |
if (snprintf(s, sizeof(s), "%La", f) >= sizeof(s)) \
|
|
Szabolcs Nagy |
7abafc |
t_error("snprintf(\"%%La\", %s) failed with invalid return value\n", desc); \
|
|
Szabolcs Nagy |
7abafc |
if (strcmp(s,swant) != 0) \
|
|
Szabolcs Nagy |
7abafc |
t_error("snprintf(\"%%La\", %s) failed: got \"%.*s\" want %s\n", desc, sizeof(s), s, #swant); \
|
|
Szabolcs Nagy |
9d9900 |
}while(0)
|
|
Szabolcs Nagy |
9d9900 |
|
|
Szabolcs Nagy |
9d9900 |
int main(void)
|
|
Szabolcs Nagy |
9d9900 |
{
|
|
Szabolcs Nagy |
9d9900 |
union {
|
|
Szabolcs Nagy |
9d9900 |
long double f;
|
|
Szabolcs Nagy |
9d9900 |
struct {
|
|
Szabolcs Nagy |
9d9900 |
uint64_t m;
|
|
Szabolcs Nagy |
9d9900 |
uint16_t se;
|
|
Szabolcs Nagy |
9d9900 |
} i;
|
|
Szabolcs Nagy |
9d9900 |
} u;
|
|
Szabolcs Nagy |
9d9900 |
int c;
|
|
Szabolcs Nagy |
7abafc |
int r;
|
|
Szabolcs Nagy |
7abafc |
char s[32];
|
|
Szabolcs Nagy |
9d9900 |
|
|
Szabolcs Nagy |
9d9900 |
u.f = 0;
|
|
Szabolcs Nagy |
9d9900 |
u.i.m = (uint64_t)1<<63;
|
|
Szabolcs Nagy |
7abafc |
T(u.f, "zero with msb set", c, FP_NORMAL, s, "0x1p-16382");
|
|
Szabolcs Nagy |
9d9900 |
u.i.m++;
|
|
Szabolcs Nagy |
7abafc |
T(u.f, "subnormal with msb set", c, FP_NORMAL, s, "0x1.0000000000000002p-16382");
|
|
Szabolcs Nagy |
9d9900 |
u.f=1;
|
|
Szabolcs Nagy |
9d9900 |
u.i.m=0;
|
|
Szabolcs Nagy |
7abafc |
T(u.f, "normal with msb unset", c, FP_NAN, s, "nan");
|
|
Szabolcs Nagy |
9d9900 |
u.f=INFINITY;
|
|
Szabolcs Nagy |
9d9900 |
u.i.m=0;
|
|
Szabolcs Nagy |
7abafc |
T(u.f, "infinity with msb unset", c, FP_NAN, s, "nan");
|
|
Szabolcs Nagy |
9d9900 |
u.f=NAN;
|
|
Szabolcs Nagy |
9d9900 |
u.i.m&=(uint64_t)-1/2;
|
|
Szabolcs Nagy |
7abafc |
T(u.f, "nan with msb unset", c, FP_NAN, s, "nan");
|
|
Szabolcs Nagy |
9d9900 |
return t_status;
|
|
Szabolcs Nagy |
9d9900 |
}
|
|
Szabolcs Nagy |
9d9900 |
#else
|
|
Szabolcs Nagy |
9d9900 |
int main(void)
|
|
Szabolcs Nagy |
9d9900 |
{
|
|
Szabolcs Nagy |
9d9900 |
return 0;
|
|
Szabolcs Nagy |
9d9900 |
}
|
|
Szabolcs Nagy |
9d9900 |
#endif
|