set prototyped set nooptimize set stdio FEATURE/isoc99 hdr float,limits,math,values lib 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{ #include "FEATURE/common" int main() { _ast_fltmax_t f = 0; unsigned _ast_intmax_t i = 0; f = i; i = f; return f == i; } }end tst ast_mpy_overflow_fpe note{ fpe on mpy overflow }end noexecute{ int main() { float f; float p; int i; i = 0; p = f = 1.0; do { p = f; f *= 2.0; } while (f != p && ++i < 1024); return 0; } }end tst ast_div_underflow_fpe note{ fpe on div underflow }end noexecute{ int main() { float f; float p; int i; i = 0; p = f = 1.0; do { p = f; f /= 2.0; } while (f != p && ++i < 1024); return 0; } }end macro{ #if _hdr_float #include #endif #if _hdr_limits #include #endif #if _hdr_math #include #endif #if _hdr_values #include #endif #if !defined(FLT_MIN_EXP) && defined(FMINEXP) #define FLT_MIN_EXP FMINEXP #endif #if !defined(FLT_MIN) && defined(MINFLOAT) #define FLT_MIN MINFLOAT #endif #if !defined(FLT_MAX_EXP) && defined(FMAXEXP) #define FLT_MAX_EXP FMAXEXP #endif #if !defined(FLT_MAX) && defined(MAXFLOAT) #define FLT_MAX MAXFLOAT #endif #if !defined(DBL_MIN_EXP) && defined(DMINEXP) #define DBL_MIN_EXP DMINEXP #endif #if !defined(DBL_MIN) && defined(MINDOUBLE) #define DBL_MIN MINDOUBLE #endif #if !defined(DBL_MAX_EXP) && defined(DMAXEXP) #define DBL_MAX_EXP DMAXEXP #endif #if !defined(DBL_MAX) && defined(MAXDOUBLE) #define DBL_MAX MAXDOUBLE #endif <<"#include ">> #if _hdr_float <<"#include ">> #endif #if _hdr_math <<"#include ">> #endif #ifdef FLT_DIG <<"#ifndef FLT_DIG">> <<"#define FLT_DIG">> FLT_DIG <<"#endif">> #endif #ifdef FLT_MAX <<"#ifndef FLT_MAX">> <<"#define FLT_MAX">> FLT_MAX <<"#endif">> #endif #ifdef FLT_MAX_10_EXP <<"#ifndef FLT_MAX_10_EXP">> <<"#define FLT_MAX_10_EXP">> FLT_MAX_10_EXP <<"#endif">> #endif #ifdef FLT_MAX_EXP <<"#ifndef FLT_MAX_EXP">> <<"#define FLT_MAX_EXP">> FLT_MAX_EXP <<"#endif">> #endif #ifdef FLT_MIN <<"#ifndef FLT_MIN">> <<"#define FLT_MIN">> FLT_MIN <<"#endif">> #endif #ifdef FLT_MIN_10_EXP <<"#ifndef FLT_MIN_10_EXP">> <<"#define FLT_MIN_10_EXP">> FLT_MIN_10_EXP <<"#endif">> #endif #ifdef FLT_MIN_EXP <<"#ifndef FLT_MIN_EXP">> <<"#define FLT_MIN_EXP">> FLT_MIN_EXP <<"#endif">> #endif #ifdef DBL_DIG <<"#ifndef DBL_DIG">> <<"#define DBL_DIG">> DBL_DIG <<"#endif">> #endif #ifdef DBL_MAX <<"#ifndef DBL_MAX">> <<"#define DBL_MAX">> DBL_MAX <<"#endif">> #endif #ifdef DBL_MAX_10_EXP <<"#ifndef DBL_MAX_10_EXP">> <<"#define DBL_MAX_10_EXP">> DBL_MAX_10_EXP <<"#endif">> #endif #ifdef DBL_MAX_EXP <<"#ifndef DBL_MAX_EXP">> <<"#define DBL_MAX_EXP">> DBL_MAX_EXP <<"#endif">> #endif #ifdef DBL_MIN <<"#ifndef DBL_MIN">> <<"#define DBL_MIN">> DBL_MIN <<"#endif">> #endif #ifdef DBL_MIN_10_EXP <<"#ifndef DBL_MIN_10_EXP">> <<"#define DBL_MIN_10_EXP">> DBL_MIN_10_EXP <<"#endif">> #endif #ifdef DBL_MIN_EXP <<"#ifndef DBL_MIN_EXP">> <<"#define DBL_MIN_EXP">> DBL_MIN_EXP <<"#endif">> #endif #ifdef LDBL_DIG <<"#ifndef LDBL_DIG">> <<"#define LDBL_DIG">> LDBL_DIG <<"#endif">> #endif #ifdef LDBL_MAX <<"#ifndef LDBL_MAX">> <<"#define LDBL_MAX">> LDBL_MAX <<"#endif">> #endif #ifdef LDBL_MAX_10_EXP <<"#ifndef LDBL_MAX_10_EXP">> <<"#define LDBL_MAX_10_EXP">> LDBL_MAX_10_EXP <<"#endif">> #endif #ifdef LDBL_MAX_EXP <<"#ifndef LDBL_MAX_EXP">> <<"#define LDBL_MAX_EXP">> LDBL_MAX_EXP <<"#endif">> #endif #ifdef LDBL_MIN <<"#ifndef LDBL_MIN">> <<"#define LDBL_MIN">> LDBL_MIN <<"#endif">> #endif #ifdef LDBL_MIN_10_EXP <<"#ifndef LDBL_MIN_10_EXP">> <<"#define LDBL_MIN_10_EXP">> LDBL_MIN_10_EXP <<"#endif">> #endif #ifdef LDBL_MIN_EXP <<"#ifndef LDBL_MIN_EXP">> <<"#define LDBL_MIN_EXP">> LDBL_MIN_EXP <<"#endif">> #endif }end tst - note{ missing floating point limits }end output{ #include "FEATURE/common" #include #if _hdr_float #include #endif #if _hdr_limits #include #endif #if _hdr_math #include #endif #if _hdr_values #include #endif #include #ifdef SIGFPE static int caught = 0; #if _STD_ static void catch(int sig) #else static void catch(sig) int sig; #endif { signal(sig, SIG_IGN); caught++; } #endif int main() { register int i; register int s; float f; float pf; float mf; float xf; double d; double pd; double md; char* fp; #if _ast_fltmax_double char* fs = ""; char* ds = ""; #else _ast_fltmax_t l; _ast_fltmax_t pl; _ast_fltmax_t ml; char* fs = "F"; char* ds = ""; char* ls = "L"; #endif unsigned long u; unsigned _ast_intmax_t w; unsigned _ast_intmax_t pw; unsigned _ast_intmax_t x; unsigned short us; unsigned int ui; unsigned long ul; unsigned _ast_intmax_t uq; #ifdef SIGFPE signal(SIGFPE, catch); #endif printf("\n"); printf("\n"); us = 0; us = ~us; i = 0; while (us /= 10) i++; printf("#define USHRT_DIG %d\n", i); ui = 0; ui = ~ui; i = 0; while (ui /= 10) i++; printf("#define UINT_DIG %d\n", i); ul = 0; ul = ~ul; i = 0; while (ul /= 10) i++; printf("#define ULONG_DIG %d\n", i); if (sizeof(uq) > sizeof(ul)) { uq = 0; uq = ~uq; i = 0; while (uq /= 10) i++; printf("#define ULLONG_DIG %d\n", i); printf("#define UINTMAX_DIG ULLONG_DIG\n"); } else printf("#define UINTMAX_DIG ULONG_DIG\n"); printf("\n"); w = 1; do { pw = w; w *= 2; f = (_ast_intmax_t)w; x = (_ast_intmax_t)f; } while (w > pw && w == x); w = (pw - 1) + pw; u = ~0; if (u > w) u = w; 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"); } else { printf("#define FLT_ULLONG_MAX FLT_ULONG_MAX\n"); printf("#define FLT_UINTMAX_MAX FLT_ULONG_MAX\n"); } u /= 2; w /= 2; 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"); } else { printf("#define FLT_LLONG_MAX FLT_LONG_MAX\n"); printf("#define FLT_INTMAX_MAX FLT_LONG_MAX\n"); } u++; w++; 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"); } else { printf("#define FLT_LLONG_MIN FLT_LONG_MIN\n"); printf("#define FLT_INTMAX_MIN FLT_LONG_MIN\n"); } #ifdef FLT_DIG s = FLT_DIG; #else f = pf = 1.0; s = -1; do { s++; f *= 10.0; } while (f != (f + pf)); #endif #if defined(FLT_MIN) && defined(FLT_MIN_EXP) i = FLT_MIN_EXP; mf = FLT_MIN; #else i = 3; f = pf = 1.0; do { i--; mf = pf; pf = f; f /= 2.0; } while (f < pf); #ifdef FLT_MIN_EXP i = FLT_MIN_EXP; #endif #ifdef FLT_MIN mf = FLT_MIN; #endif #endif #ifndef FLT_DIG printf("#ifndef FLT_DIG\n"); printf("#define FLT_DIG %d\n", s); printf("#endif\n"); #endif #ifndef FLT_MIN printf("#ifndef FLT_MIN\n"); printf("#define FLT_MIN %.*E%s\n", s + 1, mf, fs); printf("#endif\n"); #endif #ifndef FLT_MIN_EXP printf("#ifndef FLT_MIN_EXP\n"); printf("#define FLT_MIN_EXP (%d)\n", i); printf("#endif\n"); #endif #if defined(FLT_MAX) && defined(FLT_MAX_EXP) i = FLT_MAX_EXP; f = FLT_MAX; #else i = -1; f = pf = 1.0; do { i++; mf = pf; pf = f; f *= 2.0; } while (f > pf); #ifdef FLT_MAX_EXP i = FLT_MAX_EXP; #endif #ifdef FLT_MAX f = FLT_MAX; #endif #endif #ifdef FLT_MAX_EXP i = FLT_MAX_EXP; #else f = 1; do { f *= 2.0; } while (mf == (mf + f)); f = (mf - f) * 2.0 + f; #endif xf = f; #ifndef FLT_MAX printf("#ifndef FLT_MAX\n"); printf("#define FLT_MAX %.*E%s\n", s + 1, f, fs); printf("#endif\n"); #endif #ifndef FLT_MAX_EXP printf("#ifndef FLT_MAX_EXP\n"); printf("#define FLT_MAX_EXP %d\n", i); printf("#endif\n"); #endif #ifdef FLT_MIN_10_EXP i = FLT_MIN_10_EXP; #else i = 2; f = 1.0; do { i--; pf = f; f /= 10.0; } while (f < pf); #endif #ifndef FLT_MIN_10_EXP printf("#ifndef FLT_MIN_10_EXP\n"); printf("#define FLT_MIN_10_EXP (%d)\n", i); printf("#endif\n"); #endif #ifdef FLT_MAX_10_EXP i = FLT_MAX_10_EXP; #else i = -2; f = 1.0; do { i++; pf = f; f *= 10.0; } while (f > pf); #endif #ifndef FLT_MAX_10_EXP printf("#ifndef FLT_MAX_10_EXP\n"); printf("#define FLT_MAX_10_EXP %d\n", i); printf("#endif\n"); #endif printf("\n"); w = 1; do { pw = w; w *= 2; d = (_ast_intmax_t)w; x = (_ast_intmax_t)d; } while (w > pw && w == x); w = (pw - 1) + pw; u = ~0; if (u > w) u = w; 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"); } else { printf("#define DBL_ULLONG_MAX DBL_ULONG_MAX\n"); printf("#define DBL_UINTMAX_MAX DBL_ULONG_MAX\n"); } u /= 2; w /= 2; 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"); } else { printf("#define DBL_LLONG_MAX DBL_LONG_MAX\n"); printf("#define DBL_INTMAX_MAX DBL_LONG_MAX\n"); } u++; w++; 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"); } else { printf("#define DBL_LLONG_MIN DBL_LONG_MIN\n"); printf("#define DBL_INTMAX_MIN DBL_LONG_MIN\n"); } #ifdef DBL_DIG s = DBL_DIG; #else d = pd = 1.0; s = -1; do { s++; d *= 10.0; } while (d != (d + pd)); #endif #if defined(DBL_MIN) && defined(DBL_MIN_EXP) i = DBL_MIN_EXP; md = DBL_MIN; #else i = 3; d = pd = 1.0; do { i--; md = pd; pd = d; d /= 2.0; } while (d < pd); #ifdef DBL_MIN_EXP i = DBL_MIN_EXP; #endif #ifdef DBL_MIN md = DBL_MIN; #endif #endif #ifndef DBL_DIG printf("#ifndef DBL_DIG\n"); printf("#define DBL_DIG %d\n", s); printf("#endif\n"); #endif #ifndef DBL_MIN printf("#ifndef DBL_MIN\n"); printf("#define DBL_MIN %.*E%s\n", s + 1, md, ds); printf("#endif\n"); #endif #ifndef DBL_MIN_EXP printf("#ifndef DBL_MIN_EXP\n"); printf("#define DBL_MIN_EXP (%d)\n", i); printf("#endif\n"); #endif #if defined(DBL_MAX) && defined(DBL_MAX_EXP) i = DBL_MAX_EXP; d = DBL_MAX; #else i = -1; d = pd = 1.0; do { i++; md = pd; pd = d; d *= 2.0; } while (d > pd); d = 1.0; do { d *= 2.0; } while (md == (md + d)); d = (md - d) * 2.0 + d; #ifdef DBL_MAX_EXP i = DBL_MAX_EXP; #endif #ifdef DBL_MAX d = DBL_MAX; #endif #endif #ifndef DBL_MAX printf("#ifndef DBL_MAX\n"); printf("#define DBL_MAX %.*E%s\n", s + 1, d, ds); printf("#endif\n"); #endif #ifndef DBL_MAX_EXP printf("#ifndef DBL_MAX_EXP\n"); printf("#define DBL_MAX_EXP %d\n", i); printf("#endif\n"); #endif #ifdef DBL_MIN_10_EXP i = DBL_MIN_10_EXP; #else i = 2; d = 1.0; do { i--; pd = d; d /= 10.0; } while (d < pd); #endif #ifndef DBL_MIN_10_EXP printf("#ifndef DBL_MIN_10_EXP\n"); printf("#define DBL_MIN_10_EXP (%d)\n", i); printf("#endif\n"); #endif #ifdef DBL_MAX_10_EXP i = DBL_MAX_10_EXP; #else i = -2; d = 1.0; do { i++; pd = d; d *= 10.0; } while (d > pd); #endif #ifndef DBL_MAX_10_EXP printf("#ifndef DBL_MAX_10_EXP\n"); printf("#define DBL_MAX_10_EXP %d\n", i); printf("#endif\n"); #endif #if !_ast_fltmax_double printf("\n"); w = 1; do { pw = w; w *= 2; l = (_ast_intmax_t)w; x = (_ast_intmax_t)l; } while (w > pw && w == x); w = (pw - 1) + pw; u = ~0; if (u > w) u = w; 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"); } else { printf("#define LDBL_ULLONG_MAX LDBL_ULONG_MAX\n"); printf("#define LDBL_UINTMAX_MAX LDBL_ULONG_MAX\n"); } u /= 2; w /= 2; 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"); } else { printf("#define LDBL_LLONG_MAX LDBL_LONG_MAX\n"); printf("#define LDBL_INTMAX_MAX LDBL_LONG_MAX\n"); } u++; w++; 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"); } else { printf("#define LDBL_LLONG_MIN LDBL_LONG_MIN\n"); printf("#define LDBL_INTMAX_MIN LDBL_LONG_MIN\n"); } #ifdef LDBL_DIG s = LDBL_DIG; #else l = pl = 1.0L; s = -1; do { s++; l *= 10.0L; } while (l != (l + pl)); #endif #if defined(LDBL_MIN) && defined(LDBL_MIN_EXP) i = LDBL_MIN_EXP; ml = LDBL_MIN; #else i = 3; l = pl = 1.0L; do { i--; ml = pl; pl = l; l /= 2.0L; } while (l < pl); #ifdef LDBL_MIN_EXP i = LDBL_MIN_EXP; #endif #ifdef LDBL_MIN ml = LDBL_MIN; #endif #endif #ifndef LDBL_DIG printf("#ifndef LDBL_DIG\n"); printf("#define LDBL_DIG %d\n", s); printf("#endif\n"); #endif #ifndef LDBL_MIN printf("#ifndef LDBL_MIN\n"); printf("#define LDBL_MIN %.*LE%s\n", s + 1, ml, ls); printf("#endif\n"); #endif #ifndef LDBL_MIN_EXP printf("#ifndef LDBL_MIN_EXP\n"); printf("#define LDBL_MIN_EXP (%d)\n", i); printf("#endif\n"); #endif #if defined(LDBL_MAX) && defined(LDBL_MAX_EXP) i = LDBL_MAX_EXP; l = LDBL_MAX; #else i = -1; l = pl = 1.0L; do { i++; ml = pl; pl = l; l *= 2.0L; } while (l > pl); l = 1.0L; do { l *= 2.0L; } while (ml == (ml + l)); l = (ml - l) * 2.0L + l; #ifdef LDBL_MAX_EXP i = LDBL_MAX_EXP; #endif #ifdef LDBL_MAX l = LDBL_MAX; #endif #endif #ifndef LDBL_MAX printf("#ifndef LDBL_MAX\n"); printf("#define LDBL_MAX %.*LE%s\n", s + 1, l, ls); printf("#endif\n"); #endif #ifndef LDBL_MAX_EXP printf("#ifndef LDBL_MAX_EXP\n"); printf("#define LDBL_MAX_EXP %d\n", i); printf("#endif\n"); #endif #ifdef LDBL_MIN_10_EXP i = LDBL_MIN_10_EXP; #else i = 2; l = 1.0L; do { i--; pl = l; l /= 10.0L; } while (l < pl); #endif #ifndef LDBL_MIN_10_EXP printf("#ifndef LDBL_MIN_10_EXP\n"); printf("#define LDBL_MIN_10_EXP (%d)\n", i); printf("#endif\n"); #endif #ifdef LDBL_MAX_10_EXP i = LDBL_MAX_10_EXP; #else i = -2; l = 1.0L; do { i++; pl = l; l *= 10.0L; } while (l > pl); #endif #ifndef LDBL_MAX_10_EXP printf("#ifndef LDBL_MAX_10_EXP\n"); printf("#define LDBL_MAX_10_EXP %d\n", i); printf("#endif\n"); #endif fp = "LDBL"; #else fp = "DBL"; #endif printf("\n"); 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); #ifdef SIGFPE if (!caught) { #if !__MVS__ f = xf; f *= 2; if (!f) #endif caught = 1; } if (caught) printf("\n#define _ast_fltsig %d\n", SIGFPE); #endif printf("\n"); #if !_lib_frexp printf("extern double frexp(double, int*);\n"); #endif #if !_lib_frexpl printf("extern _ast_fltmax_t frexpl(_ast_fltmax_t, int*);\n"); #endif #if !_lib_ldexp printf("extern double ldexp(double, int);\n"); #endif #if !_lib_ldexpl printf("extern _ast_fltmax_t ldexpl(_ast_fltmax_t, int);\n"); #endif return 0; } }end tst - note{ double exponent bitfoolery }end output{ #include "FEATURE/common" #include typedef union _dbl_exp_u { unsigned _ast_int4_t e[sizeof(double) / 4]; double f; } _ast_dbl_exp_t; int main() { int i; int j; unsigned _ast_int4_t e; _ast_dbl_exp_t a; _ast_dbl_exp_t b; a.f = 1; b.f = 2; for (i = 0; i < sizeof(a.e) / sizeof(a.e[0]); i++) if (e = a.e[i] ^ b.e[i]) { for (j = i + 1; j < sizeof(a.e) / sizeof(a.e[0]); j++) if (a.e[j] ^ b.e[j]) return 0; 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); return 0; } return 0; } }end tst - note{ long double exponent bitfoolery }end output{ #include "FEATURE/common" #include typedef union _ast_fltmax_exp_u { unsigned _ast_int4_t e[sizeof(_ast_fltmax_t) / 4]; _ast_fltmax_t f; } _ast_fltmax_exp_t; int main() { int i; int j; unsigned _ast_int4_t e; _ast_fltmax_exp_t a; _ast_fltmax_exp_t b; a.f = 1; b.f = 2; for (i = 0; i < sizeof(a.e) / sizeof(a.e[0]); i++) if (e = a.e[i] ^ b.e[i]) { for (j = i + 1; j < sizeof(a.e) / sizeof(a.e[0]); j++) if (a.e[j] ^ b.e[j]) return 0; 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); return 0; } return 0; } }end tst - -DN=1 - -DN=2 note{ _ast_fltmax_t maximum integral type }end output{ #include int main() { #if N == 1 unsigned long long m; long double f = 123.456; m = f; if (!m || f == m) return 1; printf("#define _ast_flt_unsigned_max_t unsigned long long\n"); #else printf("#define _ast_flt_unsigned_max_t unsigned long\n"); #endif return 0; } }end tst - -DSCAN=1 - -lm -DSTRTO=1 - -DDIV=1 - -DEXP=1 - -DADD=1 - -DMPY=1 note{ INF and NAN memory representations }end output{ #include "FEATURE/common" #include #include #include #if _hdr_float #include #endif #if _hdr_limits #include #endif #if _hdr_math #include #endif #if _hdr_values #include #endif #if STRTO && _hdr_stdlib #include #endif #if !defined(FLT_MAX) && defined(MAXFLOAT) #define FLT_MAX MAXFLOAT #endif #if !defined(DBL_MAX) && defined(MAXDOUBLE) #define DBL_MAX MAXDOUBLE #endif #if _ast_fltmax_double #undef LDBL_MAX #endif static void #if _STD_ list(const char* typ, const char* var, void* val, int siz) #else list(typ, var, val, siz) char* typ; char* var; void* val; int siz; #endif { register unsigned char* u = (unsigned char*)val; register unsigned char* e = u + siz; printf("#define _ast_%s_%s_init\t0x%02x", typ, var, *u); while (++u < e) printf(",0x%02x", *u); printf("\n"); } int main() { #if SCAN || STRTO #undef NAN #define NAN "NaN" #undef INF #define INF "INF" { float f; #if SCAN if (sscanf(NAN, "%g", &f) != 1) return 1; #else f = atof(NAN); #endif list("flt", "nan", &f, sizeof(f)); #if SCAN if (sscanf(INF, "%g", &f) != 1) return 1; #else f = atof(INF); #endif list("flt", "inf", &f, sizeof(f)); } { double f; #if STRTO char* e; #endif #if SCAN if (sscanf(NAN, "%lg", &f) != 1) return 1; #else f = strtod(NAN, &e); if (*e) return 1; #endif list("dbl", "nan", &f, sizeof(f)); #if SCAN if (sscanf(INF, "%lg", &f) != 1) return 1; #else f = strtod(INF, &e); if (*e) return 1; #endif list("dbl", "inf", &f, sizeof(f)); } #ifdef LDBL_MAX { long double f; #if STRTO char* e; #endif #if SCAN if (sscanf(NAN, "%Lg", &f) != 1) return 1; #else f = strtold(NAN, &e); if (*e) return 1; #endif list("ldbl", "nan", &f, sizeof(f)); #if SCAN if (sscanf(INF, "%Lg", &f) != 1) return 1; #else f = strtold(INF, &e); if (*e) return 1; #endif list("ldbl", "inf", &f, sizeof(f)); } #endif #else #ifdef SIGFPE signal(SIGFPE, SIG_IGN); #endif #ifdef FLT_MAX { float f = FLT_MAX; #if DIV float z = 0; f = 0.0 / z; if (!f) return 1; list("flt", "nan", &f, sizeof(f)); f = 1.0 / z; list("flt", "inf", &f, sizeof(f)); #else #if ADD f += f; #endif #if EXP f = exp(f); #endif #if MPY f *= 2; #endif list("flt", "nan", &f, sizeof(f)); list("flt", "inf", &f, sizeof(f)); #endif } #endif #ifdef DBL_MAX { double f = DBL_MAX; #if DIV double z = 0; f = 0.0 / z; if (!f) return 1; list("dbl", "nan", &f, sizeof(f)); f = 1.0 / z; list("dbl", "inf", &f, sizeof(f)); #else #if ADD f += f; #endif #if EXP f = exp(f); #endif #if MPY f *= 2; #endif list("dbl", "nan", &f, sizeof(f)); list("dbl", "inf", &f, sizeof(f)); #endif } #endif #ifdef LDBL_MAX { long double f = LDBL_MAX; #if DIV long double z = 0; f = 0.0 / z; if (!f) return 1; list("ldbl", "nan", &f, sizeof(f)); f = 1.0 / z; list("ldbl", "inf", &f, sizeof(f)); #else #if ADD f += f; #endif #if EXP f = exp(f); #endif #if MPY f *= 2; #endif list("ldbl", "nan", &f, sizeof(f)); list("ldbl", "inf", &f, sizeof(f)); #endif } #endif #endif return 0; } }end