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