xref: /onnv-gate/usr/src/lib/libast/common/features/float (revision 10898:1883b621b3ea)
14887Schinset	prototyped
28462SApril.Chin@Sun.COMset	nooptimize
38462SApril.Chin@Sun.COMset	stdio FEATURE/isoc99
44887Schinhdr	float,limits,math,values
58462SApril.Chin@Sun.COMlib	fpclassify,frexp,frexpl,ldexp,ldexpl,finite,finitel,isinf,isinfl,isnan,isnanl,signbit,copysign,copysignl FEATURE/isoc99 math.h -lm
64887Schin
74887Schintst	ast_no_um2fm note{ no unsigned intmax => floatmax cast }end nolink{
84887Schin	#include "FEATURE/common"
94887Schin	int
104887Schin	main()
114887Schin	{
124887Schin		_ast_fltmax_t		f = 0;
134887Schin		unsigned _ast_intmax_t	i = 0;
144887Schin		f = i;
154887Schin		i = f;
164887Schin		return f == i;
174887Schin	}
184887Schin}end
194887Schin
204887Schintst	ast_mpy_overflow_fpe note{ fpe on mpy overflow }end noexecute{
214887Schin	int
224887Schin	main()
234887Schin	{
244887Schin		float	f;
254887Schin		float	p;
264887Schin		int	i;
274887Schin
284887Schin		i = 0;
294887Schin		p = f = 1.0;
304887Schin		do
314887Schin		{
324887Schin			p = f;
334887Schin			f *= 2.0;
344887Schin		} while (f != p && ++i < 1024);
354887Schin		return 0;
364887Schin	}
374887Schin}end
384887Schin
394887Schintst	ast_div_underflow_fpe note{ fpe on div underflow }end noexecute{
404887Schin	int
414887Schin	main()
424887Schin	{
434887Schin		float	f;
444887Schin		float	p;
454887Schin		int	i;
464887Schin
474887Schin		i = 0;
484887Schin		p = f = 1.0;
494887Schin		do
504887Schin		{
514887Schin			p = f;
524887Schin			f /= 2.0;
534887Schin		} while (f != p && ++i < 1024);
544887Schin		return 0;
554887Schin	}
564887Schin}end
574887Schin
584887Schinmacro{
594887Schin	#if _hdr_float
604887Schin	#include <float.h>
614887Schin	#endif
624887Schin	#if _hdr_limits
634887Schin	#include <limits.h>
644887Schin	#endif
654887Schin	#if _hdr_math
664887Schin	#include <math.h>
674887Schin	#endif
684887Schin	#if _hdr_values
694887Schin	#include <values.h>
704887Schin	#endif
714887Schin
724887Schin	#if !defined(FLT_MIN_EXP) && defined(FMINEXP)
734887Schin	#define FLT_MIN_EXP	FMINEXP
744887Schin	#endif
754887Schin	#if !defined(FLT_MIN) && defined(MINFLOAT)
764887Schin	#define FLT_MIN		MINFLOAT
774887Schin	#endif
784887Schin	#if !defined(FLT_MAX_EXP) && defined(FMAXEXP)
794887Schin	#define FLT_MAX_EXP	FMAXEXP
804887Schin	#endif
814887Schin	#if !defined(FLT_MAX) && defined(MAXFLOAT)
824887Schin	#define FLT_MAX		MAXFLOAT
834887Schin	#endif
844887Schin
854887Schin	#if !defined(DBL_MIN_EXP) && defined(DMINEXP)
864887Schin	#define DBL_MIN_EXP	DMINEXP
874887Schin	#endif
884887Schin	#if !defined(DBL_MIN) && defined(MINDOUBLE)
894887Schin	#define DBL_MIN		MINDOUBLE
904887Schin	#endif
914887Schin	#if !defined(DBL_MAX_EXP) && defined(DMAXEXP)
924887Schin	#define DBL_MAX_EXP	DMAXEXP
934887Schin	#endif
944887Schin	#if !defined(DBL_MAX) && defined(MAXDOUBLE)
954887Schin	#define DBL_MAX		MAXDOUBLE
964887Schin	#endif
974887Schin
984887Schin	<<"#include <ast_common.h>">>
994887Schin	#if _hdr_float
1004887Schin	<<"#include <float.h>">>
1014887Schin	#endif
1024887Schin	#if _hdr_math
1034887Schin	<<"#include <math.h>">>
1044887Schin	#endif
1054887Schin	#ifdef FLT_DIG
1064887Schin	<<"#ifndef FLT_DIG">>
1074887Schin	<<"#define FLT_DIG">>		FLT_DIG
1084887Schin	<<"#endif">>
1094887Schin	#endif
1104887Schin	#ifdef FLT_MAX
1114887Schin	<<"#ifndef FLT_MAX">>
1124887Schin	<<"#define FLT_MAX">>		FLT_MAX
1134887Schin	<<"#endif">>
1144887Schin	#endif
1154887Schin	#ifdef FLT_MAX_10_EXP
1164887Schin	<<"#ifndef FLT_MAX_10_EXP">>
1174887Schin	<<"#define FLT_MAX_10_EXP">>	FLT_MAX_10_EXP
1184887Schin	<<"#endif">>
1194887Schin	#endif
1204887Schin	#ifdef FLT_MAX_EXP
1214887Schin	<<"#ifndef FLT_MAX_EXP">>
1224887Schin	<<"#define FLT_MAX_EXP">>	FLT_MAX_EXP
1234887Schin	<<"#endif">>
1244887Schin	#endif
1254887Schin	#ifdef FLT_MIN
1264887Schin	<<"#ifndef FLT_MIN">>
1274887Schin	<<"#define FLT_MIN">>		FLT_MIN
1284887Schin	<<"#endif">>
1294887Schin	#endif
1304887Schin	#ifdef FLT_MIN_10_EXP
1314887Schin	<<"#ifndef FLT_MIN_10_EXP">>
1324887Schin	<<"#define FLT_MIN_10_EXP">>	FLT_MIN_10_EXP
1334887Schin	<<"#endif">>
1344887Schin	#endif
1354887Schin	#ifdef FLT_MIN_EXP
1364887Schin	<<"#ifndef FLT_MIN_EXP">>
1374887Schin	<<"#define FLT_MIN_EXP">>	FLT_MIN_EXP
1384887Schin	<<"#endif">>
1394887Schin	#endif
1404887Schin
1414887Schin	#ifdef DBL_DIG
1424887Schin	<<"#ifndef DBL_DIG">>
1434887Schin	<<"#define DBL_DIG">>		DBL_DIG
1444887Schin	<<"#endif">>
1454887Schin	#endif
1464887Schin	#ifdef DBL_MAX
1474887Schin	<<"#ifndef DBL_MAX">>
1484887Schin	<<"#define DBL_MAX">>		DBL_MAX
1494887Schin	<<"#endif">>
1504887Schin	#endif
1514887Schin	#ifdef DBL_MAX_10_EXP
1524887Schin	<<"#ifndef DBL_MAX_10_EXP">>
1534887Schin	<<"#define DBL_MAX_10_EXP">>	DBL_MAX_10_EXP
1544887Schin	<<"#endif">>
1554887Schin	#endif
1564887Schin	#ifdef DBL_MAX_EXP
1574887Schin	<<"#ifndef DBL_MAX_EXP">>
1584887Schin	<<"#define DBL_MAX_EXP">>	DBL_MAX_EXP
1594887Schin	<<"#endif">>
1604887Schin	#endif
1614887Schin	#ifdef DBL_MIN
1624887Schin	<<"#ifndef DBL_MIN">>
1634887Schin	<<"#define DBL_MIN">>		DBL_MIN
1644887Schin	<<"#endif">>
1654887Schin	#endif
1664887Schin	#ifdef DBL_MIN_10_EXP
1674887Schin	<<"#ifndef DBL_MIN_10_EXP">>
1684887Schin	<<"#define DBL_MIN_10_EXP">>	DBL_MIN_10_EXP
1694887Schin	<<"#endif">>
1704887Schin	#endif
1714887Schin	#ifdef DBL_MIN_EXP
1724887Schin	<<"#ifndef DBL_MIN_EXP">>
1734887Schin	<<"#define DBL_MIN_EXP">>	DBL_MIN_EXP
1744887Schin	<<"#endif">>
1754887Schin	#endif
1764887Schin
1774887Schin	#ifdef LDBL_DIG
1784887Schin	<<"#ifndef LDBL_DIG">>
1794887Schin	<<"#define LDBL_DIG">>		LDBL_DIG
1804887Schin	<<"#endif">>
1814887Schin	#endif
1824887Schin	#ifdef LDBL_MAX
1834887Schin	<<"#ifndef LDBL_MAX">>
1844887Schin	<<"#define LDBL_MAX">>		LDBL_MAX
1854887Schin	<<"#endif">>
1864887Schin	#endif
1874887Schin	#ifdef LDBL_MAX_10_EXP
1884887Schin	<<"#ifndef LDBL_MAX_10_EXP">>
1894887Schin	<<"#define LDBL_MAX_10_EXP">>	LDBL_MAX_10_EXP
1904887Schin	<<"#endif">>
1914887Schin	#endif
1924887Schin	#ifdef LDBL_MAX_EXP
1934887Schin	<<"#ifndef LDBL_MAX_EXP">>
1944887Schin	<<"#define LDBL_MAX_EXP">>	LDBL_MAX_EXP
1954887Schin	<<"#endif">>
1964887Schin	#endif
1974887Schin	#ifdef LDBL_MIN
1984887Schin	<<"#ifndef LDBL_MIN">>
1994887Schin	<<"#define LDBL_MIN">>		LDBL_MIN
2004887Schin	<<"#endif">>
2014887Schin	#endif
2024887Schin	#ifdef LDBL_MIN_10_EXP
2034887Schin	<<"#ifndef LDBL_MIN_10_EXP">>
2044887Schin	<<"#define LDBL_MIN_10_EXP">>	LDBL_MIN_10_EXP
2054887Schin	<<"#endif">>
2064887Schin	#endif
2074887Schin	#ifdef LDBL_MIN_EXP
2084887Schin	<<"#ifndef LDBL_MIN_EXP">>
2094887Schin	<<"#define LDBL_MIN_EXP">>	LDBL_MIN_EXP
2104887Schin	<<"#endif">>
2114887Schin	#endif
2124887Schin}end
2134887Schin
2144887Schintst	- note{ missing floating point limits }end output{
2154887Schin	#include "FEATURE/common"
2168462SApril.Chin@Sun.COM	#include <stdio.h>
2174887Schin	#if _hdr_float
2184887Schin	#include <float.h>
2194887Schin	#endif
2204887Schin	#if _hdr_limits
2214887Schin	#include <limits.h>
2224887Schin	#endif
2234887Schin	#if _hdr_math
2244887Schin	#include <math.h>
2254887Schin	#endif
2264887Schin	#if _hdr_values
2274887Schin	#include <values.h>
2284887Schin	#endif
2294887Schin	#include <signal.h>
2304887Schin	#ifdef SIGFPE
2314887Schin	static int caught = 0;
2324887Schin	#if _STD_
2334887Schin	static void catch(int sig)
2344887Schin	#else
2354887Schin	static void catch(sig) int sig;
2364887Schin	#endif
2374887Schin	{
2384887Schin		signal(sig, SIG_IGN);
2394887Schin		caught++;
2404887Schin	}
2414887Schin	#endif
2424887Schin	int
2434887Schin	main()
2444887Schin	{
2454887Schin		register int		i;
2464887Schin		register int		s;
2474887Schin		float			f;
2484887Schin		float			pf;
2494887Schin		float			mf;
2504887Schin		float			xf;
2514887Schin		double			d;
2524887Schin		double			pd;
2534887Schin		double			md;
2544887Schin		char*			fp;
2554887Schin	#if _ast_fltmax_double
2564887Schin		char*			fs = "";
2574887Schin		char*			ds = "";
2584887Schin	#else
2594887Schin		_ast_fltmax_t		l;
2604887Schin		_ast_fltmax_t		pl;
2614887Schin		_ast_fltmax_t		ml;
2624887Schin		char*			fs = "F";
2634887Schin		char*			ds = "";
2644887Schin		char*			ls = "L";
2654887Schin	#endif
2664887Schin		unsigned long		u;
2674887Schin		unsigned _ast_intmax_t	w;
2684887Schin		unsigned _ast_intmax_t	pw;
2694887Schin		unsigned _ast_intmax_t	x;
2704887Schin		unsigned short		us;
2714887Schin		unsigned int		ui;
2724887Schin		unsigned long		ul;
2734887Schin		unsigned _ast_intmax_t	uq;
2744887Schin
2754887Schin	#ifdef SIGFPE
2764887Schin		signal(SIGFPE, catch);
2774887Schin	#endif
2784887Schin		printf("\n");
2794887Schin		printf("\n");
2804887Schin		us = 0;
2814887Schin		us = ~us;
2824887Schin		i = 0;
2834887Schin		while (us /= 10)
2844887Schin			i++;
2854887Schin		printf("#define USHRT_DIG		%d\n", i);
2864887Schin		ui = 0;
2874887Schin		ui = ~ui;
2884887Schin		i = 0;
2894887Schin		while (ui /= 10)
2904887Schin			i++;
2914887Schin		printf("#define UINT_DIG		%d\n", i);
2924887Schin		ul = 0;
2934887Schin		ul = ~ul;
2944887Schin		i = 0;
2954887Schin		while (ul /= 10)
2964887Schin			i++;
2974887Schin		printf("#define ULONG_DIG		%d\n", i);
2984887Schin		if (sizeof(uq) > sizeof(ul))
2994887Schin		{
3004887Schin			uq = 0;
3014887Schin			uq = ~uq;
3024887Schin			i = 0;
3034887Schin			while (uq /= 10)
3044887Schin				i++;
3054887Schin			printf("#define ULLONG_DIG		%d\n", i);
3064887Schin			printf("#define UINTMAX_DIG		ULLONG_DIG\n");
3074887Schin		}
3084887Schin		else
3094887Schin			printf("#define UINTMAX_DIG		ULONG_DIG\n");
3104887Schin		printf("\n");
3114887Schin		w = 1;
3124887Schin		do
3134887Schin		{
3144887Schin			pw = w;
3154887Schin			w *= 2;
3164887Schin			f = (_ast_intmax_t)w;
3174887Schin			x = (_ast_intmax_t)f;
3184887Schin		} while (w > pw && w == x);
3194887Schin		w = (pw - 1) + pw;
3204887Schin		u = ~0;
3214887Schin		if (u > w)
3224887Schin			u = w;
3234887Schin		printf("#define FLT_ULONG_MAX		%lu.0F\n", u);
3244887Schin		if (sizeof(w) > sizeof(u))
3254887Schin		{
3264887Schin			printf("#define FLT_ULLONG_MAX		%llu.0F\n", w);
3274887Schin			printf("#define FLT_UINTMAX_MAX		FLT_ULLONG_MAX\n");
3284887Schin		}
3294887Schin		else
3304887Schin		{
3314887Schin			printf("#define FLT_ULLONG_MAX		FLT_ULONG_MAX\n");
3324887Schin			printf("#define FLT_UINTMAX_MAX		FLT_ULONG_MAX\n");
3334887Schin		}
3344887Schin		u /= 2;
3354887Schin		w /= 2;
3364887Schin		printf("#define FLT_LONG_MAX		%lu.0F\n", u);
3374887Schin		if (sizeof(w) > sizeof(u))
3384887Schin		{
3394887Schin			printf("#define FLT_LLONG_MAX		%llu.0F\n", w);
3404887Schin			printf("#define FLT_INTMAX_MAX		FLT_LLONG_MAX\n");
3414887Schin		}
3424887Schin		else
3434887Schin		{
3444887Schin			printf("#define FLT_LLONG_MAX		FLT_LONG_MAX\n");
3454887Schin			printf("#define FLT_INTMAX_MAX		FLT_LONG_MAX\n");
3464887Schin		}
3474887Schin		u++;
3484887Schin		w++;
3494887Schin		printf("#define FLT_LONG_MIN		(-%lu.0F)\n", u);
3504887Schin		if (sizeof(w) > sizeof(u))
3514887Schin		{
3524887Schin			printf("#define FLT_LLONG_MIN		(-%llu.0F)\n", w);
3534887Schin			printf("#define FLT_INTMAX_MIN		FLT_LLONG_MIN\n");
3544887Schin		}
3554887Schin		else
3564887Schin		{
3574887Schin			printf("#define FLT_LLONG_MIN		FLT_LONG_MIN\n");
3584887Schin			printf("#define FLT_INTMAX_MIN		FLT_LONG_MIN\n");
3594887Schin		}
3604887Schin	#ifdef FLT_DIG
3614887Schin		s = FLT_DIG;
3624887Schin	#else
3634887Schin		f = pf = 1.0;
3644887Schin		s = -1;
3654887Schin		do
3664887Schin		{
3674887Schin			s++;
3684887Schin			f *= 10.0;
3694887Schin		} while (f != (f + pf));
3704887Schin	#endif
3714887Schin	#if defined(FLT_MIN) && defined(FLT_MIN_EXP)
3724887Schin		i = FLT_MIN_EXP;
3734887Schin		mf = FLT_MIN;
3744887Schin	#else
3754887Schin		i = 3;
3764887Schin		f = pf = 1.0;
3774887Schin		do
3784887Schin		{
3794887Schin			i--;
3804887Schin			mf = pf;
3814887Schin			pf = f;
3824887Schin			f /= 2.0;
3834887Schin		} while (f < pf);
3844887Schin	#ifdef FLT_MIN_EXP
3854887Schin		i = FLT_MIN_EXP;
3864887Schin	#endif
3874887Schin	#ifdef FLT_MIN
3884887Schin		mf = FLT_MIN;
3894887Schin	#endif
3904887Schin	#endif
3914887Schin	#ifndef FLT_DIG
3924887Schin		printf("#ifndef FLT_DIG\n");
3934887Schin		printf("#define FLT_DIG			%d\n", s);
3944887Schin		printf("#endif\n");
3954887Schin	#endif
3964887Schin	#ifndef FLT_MIN
3974887Schin		printf("#ifndef FLT_MIN\n");
3984887Schin		printf("#define FLT_MIN			%.*E%s\n", s + 1, mf, fs);
3994887Schin		printf("#endif\n");
4004887Schin	#endif
4014887Schin	#ifndef FLT_MIN_EXP
4024887Schin		printf("#ifndef FLT_MIN_EXP\n");
4034887Schin		printf("#define FLT_MIN_EXP		(%d)\n", i);
4044887Schin		printf("#endif\n");
4054887Schin	#endif
4064887Schin
4074887Schin	#if defined(FLT_MAX) && defined(FLT_MAX_EXP)
4084887Schin		i = FLT_MAX_EXP;
4094887Schin		f = FLT_MAX;
4104887Schin	#else
4114887Schin		i = -1;
4124887Schin		f = pf = 1.0;
4134887Schin		do
4144887Schin		{
4154887Schin			i++;
4164887Schin			mf = pf;
4174887Schin			pf = f;
4184887Schin			f *= 2.0;
4194887Schin		} while (f > pf);
4204887Schin	#ifdef FLT_MAX_EXP
4214887Schin		i = FLT_MAX_EXP;
4224887Schin	#endif
4234887Schin	#ifdef FLT_MAX
4244887Schin		f = FLT_MAX;
4254887Schin	#endif
4264887Schin	#endif
4274887Schin	#ifdef FLT_MAX_EXP
4284887Schin		i = FLT_MAX_EXP;
4294887Schin	#else
4304887Schin		f = 1;
4314887Schin		do
4324887Schin		{
4334887Schin			f *= 2.0;
4344887Schin		} while (mf == (mf + f));
4354887Schin		f = (mf - f) * 2.0 + f;
4364887Schin	#endif
4374887Schin		xf = f;
4384887Schin	#ifndef FLT_MAX
4394887Schin		printf("#ifndef FLT_MAX\n");
4404887Schin		printf("#define FLT_MAX			%.*E%s\n", s + 1, f, fs);
4414887Schin		printf("#endif\n");
4424887Schin	#endif
4434887Schin	#ifndef FLT_MAX_EXP
4444887Schin		printf("#ifndef FLT_MAX_EXP\n");
4454887Schin		printf("#define FLT_MAX_EXP		%d\n", i);
4464887Schin		printf("#endif\n");
4474887Schin	#endif
4484887Schin
4494887Schin	#ifdef FLT_MIN_10_EXP
4504887Schin		i = FLT_MIN_10_EXP;
4514887Schin	#else
4524887Schin		i = 2;
4534887Schin		f = 1.0;
4544887Schin		do
4554887Schin		{
4564887Schin			i--;
4574887Schin			pf = f;
4584887Schin			f /= 10.0;
4594887Schin		} while (f < pf);
4604887Schin	#endif
4614887Schin	#ifndef FLT_MIN_10_EXP
4624887Schin		printf("#ifndef FLT_MIN_10_EXP\n");
4634887Schin		printf("#define FLT_MIN_10_EXP		(%d)\n", i);
4644887Schin		printf("#endif\n");
4654887Schin	#endif
4664887Schin
4674887Schin	#ifdef FLT_MAX_10_EXP
4684887Schin		i = FLT_MAX_10_EXP;
4694887Schin	#else
4704887Schin		i = -2;
4714887Schin		f = 1.0;
4724887Schin		do
4734887Schin		{
4744887Schin			i++;
4754887Schin			pf = f;
4764887Schin			f *= 10.0;
4774887Schin		} while (f > pf);
4784887Schin	#endif
4794887Schin	#ifndef FLT_MAX_10_EXP
4804887Schin		printf("#ifndef FLT_MAX_10_EXP\n");
4814887Schin		printf("#define FLT_MAX_10_EXP		%d\n", i);
4824887Schin		printf("#endif\n");
4834887Schin	#endif
4844887Schin
4854887Schin		printf("\n");
4864887Schin		w = 1;
4874887Schin		do
4884887Schin		{
4894887Schin			pw = w;
4904887Schin			w *= 2;
4914887Schin			d = (_ast_intmax_t)w;
4924887Schin			x = (_ast_intmax_t)d;
4934887Schin		} while (w > pw && w == x);
4944887Schin		w = (pw - 1) + pw;
4954887Schin		u = ~0;
4964887Schin		if (u > w)
4974887Schin			u = w;
4984887Schin		printf("#define DBL_ULONG_MAX		%lu.0\n", u);
4994887Schin		if (sizeof(w) > sizeof(u))
5004887Schin		{
5014887Schin			printf("#define DBL_ULLONG_MAX		%llu.0\n", w);
5024887Schin			printf("#define DBL_UINTMAX_MAX		DBL_ULLONG_MAX\n");
5034887Schin		}
5044887Schin		else
5054887Schin		{
5064887Schin			printf("#define DBL_ULLONG_MAX		DBL_ULONG_MAX\n");
5074887Schin			printf("#define DBL_UINTMAX_MAX		DBL_ULONG_MAX\n");
5084887Schin		}
5094887Schin		u /= 2;
5104887Schin		w /= 2;
5114887Schin		printf("#define DBL_LONG_MAX		%lu.0\n", u);
5124887Schin		if (sizeof(w) > sizeof(u))
5134887Schin		{
5144887Schin			printf("#define DBL_LLONG_MAX		%llu.0\n", w);
5154887Schin			printf("#define DBL_INTMAX_MAX		DBL_LLONG_MAX\n");
5164887Schin		}
5174887Schin		else
5184887Schin		{
5194887Schin			printf("#define DBL_LLONG_MAX		DBL_LONG_MAX\n");
5204887Schin			printf("#define DBL_INTMAX_MAX		DBL_LONG_MAX\n");
5214887Schin		}
5224887Schin		u++;
5234887Schin		w++;
5244887Schin		printf("#define DBL_LONG_MIN		(-%lu.0)\n", u);
5254887Schin		if (sizeof(w) > sizeof(u))
5264887Schin		{
5274887Schin			printf("#define DBL_LLONG_MIN		(-%llu.0)\n", w);
5284887Schin			printf("#define DBL_INTMAX_MIN		DBL_LLONG_MIN\n");
5294887Schin		}
5304887Schin		else
5314887Schin		{
5324887Schin			printf("#define DBL_LLONG_MIN		DBL_LONG_MIN\n");
5334887Schin			printf("#define DBL_INTMAX_MIN		DBL_LONG_MIN\n");
5344887Schin		}
5354887Schin	#ifdef DBL_DIG
5364887Schin		s = DBL_DIG;
5374887Schin	#else
5384887Schin		d = pd = 1.0;
5394887Schin		s = -1;
5404887Schin		do
5414887Schin		{
5424887Schin			s++;
5434887Schin			d *= 10.0;
5444887Schin		} while (d != (d + pd));
5454887Schin	#endif
5464887Schin	#if defined(DBL_MIN) && defined(DBL_MIN_EXP)
5474887Schin		i = DBL_MIN_EXP;
5484887Schin		md = DBL_MIN;
5494887Schin	#else
5504887Schin		i = 3;
5514887Schin		d = pd = 1.0;
5524887Schin		do
5534887Schin		{
5544887Schin			i--;
5554887Schin			md = pd;
5564887Schin			pd = d;
5574887Schin			d /= 2.0;
5584887Schin		} while (d < pd);
5594887Schin	#ifdef DBL_MIN_EXP
5604887Schin		i = DBL_MIN_EXP;
5614887Schin	#endif
5624887Schin	#ifdef DBL_MIN
5634887Schin		md = DBL_MIN;
5644887Schin	#endif
5654887Schin	#endif
5664887Schin	#ifndef DBL_DIG
5674887Schin		printf("#ifndef DBL_DIG\n");
5684887Schin		printf("#define DBL_DIG			%d\n", s);
5694887Schin		printf("#endif\n");
5704887Schin	#endif
5714887Schin	#ifndef DBL_MIN
5724887Schin		printf("#ifndef DBL_MIN\n");
5734887Schin		printf("#define DBL_MIN			%.*E%s\n", s + 1, md, ds);
5744887Schin		printf("#endif\n");
5754887Schin	#endif
5764887Schin	#ifndef DBL_MIN_EXP
5774887Schin		printf("#ifndef DBL_MIN_EXP\n");
5784887Schin		printf("#define DBL_MIN_EXP		(%d)\n", i);
5794887Schin		printf("#endif\n");
5804887Schin	#endif
5814887Schin
5824887Schin	#if defined(DBL_MAX) && defined(DBL_MAX_EXP)
5834887Schin		i = DBL_MAX_EXP;
5844887Schin		d = DBL_MAX;
5854887Schin	#else
5864887Schin		i = -1;
5874887Schin		d = pd = 1.0;
5884887Schin		do
5894887Schin		{
5904887Schin			i++;
5914887Schin			md = pd;
5924887Schin			pd = d;
5934887Schin			d *= 2.0;
5944887Schin		} while (d > pd);
5954887Schin		d = 1.0;
5964887Schin		do
5974887Schin		{
5984887Schin			d *= 2.0;
5994887Schin		} while (md == (md + d));
6004887Schin		d = (md - d) * 2.0 + d;
6014887Schin	#ifdef DBL_MAX_EXP
6024887Schin		i = DBL_MAX_EXP;
6034887Schin	#endif
6044887Schin	#ifdef DBL_MAX
6054887Schin		d = DBL_MAX;
6064887Schin	#endif
6074887Schin	#endif
6084887Schin	#ifndef DBL_MAX
6094887Schin		printf("#ifndef DBL_MAX\n");
6104887Schin		printf("#define DBL_MAX			%.*E%s\n", s + 1, d, ds);
6114887Schin		printf("#endif\n");
6124887Schin	#endif
6134887Schin	#ifndef DBL_MAX_EXP
6144887Schin		printf("#ifndef DBL_MAX_EXP\n");
6154887Schin		printf("#define DBL_MAX_EXP		%d\n", i);
6164887Schin		printf("#endif\n");
6174887Schin	#endif
6184887Schin
6194887Schin	#ifdef DBL_MIN_10_EXP
6204887Schin		i = DBL_MIN_10_EXP;
6214887Schin	#else
6224887Schin		i = 2;
6234887Schin		d = 1.0;
6244887Schin		do
6254887Schin		{
6264887Schin			i--;
6274887Schin			pd = d;
6284887Schin			d /= 10.0;
6294887Schin		} while (d < pd);
6304887Schin	#endif
6314887Schin	#ifndef DBL_MIN_10_EXP
6324887Schin		printf("#ifndef DBL_MIN_10_EXP\n");
6334887Schin		printf("#define DBL_MIN_10_EXP		(%d)\n", i);
6344887Schin		printf("#endif\n");
6354887Schin	#endif
6364887Schin
6374887Schin	#ifdef DBL_MAX_10_EXP
6384887Schin		i = DBL_MAX_10_EXP;
6394887Schin	#else
6404887Schin		i = -2;
6414887Schin		d = 1.0;
6424887Schin		do
6434887Schin		{
6444887Schin			i++;
6454887Schin			pd = d;
6464887Schin			d *= 10.0;
6474887Schin		} while (d > pd);
6484887Schin	#endif
6494887Schin	#ifndef DBL_MAX_10_EXP
6504887Schin		printf("#ifndef DBL_MAX_10_EXP\n");
6514887Schin		printf("#define DBL_MAX_10_EXP		%d\n", i);
6524887Schin		printf("#endif\n");
6534887Schin	#endif
6544887Schin
6554887Schin	#if !_ast_fltmax_double
6564887Schin		printf("\n");
6574887Schin		w = 1;
6584887Schin		do
6594887Schin		{
6604887Schin			pw = w;
6614887Schin			w *= 2;
6624887Schin			l = (_ast_intmax_t)w;
6634887Schin			x = (_ast_intmax_t)l;
6644887Schin		} while (w > pw && w == x);
6654887Schin		w = (pw - 1) + pw;
6664887Schin		u = ~0;
6674887Schin		if (u > w)
6684887Schin			u = w;
6694887Schin		printf("#define LDBL_ULONG_MAX		%lu.0L\n", u);
6704887Schin		if (sizeof(w) > sizeof(u))
6714887Schin		{
6724887Schin			printf("#define LDBL_ULLONG_MAX		%llu.0L\n", w);
6734887Schin			printf("#define LDBL_UINTMAX_MAX	LDBL_ULLONG_MAX\n");
6744887Schin		}
6754887Schin		else
6764887Schin		{
6774887Schin			printf("#define LDBL_ULLONG_MAX		LDBL_ULONG_MAX\n");
6784887Schin			printf("#define LDBL_UINTMAX_MAX	LDBL_ULONG_MAX\n");
6794887Schin		}
6804887Schin		u /= 2;
6814887Schin		w /= 2;
6824887Schin		printf("#define LDBL_LONG_MAX		%lu.0L\n", u);
6834887Schin		if (sizeof(w) > sizeof(u))
6844887Schin		{
6854887Schin			printf("#define LDBL_LLONG_MAX		%llu.0L\n", w);
6864887Schin			printf("#define LDBL_INTMAX_MAX		LDBL_LLONG_MAX\n");
6874887Schin		}
6884887Schin		else
6894887Schin		{
6904887Schin			printf("#define LDBL_LLONG_MAX		LDBL_LONG_MAX\n");
6914887Schin			printf("#define LDBL_INTMAX_MAX		LDBL_LONG_MAX\n");
6924887Schin		}
6934887Schin		u++;
6944887Schin		w++;
6954887Schin		printf("#define LDBL_LONG_MIN		(-%lu.0L)\n", u);
6964887Schin		if (sizeof(w) > sizeof(u))
6974887Schin		{
6984887Schin			printf("#define LDBL_LLONG_MIN		(-%llu.0L)\n", w);
6994887Schin			printf("#define LDBL_INTMAX_MIN		LDBL_LLONG_MIN\n");
7004887Schin		}
7014887Schin		else
7024887Schin		{
7034887Schin			printf("#define LDBL_LLONG_MIN		LDBL_LONG_MIN\n");
7044887Schin			printf("#define LDBL_INTMAX_MIN		LDBL_LONG_MIN\n");
7054887Schin		}
7064887Schin	#ifdef LDBL_DIG
7074887Schin		s = LDBL_DIG;
7084887Schin	#else
7094887Schin		l = pl = 1.0L;
7104887Schin		s = -1;
7114887Schin		do
7124887Schin		{
7134887Schin			s++;
7144887Schin			l *= 10.0L;
7154887Schin		} while (l != (l + pl));
7164887Schin	#endif
7174887Schin	#if defined(LDBL_MIN) && defined(LDBL_MIN_EXP)
7184887Schin		i = LDBL_MIN_EXP;
7194887Schin		ml = LDBL_MIN;
7204887Schin	#else
7214887Schin		i = 3;
7224887Schin		l = pl = 1.0L;
7234887Schin		do
7244887Schin		{
7254887Schin			i--;
7264887Schin			ml = pl;
7274887Schin			pl = l;
7284887Schin			l /= 2.0L;
7294887Schin		} while (l < pl);
7304887Schin	#ifdef LDBL_MIN_EXP
7314887Schin		i = LDBL_MIN_EXP;
7324887Schin	#endif
7334887Schin	#ifdef LDBL_MIN
7344887Schin		ml = LDBL_MIN;
7354887Schin	#endif
7364887Schin	#endif
7374887Schin	#ifndef LDBL_DIG
7384887Schin		printf("#ifndef LDBL_DIG\n");
7394887Schin		printf("#define LDBL_DIG		%d\n", s);
7404887Schin		printf("#endif\n");
7414887Schin	#endif
7424887Schin	#ifndef LDBL_MIN
7434887Schin		printf("#ifndef LDBL_MIN\n");
7444887Schin		printf("#define LDBL_MIN		%.*LE%s\n", s + 1, ml, ls);
7454887Schin		printf("#endif\n");
7464887Schin	#endif
7474887Schin	#ifndef LDBL_MIN_EXP
7484887Schin		printf("#ifndef LDBL_MIN_EXP\n");
7494887Schin		printf("#define LDBL_MIN_EXP		(%d)\n", i);
7504887Schin		printf("#endif\n");
7514887Schin	#endif
7524887Schin
7534887Schin	#if defined(LDBL_MAX) && defined(LDBL_MAX_EXP)
7544887Schin		i = LDBL_MAX_EXP;
7554887Schin		l = LDBL_MAX;
7564887Schin	#else
7574887Schin		i = -1;
7584887Schin		l = pl = 1.0L;
7594887Schin		do
7604887Schin		{
7614887Schin			i++;
7624887Schin			ml = pl;
7634887Schin			pl = l;
7644887Schin			l *= 2.0L;
7654887Schin		} while (l > pl);
7664887Schin		l = 1.0L;
7674887Schin		do
7684887Schin		{
7694887Schin			l *= 2.0L;
7704887Schin		} while (ml == (ml + l));
7714887Schin		l = (ml - l) * 2.0L + l;
7724887Schin	#ifdef LDBL_MAX_EXP
7734887Schin		i = LDBL_MAX_EXP;
7744887Schin	#endif
7754887Schin	#ifdef LDBL_MAX
7764887Schin		l = LDBL_MAX;
7774887Schin	#endif
7784887Schin	#endif
7794887Schin	#ifndef LDBL_MAX
7804887Schin		printf("#ifndef LDBL_MAX\n");
7814887Schin		printf("#define LDBL_MAX		%.*LE%s\n", s + 1, l, ls);
7824887Schin		printf("#endif\n");
7834887Schin	#endif
7844887Schin	#ifndef LDBL_MAX_EXP
7854887Schin		printf("#ifndef LDBL_MAX_EXP\n");
7864887Schin		printf("#define LDBL_MAX_EXP		%d\n", i);
7874887Schin		printf("#endif\n");
7884887Schin	#endif
7894887Schin
7904887Schin	#ifdef LDBL_MIN_10_EXP
7914887Schin		i = LDBL_MIN_10_EXP;
7924887Schin	#else
7934887Schin		i = 2;
7944887Schin		l = 1.0L;
7954887Schin		do
7964887Schin		{
7974887Schin			i--;
7984887Schin			pl = l;
7994887Schin			l /= 10.0L;
8004887Schin		} while (l < pl);
8014887Schin	#endif
8024887Schin	#ifndef LDBL_MIN_10_EXP
8034887Schin		printf("#ifndef LDBL_MIN_10_EXP\n");
8044887Schin		printf("#define LDBL_MIN_10_EXP		(%d)\n", i);
8054887Schin		printf("#endif\n");
8064887Schin	#endif
8074887Schin
8084887Schin	#ifdef LDBL_MAX_10_EXP
8094887Schin		i = LDBL_MAX_10_EXP;
8104887Schin	#else
8114887Schin		i = -2;
8124887Schin		l = 1.0L;
8134887Schin		do
8144887Schin		{
8154887Schin			i++;
8164887Schin			pl = l;
8174887Schin			l *= 10.0L;
8184887Schin		} while (l > pl);
8194887Schin	#endif
8204887Schin	#ifndef LDBL_MAX_10_EXP
8214887Schin		printf("#ifndef LDBL_MAX_10_EXP\n");
8224887Schin		printf("#define LDBL_MAX_10_EXP		%d\n", i);
8234887Schin		printf("#endif\n");
8244887Schin	#endif
8254887Schin		fp = "LDBL";
8264887Schin	#else
8274887Schin		fp = "DBL";
8284887Schin	#endif
8294887Schin
8304887Schin	printf("\n");
8314887Schin	printf("#define FLTMAX_UINTMAX_MAX	%s_UINTMAX_MAX\n", fp);
8324887Schin	printf("#define FLTMAX_INTMAX_MAX	%s_INTMAX_MAX\n", fp);
8334887Schin	printf("#define FLTMAX_INTMAX_MIN	%s_INTMAX_MIN\n", fp);
8344887Schin
8354887Schin	#ifdef SIGFPE
8364887Schin		if (!caught)
8374887Schin		{
8384887Schin	#if !__MVS__
8394887Schin			f = xf;
8404887Schin			f *= 2;
8414887Schin			if (!f)
8424887Schin	#endif
8434887Schin				caught = 1;
8444887Schin		}
8454887Schin		if (caught)
8464887Schin			printf("\n#define _ast_fltsig		%d\n", SIGFPE);
8474887Schin	#endif
8484887Schin
8494887Schin		printf("\n");
8504887Schin	#if !_lib_frexp
8514887Schin		printf("extern double		frexp(double, int*);\n");
8524887Schin	#endif
8534887Schin	#if !_lib_frexpl
8544887Schin		printf("extern _ast_fltmax_t	frexpl(_ast_fltmax_t, int*);\n");
8554887Schin	#endif
8564887Schin	#if !_lib_ldexp
8574887Schin		printf("extern double		ldexp(double, int);\n");
8584887Schin	#endif
8594887Schin	#if !_lib_ldexpl
8604887Schin		printf("extern _ast_fltmax_t	ldexpl(_ast_fltmax_t, int);\n");
8614887Schin	#endif
8624887Schin
8634887Schin		return 0;
8644887Schin	}
8654887Schin}end
8664887Schin
8674887Schintst	- note{ double exponent bitfoolery }end output{
8684887Schin	#include "FEATURE/common"
8698462SApril.Chin@Sun.COM	#include <stdio.h>
8704887Schin	typedef union _dbl_exp_u
8714887Schin	{
8724887Schin		unsigned _ast_int4_t	e[sizeof(double) / 4];
8734887Schin		double			f;
8744887Schin	} _ast_dbl_exp_t;
8754887Schin	int
8764887Schin	main()
8774887Schin	{
8784887Schin		int			i;
8794887Schin		int			j;
8804887Schin		unsigned _ast_int4_t	e;
8814887Schin		_ast_dbl_exp_t		a;
8824887Schin		_ast_dbl_exp_t		b;
8834887Schin		a.f = 1;
8844887Schin		b.f = 2;
8854887Schin		for (i = 0; i < sizeof(a.e) / sizeof(a.e[0]); i++)
8864887Schin			if (e = a.e[i] ^ b.e[i])
8874887Schin			{
8884887Schin				for (j = i + 1; j < sizeof(a.e) / sizeof(a.e[0]); j++)
8894887Schin					if (a.e[j] ^ b.e[j])
8904887Schin						return 0;
8914887Schin				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");
8924887Schin				printf("#define _ast_dbl_exp_index	%d\n", i);
8934887Schin				for (i = 0; !(e & 1); e >>= 1, i++);
8944887Schin				printf("#define _ast_dbl_exp_shift	%d\n\n", i);
8954887Schin				return 0;
8964887Schin			}
8974887Schin		return 0;
8984887Schin	}
8994887Schin}end
9004887Schin
9014887Schintst	- note{ long double exponent bitfoolery }end output{
9024887Schin	#include "FEATURE/common"
9038462SApril.Chin@Sun.COM	#include <stdio.h>
9044887Schin	typedef union _ast_fltmax_exp_u
9054887Schin	{
9064887Schin		unsigned _ast_int4_t	e[sizeof(_ast_fltmax_t) / 4];
9074887Schin		_ast_fltmax_t		f;
9084887Schin	} _ast_fltmax_exp_t;
9094887Schin	int
9104887Schin	main()
9114887Schin	{
9124887Schin		int			i;
9134887Schin		int			j;
9144887Schin		unsigned _ast_int4_t	e;
9154887Schin		_ast_fltmax_exp_t	a;
9164887Schin		_ast_fltmax_exp_t	b;
9174887Schin		a.f = 1;
9184887Schin		b.f = 2;
9194887Schin		for (i = 0; i < sizeof(a.e) / sizeof(a.e[0]); i++)
9204887Schin			if (e = a.e[i] ^ b.e[i])
9214887Schin			{
9224887Schin				for (j = i + 1; j < sizeof(a.e) / sizeof(a.e[0]); j++)
9234887Schin					if (a.e[j] ^ b.e[j])
9244887Schin						return 0;
9254887Schin				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");
9264887Schin				printf("#define _ast_fltmax_exp_index\t%d\n", i);
9274887Schin				for (i = 0; !(e & 1); e >>= 1, i++);
9284887Schin				printf("#define _ast_fltmax_exp_shift\t%d\n\n", i);
9294887Schin				return 0;
9304887Schin			}
9314887Schin		return 0;
9324887Schin	}
9334887Schin}end
9344887Schin
9354887Schintst	- -DN=1 - -DN=2 note{ _ast_fltmax_t maximum integral type }end output{
9368462SApril.Chin@Sun.COM	#include <stdio.h>
9374887Schin	int
9384887Schin	main()
9394887Schin	{
9404887Schin	#if N == 1
9414887Schin		unsigned long long	m;
9424887Schin		long double		f = 123.456;
9434887Schin
9444887Schin		m = f;
9454887Schin		if (!m || f == m)
9464887Schin			return 1;
9474887Schin		printf("#define _ast_flt_unsigned_max_t	unsigned long long\n");
9484887Schin	#else
9494887Schin		printf("#define _ast_flt_unsigned_max_t	unsigned long\n");
9504887Schin	#endif
9514887Schin		return 0;
9524887Schin	}
9534887Schin}end
9544887Schin
955*10898Sroland.mainz@nrubsig.orgtst	- -DSCAN=1 - -lm -DSTRTO=1 - -DMAC=1 - -DDIV=1 - -DEXP=1 - -DADD=1 - -DMPY=1 note{ INF and NAN memory representations }end output{
956*10898Sroland.mainz@nrubsig.org	#if MAC
957*10898Sroland.mainz@nrubsig.org	#define _AIX_COMPATIBILITY	1
958*10898Sroland.mainz@nrubsig.org	#define _FP_MODE_VARIABLE	1
959*10898Sroland.mainz@nrubsig.org	#endif
9604887Schin	#include "FEATURE/common"
9618462SApril.Chin@Sun.COM	#include <stdio.h>
9624887Schin	#include <sys/types.h>
9634887Schin	#include <signal.h>
9644887Schin	#if _hdr_float
9654887Schin	#include <float.h>
9664887Schin	#endif
9674887Schin	#if _hdr_limits
9684887Schin	#include <limits.h>
9694887Schin	#endif
9704887Schin	#if _hdr_math
9714887Schin	#include <math.h>
9724887Schin	#endif
9734887Schin	#if _hdr_values
9744887Schin	#include <values.h>
9754887Schin	#endif
9764887Schin	#if STRTO && _hdr_stdlib
9774887Schin	#include <stdlib.h>
9784887Schin	#endif
9794887Schin	#if !defined(FLT_MAX) && defined(MAXFLOAT)
9804887Schin	#define FLT_MAX		MAXFLOAT
9814887Schin	#endif
9824887Schin	#if !defined(DBL_MAX) && defined(MAXDOUBLE)
9834887Schin	#define DBL_MAX		MAXDOUBLE
9844887Schin	#endif
9854887Schin	#if _ast_fltmax_double
9864887Schin	#undef	LDBL_MAX
9874887Schin	#endif
9884887Schin	static void
9894887Schin	#if _STD_
9904887Schin	list(const char* typ, const char* var, void* val, int siz)
9914887Schin	#else
9924887Schin	list(typ, var, val, siz)
9934887Schin	char* typ;
9944887Schin	char* var;
9954887Schin	void* val;
9964887Schin	int siz;
9974887Schin	#endif
9984887Schin	{
9994887Schin		register unsigned char*	u = (unsigned char*)val;
10004887Schin		register unsigned char*	e = u + siz;
10014887Schin
10024887Schin		printf("#define _ast_%s_%s_init\t0x%02x", typ, var, *u);
10034887Schin		while (++u < e)
10044887Schin			printf(",0x%02x", *u);
10054887Schin		printf("\n");
10064887Schin	}
10074887Schin	int
10084887Schin	main()
10094887Schin	{
10104887Schin	#if SCAN || STRTO
10114887Schin	#undef	NAN
10124887Schin	#define NAN	"NaN"
10134887Schin	#undef	INF
10144887Schin	#define INF	"INF"
10154887Schin	{
10164887Schin		float	f;
10174887Schin
10184887Schin	#if SCAN
10194887Schin		if (sscanf(NAN, "%g", &f) != 1)
10204887Schin			return 1;
10214887Schin	#else
10224887Schin		f = atof(NAN);
10234887Schin	#endif
10244887Schin		list("flt", "nan", &f, sizeof(f));
10254887Schin	#if SCAN
10264887Schin		if (sscanf(INF, "%g", &f) != 1)
10274887Schin			return 1;
10284887Schin	#else
10294887Schin		f = atof(INF);
10304887Schin	#endif
10314887Schin		list("flt", "inf", &f, sizeof(f));
10324887Schin	}
10334887Schin	{
10344887Schin		double	f;
10354887Schin	#if STRTO
10364887Schin		char*	e;
10374887Schin	#endif
10384887Schin
10394887Schin	#if SCAN
10404887Schin		if (sscanf(NAN, "%lg", &f) != 1)
10414887Schin			return 1;
10424887Schin	#else
10434887Schin		f = strtod(NAN, &e);
10444887Schin		if (*e)
10454887Schin			return 1;
10464887Schin	#endif
10474887Schin		list("dbl", "nan", &f, sizeof(f));
10484887Schin	#if SCAN
10494887Schin		if (sscanf(INF, "%lg", &f) != 1)
10504887Schin			return 1;
10514887Schin	#else
10524887Schin		f = strtod(INF, &e);
10534887Schin		if (*e)
10544887Schin			return 1;
10554887Schin	#endif
10564887Schin		list("dbl", "inf", &f, sizeof(f));
10574887Schin	}
10584887Schin	#ifdef LDBL_MAX
10594887Schin	{
10604887Schin		long double	f;
10614887Schin	#if STRTO
10624887Schin		char*	e;
10634887Schin	#endif
10644887Schin
10654887Schin	#if SCAN
10664887Schin		if (sscanf(NAN, "%Lg", &f) != 1)
10674887Schin			return 1;
10684887Schin	#else
10694887Schin		f = strtold(NAN, &e);
10704887Schin		if (*e)
10714887Schin			return 1;
10724887Schin	#endif
10734887Schin		list("ldbl", "nan", &f, sizeof(f));
10744887Schin	#if SCAN
10754887Schin		if (sscanf(INF, "%Lg", &f) != 1)
10764887Schin			return 1;
10774887Schin	#else
10784887Schin		f = strtold(INF, &e);
10794887Schin		if (*e)
10804887Schin			return 1;
10814887Schin	#endif
10824887Schin		list("ldbl", "inf", &f, sizeof(f));
10834887Schin	}
10844887Schin	#endif
10854887Schin	#else
10864887Schin	#ifdef SIGFPE
10874887Schin		signal(SIGFPE, SIG_IGN);
10884887Schin	#endif
10894887Schin	#ifdef FLT_MAX
10904887Schin		{
10914887Schin			float	f = FLT_MAX;
10924887Schin	#if DIV
10934887Schin			float	z = 0;
10944887Schin
10954887Schin			f = 0.0 / z;
10964887Schin			if (!f)
10974887Schin				return 1;
10984887Schin			list("flt", "nan", &f, sizeof(f));
10994887Schin			f = 1.0 / z;
11004887Schin			list("flt", "inf", &f, sizeof(f));
11014887Schin	#else
11024887Schin	#if ADD
11034887Schin			f += f;
11044887Schin	#endif
11054887Schin	#if EXP
11064887Schin			f = exp(f);
11074887Schin	#endif
11084887Schin	#if MPY
11094887Schin			f *= 2;
11104887Schin	#endif
1111*10898Sroland.mainz@nrubsig.org	#if MAC
1112*10898Sroland.mainz@nrubsig.org			f = FLT_QNAN;
1113*10898Sroland.mainz@nrubsig.org	#endif
11144887Schin			list("flt", "nan", &f, sizeof(f));
1115*10898Sroland.mainz@nrubsig.org	#if MAC
1116*10898Sroland.mainz@nrubsig.org			f = FLT_INFINITY;
1117*10898Sroland.mainz@nrubsig.org	#endif
11184887Schin			list("flt", "inf", &f, sizeof(f));
11194887Schin	#endif
11204887Schin		}
11214887Schin	#endif
11224887Schin	#ifdef DBL_MAX
11234887Schin		{
11244887Schin			double	f = DBL_MAX;
11254887Schin	#if DIV
11264887Schin			double	z = 0;
11274887Schin
11284887Schin			f = 0.0 / z;
11294887Schin			if (!f)
11304887Schin				return 1;
11314887Schin			list("dbl", "nan", &f, sizeof(f));
11324887Schin			f = 1.0 / z;
11334887Schin			list("dbl", "inf", &f, sizeof(f));
11344887Schin	#else
11354887Schin	#if ADD
11364887Schin			f += f;
11374887Schin	#endif
11384887Schin	#if EXP
11394887Schin			f = exp(f);
11404887Schin	#endif
11414887Schin	#if MPY
11424887Schin			f *= 2;
11434887Schin	#endif
1144*10898Sroland.mainz@nrubsig.org	#if MAC
1145*10898Sroland.mainz@nrubsig.org			f = DBL_QNAN;
1146*10898Sroland.mainz@nrubsig.org	#endif
11474887Schin			list("dbl", "nan", &f, sizeof(f));
1148*10898Sroland.mainz@nrubsig.org	#if MAC
1149*10898Sroland.mainz@nrubsig.org			f = DBL_INFINITY;
1150*10898Sroland.mainz@nrubsig.org	#endif
11514887Schin			list("dbl", "inf", &f, sizeof(f));
11524887Schin	#endif
11534887Schin		}
11544887Schin	#endif
11554887Schin	#ifdef LDBL_MAX
11564887Schin		{
11574887Schin			long double	f = LDBL_MAX;
11584887Schin	#if DIV
11594887Schin			long double	z = 0;
11604887Schin
11614887Schin			f = 0.0 / z;
11624887Schin			if (!f)
11634887Schin				return 1;
11644887Schin			list("ldbl", "nan", &f, sizeof(f));
11654887Schin			f = 1.0 / z;
11664887Schin			list("ldbl", "inf", &f, sizeof(f));
11674887Schin	#else
11684887Schin	#if ADD
11694887Schin			f += f;
11704887Schin	#endif
11714887Schin	#if EXP
11724887Schin			f = exp(f);
11734887Schin	#endif
11744887Schin	#if MPY
11754887Schin			f *= 2;
11764887Schin	#endif
1177*10898Sroland.mainz@nrubsig.org	#if MAC
1178*10898Sroland.mainz@nrubsig.org			f = LDBL_QNAN;
1179*10898Sroland.mainz@nrubsig.org	#endif
11804887Schin			list("ldbl", "nan", &f, sizeof(f));
1181*10898Sroland.mainz@nrubsig.org	#if MAC
1182*10898Sroland.mainz@nrubsig.org			f = LDBL_INFINITY;
1183*10898Sroland.mainz@nrubsig.org	#endif
11844887Schin			list("ldbl", "inf", &f, sizeof(f));
11854887Schin	#endif
11864887Schin		}
11874887Schin	#endif
11884887Schin	#endif
11894887Schin		return 0;
11904887Schin	}
11914887Schin}end
1192