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