d46b1eedc9dab356612285710bef490a11a00fe8humbedoohlib fpclassify,frexp,frexpl,ldexp,ldexpl,finite,finitel,isinf,isinfl,isnan,isnanl,signbit,copysign,copysignl
FEATURE/isoc99 math.h -lm
tst ast_no_um2fm note{ no unsigned intmax => floatmax cast }end nolink{
unsigned _ast_intmax_t i = 0;
tst ast_mpy_overflow_fpe note{ fpe on mpy overflow }end noexecute{
} while (f != p && ++i < 1024);
tst ast_div_underflow_fpe note{ fpe on div underflow }end noexecute{
} while (f != p && ++i < 1024);
#if !defined(FLT_MIN_EXP) && defined(FMINEXP)
#define FLT_MIN_EXP FMINEXP
#if !defined(FLT_MIN) && defined(MINFLOAT)
#if !defined(FLT_MAX_EXP) && defined(FMAXEXP)
#define FLT_MAX_EXP FMAXEXP
#if !defined(FLT_MAX) && defined(MAXFLOAT)
#if !defined(DBL_MIN_EXP) && defined(DMINEXP)
#define DBL_MIN_EXP DMINEXP
#if !defined(DBL_MIN) && defined(MINDOUBLE)
#define DBL_MIN MINDOUBLE
#if !defined(DBL_MAX_EXP) && defined(DMAXEXP)
#define DBL_MAX_EXP DMAXEXP
#if !defined(DBL_MAX) && defined(MAXDOUBLE)
#define DBL_MAX MAXDOUBLE
<<"#define FLT_DIG">> FLT_DIG
<<"#define FLT_MAX">> FLT_MAX
<<"#ifndef FLT_MAX_10_EXP">>
<<"#define FLT_MAX_10_EXP">> FLT_MAX_10_EXP
<<"#ifndef FLT_MAX_EXP">>
<<"#define FLT_MAX_EXP">> FLT_MAX_EXP
<<"#define FLT_MIN">> FLT_MIN
<<"#ifndef FLT_MIN_10_EXP">>
<<"#define FLT_MIN_10_EXP">> FLT_MIN_10_EXP
<<"#ifndef FLT_MIN_EXP">>
<<"#define FLT_MIN_EXP">> FLT_MIN_EXP
<<"#define DBL_DIG">> DBL_DIG
<<"#define DBL_MAX">> DBL_MAX
<<"#ifndef DBL_MAX_10_EXP">>
<<"#define DBL_MAX_10_EXP">> DBL_MAX_10_EXP
<<"#ifndef DBL_MAX_EXP">>
<<"#define DBL_MAX_EXP">> DBL_MAX_EXP
<<"#define DBL_MIN">> DBL_MIN
<<"#ifndef DBL_MIN_10_EXP">>
<<"#define DBL_MIN_10_EXP">> DBL_MIN_10_EXP
<<"#ifndef DBL_MIN_EXP">>
<<"#define DBL_MIN_EXP">> DBL_MIN_EXP
<<"#define LDBL_DIG">> LDBL_DIG
<<"#define LDBL_MAX">> LDBL_MAX
<<"#ifndef LDBL_MAX_10_EXP">>
<<"#define LDBL_MAX_10_EXP">> LDBL_MAX_10_EXP
<<"#ifndef LDBL_MAX_EXP">>
<<"#define LDBL_MAX_EXP">> LDBL_MAX_EXP
<<"#define LDBL_MIN">> LDBL_MIN
<<"#ifndef LDBL_MIN_10_EXP">>
<<"#define LDBL_MIN_10_EXP">> LDBL_MIN_10_EXP
<<"#ifndef LDBL_MIN_EXP">>
<<"#define LDBL_MIN_EXP">> LDBL_MIN_EXP
tst - note{ missing floating point limits }end output{
static void catch(int sig)
static void catch(sig) int sig;
unsigned _ast_intmax_t w;
unsigned _ast_intmax_t pw;
unsigned _ast_intmax_t x;
unsigned _ast_intmax_t uq;
printf("#define USHRT_DIG %d\n", i);
printf("#define UINT_DIG %d\n", i);
printf("#define ULONG_DIG %d\n", i);
if (sizeof(uq) > sizeof(ul))
printf("#define ULLONG_DIG %d\n", i);
printf("#define UINTMAX_DIG ULLONG_DIG\n");
printf("#define UINTMAX_DIG ULONG_DIG\n");
} while (w > pw && w == x);
printf("#define FLT_ULONG_MAX %lu.0F\n", u);
if (sizeof(w) > sizeof(u))
printf("#define FLT_ULLONG_MAX %llu.0F\n", w);
printf("#define FLT_UINTMAX_MAX FLT_ULLONG_MAX\n");
printf("#define FLT_ULLONG_MAX FLT_ULONG_MAX\n");
printf("#define FLT_UINTMAX_MAX FLT_ULONG_MAX\n");
printf("#define FLT_LONG_MAX %lu.0F\n", u);
if (sizeof(w) > sizeof(u))
printf("#define FLT_LLONG_MAX %llu.0F\n", w);
printf("#define FLT_INTMAX_MAX FLT_LLONG_MAX\n");
printf("#define FLT_LLONG_MAX FLT_LONG_MAX\n");
printf("#define FLT_INTMAX_MAX FLT_LONG_MAX\n");
printf("#define FLT_LONG_MIN (-%lu.0F)\n", u);
if (sizeof(w) > sizeof(u))
printf("#define FLT_LLONG_MIN (-%llu.0F)\n", w);
printf("#define FLT_INTMAX_MIN FLT_LLONG_MIN\n");
printf("#define FLT_LLONG_MIN FLT_LONG_MIN\n");
printf("#define FLT_INTMAX_MIN FLT_LONG_MIN\n");
#if defined(FLT_MIN) && defined(FLT_MIN_EXP)
printf("#ifndef FLT_DIG\n");
printf("#define FLT_DIG %d\n", s);
printf("#ifndef FLT_MIN\n");
printf("#define FLT_MIN %.*E%s\n", s + 1, mf, fs);
printf("#ifndef FLT_MIN_EXP\n");
printf("#define FLT_MIN_EXP (%d)\n", i);
#if defined(FLT_MAX) && defined(FLT_MAX_EXP)
} while (mf == (mf + f));
printf("#ifndef FLT_MAX\n");
printf("#define FLT_MAX %.*E%s\n", s + 1, f, fs);
printf("#ifndef FLT_MAX_EXP\n");
printf("#define FLT_MAX_EXP %d\n", i);
printf("#ifndef FLT_MIN_10_EXP\n");
printf("#define FLT_MIN_10_EXP (%d)\n", i);
printf("#ifndef FLT_MAX_10_EXP\n");
printf("#define FLT_MAX_10_EXP %d\n", i);
} while (w > pw && w == x);
printf("#define DBL_ULONG_MAX %lu.0\n", u);
if (sizeof(w) > sizeof(u))
printf("#define DBL_ULLONG_MAX %llu.0\n", w);
printf("#define DBL_UINTMAX_MAX DBL_ULLONG_MAX\n");
printf("#define DBL_ULLONG_MAX DBL_ULONG_MAX\n");
printf("#define DBL_UINTMAX_MAX DBL_ULONG_MAX\n");
printf("#define DBL_LONG_MAX %lu.0\n", u);
if (sizeof(w) > sizeof(u))
printf("#define DBL_LLONG_MAX %llu.0\n", w);
printf("#define DBL_INTMAX_MAX DBL_LLONG_MAX\n");
printf("#define DBL_LLONG_MAX DBL_LONG_MAX\n");
printf("#define DBL_INTMAX_MAX DBL_LONG_MAX\n");
printf("#define DBL_LONG_MIN (-%lu.0)\n", u);
if (sizeof(w) > sizeof(u))
printf("#define DBL_LLONG_MIN (-%llu.0)\n", w);
printf("#define DBL_INTMAX_MIN DBL_LLONG_MIN\n");
printf("#define DBL_LLONG_MIN DBL_LONG_MIN\n");
printf("#define DBL_INTMAX_MIN DBL_LONG_MIN\n");
#if defined(DBL_MIN) && defined(DBL_MIN_EXP)
printf("#ifndef DBL_DIG\n");
printf("#define DBL_DIG %d\n", s);
printf("#ifndef DBL_MIN\n");
printf("#define DBL_MIN %.*E%s\n", s + 1, md, ds);
printf("#ifndef DBL_MIN_EXP\n");
printf("#define DBL_MIN_EXP (%d)\n", i);
#if defined(DBL_MAX) && defined(DBL_MAX_EXP)
} while (md == (md + d));
printf("#ifndef DBL_MAX\n");
printf("#define DBL_MAX %.*E%s\n", s + 1, d, ds);
printf("#ifndef DBL_MAX_EXP\n");
printf("#define DBL_MAX_EXP %d\n", i);
printf("#ifndef DBL_MIN_10_EXP\n");
printf("#define DBL_MIN_10_EXP (%d)\n", i);
printf("#ifndef DBL_MAX_10_EXP\n");
printf("#define DBL_MAX_10_EXP %d\n", i);
} while (w > pw && w == x);
printf("#define LDBL_ULONG_MAX %lu.0L\n", u);
if (sizeof(w) > sizeof(u))
printf("#define LDBL_ULLONG_MAX %llu.0L\n", w);
printf("#define LDBL_UINTMAX_MAX LDBL_ULLONG_MAX\n");
printf("#define LDBL_ULLONG_MAX LDBL_ULONG_MAX\n");
printf("#define LDBL_UINTMAX_MAX LDBL_ULONG_MAX\n");
printf("#define LDBL_LONG_MAX %lu.0L\n", u);
if (sizeof(w) > sizeof(u))
printf("#define LDBL_LLONG_MAX %llu.0L\n", w);
printf("#define LDBL_INTMAX_MAX LDBL_LLONG_MAX\n");
printf("#define LDBL_LLONG_MAX LDBL_LONG_MAX\n");
printf("#define LDBL_INTMAX_MAX LDBL_LONG_MAX\n");
printf("#define LDBL_LONG_MIN (-%lu.0L)\n", u);
if (sizeof(w) > sizeof(u))
printf("#define LDBL_LLONG_MIN (-%llu.0L)\n", w);
printf("#define LDBL_INTMAX_MIN LDBL_LLONG_MIN\n");
printf("#define LDBL_LLONG_MIN LDBL_LONG_MIN\n");
printf("#define LDBL_INTMAX_MIN LDBL_LONG_MIN\n");
#if defined(LDBL_MIN) && defined(LDBL_MIN_EXP)
printf("#ifndef LDBL_DIG\n");
printf("#define LDBL_DIG %d\n", s);
printf("#ifndef LDBL_MIN\n");
printf("#define LDBL_MIN %.*LE%s\n", s + 1, ml, ls);
printf("#ifndef LDBL_MIN_EXP\n");
printf("#define LDBL_MIN_EXP (%d)\n", i);
#if defined(LDBL_MAX) && defined(LDBL_MAX_EXP)
} while (ml == (ml + l));
printf("#ifndef LDBL_MAX\n");
printf("#define LDBL_MAX %.*LE%s\n", s + 1, l, ls);
printf("#ifndef LDBL_MAX_EXP\n");
printf("#define LDBL_MAX_EXP %d\n", i);
printf("#ifndef LDBL_MIN_10_EXP\n");
printf("#define LDBL_MIN_10_EXP (%d)\n", i);
printf("#ifndef LDBL_MAX_10_EXP\n");
printf("#define LDBL_MAX_10_EXP %d\n", i);
printf("#define FLTMAX_UINTMAX_MAX %s_UINTMAX_MAX\n", fp);
printf("#define FLTMAX_INTMAX_MAX %s_INTMAX_MAX\n", fp);
printf("#define FLTMAX_INTMAX_MIN %s_INTMAX_MIN\n", fp);
printf("\n#define _ast_fltsig %d\n", SIGFPE);
printf("extern double frexp(double, int*);\n");
printf("extern _ast_fltmax_t frexpl(_ast_fltmax_t, int*);\n");
printf("extern double ldexp(double, int);\n");
printf("extern _ast_fltmax_t ldexpl(_ast_fltmax_t, int);\n");
tst - note{ double exponent bitfoolery }end output{
unsigned _ast_int4_t e[sizeof(double) / 4];
for (i = 0; i < sizeof(
a.e) / sizeof(
a.e[0]); i++)
for (j = i + 1; j < sizeof(
a.e) / sizeof(
a.e[0]); j++)
printf("typedef union _ast_dbl_exp_u\n{\n\tuint32_t\t\te[sizeof(double)/4];\n\tdouble\t\t\tf;\n} _ast_dbl_exp_t;\n\n");
printf("#define _ast_dbl_exp_index %d\n", i);
for (i = 0; !(e & 1); e >>= 1, i++);
printf("#define _ast_dbl_exp_shift %d\n\n", i);
tst - note{ long double exponent bitfoolery }end output{
typedef union _ast_fltmax_exp_u
unsigned _ast_int4_t e[sizeof(_ast_fltmax_t) / 4];
for (i = 0; i < sizeof(
a.e) / sizeof(
a.e[0]); i++)
for (j = i + 1; j < sizeof(
a.e) / sizeof(
a.e[0]); j++)
printf("typedef union _fltmax_exp_u\n{\n\tuint32_t\t\te[sizeof(_ast_fltmax_t)/4];\n\t_ast_fltmax_t\t\tf;\n} _ast_fltmax_exp_t;\n\n");
printf("#define _ast_fltmax_exp_index\t%d\n", i);
for (i = 0; !(e & 1); e >>= 1, i++);
printf("#define _ast_fltmax_exp_shift\t%d\n\n", i);
tst - -DN=1 - -DN=2 note{ _ast_fltmax_t maximum integral type }end output{
printf("#define _ast_flt_unsigned_max_t unsigned long long\n");
printf("#define _ast_flt_unsigned_max_t unsigned long\n");
tst - -DSCAN=1 - -lm -DSTRTO=1 - -DMAC=1 - -DDIV=1 - -DEXP=1 - -DADD=1 - -DMPY=1 note{ INF and NAN memory representations }end output{
#define _AIX_COMPATIBILITY 1
#define _FP_MODE_VARIABLE 1
#if !defined(FLT_MAX) && defined(MAXFLOAT)
#if !defined(DBL_MAX) && defined(MAXDOUBLE)
#define DBL_MAX MAXDOUBLE
list(const char* typ, const char* var, void* val, int siz)
register unsigned char* u = (unsigned char*)val;
register unsigned char* e = u + siz;
printf("#define _ast_%s_%s_init\t0x%02x", typ, var, *u);
if (sscanf(NAN, "%g", &f) != 1)
list("flt", "nan", &f, sizeof(f));
if (sscanf(INF, "%g", &f) != 1)
list("flt", "inf", &f, sizeof(f));
if (sscanf(NAN, "%lg", &f) != 1)
list("dbl", "nan", &f, sizeof(f));
if (sscanf(INF, "%lg", &f) != 1)
list("dbl", "inf", &f, sizeof(f));
if (sscanf(NAN, "%Lg", &f) != 1)
list("ldbl", "nan", &f, sizeof(f));
if (sscanf(INF, "%Lg", &f) != 1)
list("ldbl", "inf", &f, sizeof(f));
list("flt", "nan", &f, sizeof(f));
list("flt", "inf", &f, sizeof(f));
list("flt", "nan", &f, sizeof(f));
list("flt", "inf", &f, sizeof(f));
list("dbl", "nan", &f, sizeof(f));
list("dbl", "inf", &f, sizeof(f));
list("dbl", "nan", &f, sizeof(f));
list("dbl", "inf", &f, sizeof(f));
long double f = LDBL_MAX;
list("ldbl", "nan", &f, sizeof(f));
list("ldbl", "inf", &f, sizeof(f));
list("ldbl", "nan", &f, sizeof(f));
list("ldbl", "inf", &f, sizeof(f));