1da2e3ebdSchinset	prototyped
27c2fbfb3SApril Chinset	nooptimize
3*b30d1939SAndy Fiddamanset	stdio FEATURE/standards
4da2e3ebdSchinhdr	float,limits,math,values
5*b30d1939SAndy Fiddamanlib,npt	frexp,frexpl,ldexp,ldexpl,finite,finitel,isinfl,isnanl,copysign,copysignl FEATURE/standards math.h -lm
6*b30d1939SAndy Fiddamanlib	fpclassify -lm note{ fpclassify present and works }end link{
7*b30d1939SAndy Fiddaman		#include <sys/types.h>
8*b30d1939SAndy Fiddaman		#include <sys/stat.h>
9*b30d1939SAndy Fiddaman		#include <stdlib.h>
10*b30d1939SAndy Fiddaman		#include <unistd.h>
11*b30d1939SAndy Fiddaman		#include <math.h>
12*b30d1939SAndy Fiddaman		int main() { return fpclassify(-0.0); }
13*b30d1939SAndy Fiddaman	}end
14*b30d1939SAndy Fiddamanlib	isinf -lm note{ isinf present and works }end link{
15*b30d1939SAndy Fiddaman		#include <sys/types.h>
16*b30d1939SAndy Fiddaman		#include <sys/stat.h>
17*b30d1939SAndy Fiddaman		#include <stdlib.h>
18*b30d1939SAndy Fiddaman		#include <unistd.h>
19*b30d1939SAndy Fiddaman		#include <math.h>
20*b30d1939SAndy Fiddaman		int main() { return isinf(-0.0); }
21*b30d1939SAndy Fiddaman	}end
22*b30d1939SAndy Fiddamanlib	isnan -lm note{ isnan present and works }end link{
23*b30d1939SAndy Fiddaman		#include <sys/types.h>
24*b30d1939SAndy Fiddaman		#include <sys/stat.h>
25*b30d1939SAndy Fiddaman		#include <stdlib.h>
26*b30d1939SAndy Fiddaman		#include <unistd.h>
27*b30d1939SAndy Fiddaman		#include <math.h>
28*b30d1939SAndy Fiddaman		int main() { return isnan(-0.0); }
29*b30d1939SAndy Fiddaman	}end
30*b30d1939SAndy Fiddamanlib	signbit -lm note{ signbit present and works }end link{
31*b30d1939SAndy Fiddaman		#include <sys/types.h>
32*b30d1939SAndy Fiddaman		#include <sys/stat.h>
33*b30d1939SAndy Fiddaman		#include <stdlib.h>
34*b30d1939SAndy Fiddaman		#include <unistd.h>
35*b30d1939SAndy Fiddaman		#include <math.h>
36*b30d1939SAndy Fiddaman		int main() { return signbit(-0.0); }
37*b30d1939SAndy Fiddaman	}end
38da2e3ebdSchin
39da2e3ebdSchintst	ast_no_um2fm note{ no unsigned intmax => floatmax cast }end nolink{
40da2e3ebdSchin	#include "FEATURE/common"
41da2e3ebdSchin	int
42da2e3ebdSchin	main()
43da2e3ebdSchin	{
44da2e3ebdSchin		_ast_fltmax_t		f = 0;
45da2e3ebdSchin		unsigned _ast_intmax_t	i = 0;
46da2e3ebdSchin		f = i;
47da2e3ebdSchin		i = f;
48da2e3ebdSchin		return f == i;
49da2e3ebdSchin	}
50da2e3ebdSchin}end
51da2e3ebdSchin
52da2e3ebdSchintst	ast_mpy_overflow_fpe note{ fpe on mpy overflow }end noexecute{
53da2e3ebdSchin	int
54da2e3ebdSchin	main()
55da2e3ebdSchin	{
56da2e3ebdSchin		float	f;
57da2e3ebdSchin		float	p;
58da2e3ebdSchin		int	i;
59da2e3ebdSchin
60da2e3ebdSchin		i = 0;
61da2e3ebdSchin		p = f = 1.0;
62da2e3ebdSchin		do
63da2e3ebdSchin		{
64da2e3ebdSchin			p = f;
65da2e3ebdSchin			f *= 2.0;
66da2e3ebdSchin		} while (f != p && ++i < 1024);
67da2e3ebdSchin		return 0;
68da2e3ebdSchin	}
69da2e3ebdSchin}end
70da2e3ebdSchin
71da2e3ebdSchintst	ast_div_underflow_fpe note{ fpe on div underflow }end noexecute{
72da2e3ebdSchin	int
73da2e3ebdSchin	main()
74da2e3ebdSchin	{
75da2e3ebdSchin		float	f;
76da2e3ebdSchin		float	p;
77da2e3ebdSchin		int	i;
78da2e3ebdSchin
79da2e3ebdSchin		i = 0;
80da2e3ebdSchin		p = f = 1.0;
81da2e3ebdSchin		do
82da2e3ebdSchin		{
83da2e3ebdSchin			p = f;
84da2e3ebdSchin			f /= 2.0;
85da2e3ebdSchin		} while (f != p && ++i < 1024);
86da2e3ebdSchin		return 0;
87da2e3ebdSchin	}
88da2e3ebdSchin}end
89da2e3ebdSchin
90da2e3ebdSchinmacro{
91da2e3ebdSchin	#if _hdr_float
92da2e3ebdSchin	#include <float.h>
93da2e3ebdSchin	#endif
94da2e3ebdSchin	#if _hdr_limits
95da2e3ebdSchin	#include <limits.h>
96da2e3ebdSchin	#endif
97da2e3ebdSchin	#if _hdr_math
98da2e3ebdSchin	#include <math.h>
99da2e3ebdSchin	#endif
100da2e3ebdSchin	#if _hdr_values
101da2e3ebdSchin	#include <values.h>
102da2e3ebdSchin	#endif
103da2e3ebdSchin
104da2e3ebdSchin	#if !defined(FLT_MIN_EXP) && defined(FMINEXP)
105da2e3ebdSchin	#define FLT_MIN_EXP	FMINEXP
106da2e3ebdSchin	#endif
107da2e3ebdSchin	#if !defined(FLT_MIN) && defined(MINFLOAT)
108da2e3ebdSchin	#define FLT_MIN		MINFLOAT
109da2e3ebdSchin	#endif
110da2e3ebdSchin	#if !defined(FLT_MAX_EXP) && defined(FMAXEXP)
111da2e3ebdSchin	#define FLT_MAX_EXP	FMAXEXP
112da2e3ebdSchin	#endif
113da2e3ebdSchin	#if !defined(FLT_MAX) && defined(MAXFLOAT)
114da2e3ebdSchin	#define FLT_MAX		MAXFLOAT
115da2e3ebdSchin	#endif
116da2e3ebdSchin
117da2e3ebdSchin	#if !defined(DBL_MIN_EXP) && defined(DMINEXP)
118da2e3ebdSchin	#define DBL_MIN_EXP	DMINEXP
119da2e3ebdSchin	#endif
120da2e3ebdSchin	#if !defined(DBL_MIN) && defined(MINDOUBLE)
121da2e3ebdSchin	#define DBL_MIN		MINDOUBLE
122da2e3ebdSchin	#endif
123da2e3ebdSchin	#if !defined(DBL_MAX_EXP) && defined(DMAXEXP)
124da2e3ebdSchin	#define DBL_MAX_EXP	DMAXEXP
125da2e3ebdSchin	#endif
126da2e3ebdSchin	#if !defined(DBL_MAX) && defined(MAXDOUBLE)
127da2e3ebdSchin	#define DBL_MAX		MAXDOUBLE
128da2e3ebdSchin	#endif
129da2e3ebdSchin
130da2e3ebdSchin	<<"#include <ast_common.h>">>
131da2e3ebdSchin	#if _hdr_float
132da2e3ebdSchin	<<"#include <float.h>">>
133da2e3ebdSchin	#endif
134da2e3ebdSchin	#if _hdr_math
135da2e3ebdSchin	<<"#include <math.h>">>
136da2e3ebdSchin	#endif
137da2e3ebdSchin	#ifdef FLT_DIG
138da2e3ebdSchin	<<"#ifndef FLT_DIG">>
139da2e3ebdSchin	<<"#define FLT_DIG">>		FLT_DIG
140da2e3ebdSchin	<<"#endif">>
141da2e3ebdSchin	#endif
142da2e3ebdSchin	#ifdef FLT_MAX
143da2e3ebdSchin	<<"#ifndef FLT_MAX">>
144da2e3ebdSchin	<<"#define FLT_MAX">>		FLT_MAX
145da2e3ebdSchin	<<"#endif">>
146da2e3ebdSchin	#endif
147da2e3ebdSchin	#ifdef FLT_MAX_10_EXP
148da2e3ebdSchin	<<"#ifndef FLT_MAX_10_EXP">>
149da2e3ebdSchin	<<"#define FLT_MAX_10_EXP">>	FLT_MAX_10_EXP
150da2e3ebdSchin	<<"#endif">>
151da2e3ebdSchin	#endif
152da2e3ebdSchin	#ifdef FLT_MAX_EXP
153da2e3ebdSchin	<<"#ifndef FLT_MAX_EXP">>
154da2e3ebdSchin	<<"#define FLT_MAX_EXP">>	FLT_MAX_EXP
155da2e3ebdSchin	<<"#endif">>
156da2e3ebdSchin	#endif
157da2e3ebdSchin	#ifdef FLT_MIN
158da2e3ebdSchin	<<"#ifndef FLT_MIN">>
159da2e3ebdSchin	<<"#define FLT_MIN">>		FLT_MIN
160da2e3ebdSchin	<<"#endif">>
161da2e3ebdSchin	#endif
162da2e3ebdSchin	#ifdef FLT_MIN_10_EXP
163da2e3ebdSchin	<<"#ifndef FLT_MIN_10_EXP">>
164da2e3ebdSchin	<<"#define FLT_MIN_10_EXP">>	FLT_MIN_10_EXP
165da2e3ebdSchin	<<"#endif">>
166da2e3ebdSchin	#endif
167da2e3ebdSchin	#ifdef FLT_MIN_EXP
168da2e3ebdSchin	<<"#ifndef FLT_MIN_EXP">>
169da2e3ebdSchin	<<"#define FLT_MIN_EXP">>	FLT_MIN_EXP
170da2e3ebdSchin	<<"#endif">>
171da2e3ebdSchin	#endif
172da2e3ebdSchin
173da2e3ebdSchin	#ifdef DBL_DIG
174da2e3ebdSchin	<<"#ifndef DBL_DIG">>
175da2e3ebdSchin	<<"#define DBL_DIG">>		DBL_DIG
176da2e3ebdSchin	<<"#endif">>
177da2e3ebdSchin	#endif
178da2e3ebdSchin	#ifdef DBL_MAX
179da2e3ebdSchin	<<"#ifndef DBL_MAX">>
180da2e3ebdSchin	<<"#define DBL_MAX">>		DBL_MAX
181da2e3ebdSchin	<<"#endif">>
182da2e3ebdSchin	#endif
183da2e3ebdSchin	#ifdef DBL_MAX_10_EXP
184da2e3ebdSchin	<<"#ifndef DBL_MAX_10_EXP">>
185da2e3ebdSchin	<<"#define DBL_MAX_10_EXP">>	DBL_MAX_10_EXP
186da2e3ebdSchin	<<"#endif">>
187da2e3ebdSchin	#endif
188da2e3ebdSchin	#ifdef DBL_MAX_EXP
189da2e3ebdSchin	<<"#ifndef DBL_MAX_EXP">>
190da2e3ebdSchin	<<"#define DBL_MAX_EXP">>	DBL_MAX_EXP
191da2e3ebdSchin	<<"#endif">>
192da2e3ebdSchin	#endif
193da2e3ebdSchin	#ifdef DBL_MIN
194da2e3ebdSchin	<<"#ifndef DBL_MIN">>
195da2e3ebdSchin	<<"#define DBL_MIN">>		DBL_MIN
196da2e3ebdSchin	<<"#endif">>
197da2e3ebdSchin	#endif
198da2e3ebdSchin	#ifdef DBL_MIN_10_EXP
199da2e3ebdSchin	<<"#ifndef DBL_MIN_10_EXP">>
200da2e3ebdSchin	<<"#define DBL_MIN_10_EXP">>	DBL_MIN_10_EXP
201da2e3ebdSchin	<<"#endif">>
202da2e3ebdSchin	#endif
203da2e3ebdSchin	#ifdef DBL_MIN_EXP
204da2e3ebdSchin	<<"#ifndef DBL_MIN_EXP">>
205da2e3ebdSchin	<<"#define DBL_MIN_EXP">>	DBL_MIN_EXP
206da2e3ebdSchin	<<"#endif">>
207da2e3ebdSchin	#endif
208da2e3ebdSchin
209da2e3ebdSchin	#ifdef LDBL_DIG
210da2e3ebdSchin	<<"#ifndef LDBL_DIG">>
211da2e3ebdSchin	<<"#define LDBL_DIG">>		LDBL_DIG
212da2e3ebdSchin	<<"#endif">>
213da2e3ebdSchin	#endif
214da2e3ebdSchin	#ifdef LDBL_MAX
215da2e3ebdSchin	<<"#ifndef LDBL_MAX">>
216da2e3ebdSchin	<<"#define LDBL_MAX">>		LDBL_MAX
217da2e3ebdSchin	<<"#endif">>
218da2e3ebdSchin	#endif
219da2e3ebdSchin	#ifdef LDBL_MAX_10_EXP
220da2e3ebdSchin	<<"#ifndef LDBL_MAX_10_EXP">>
221da2e3ebdSchin	<<"#define LDBL_MAX_10_EXP">>	LDBL_MAX_10_EXP
222da2e3ebdSchin	<<"#endif">>
223da2e3ebdSchin	#endif
224da2e3ebdSchin	#ifdef LDBL_MAX_EXP
225da2e3ebdSchin	<<"#ifndef LDBL_MAX_EXP">>
226da2e3ebdSchin	<<"#define LDBL_MAX_EXP">>	LDBL_MAX_EXP
227da2e3ebdSchin	<<"#endif">>
228da2e3ebdSchin	#endif
229da2e3ebdSchin	#ifdef LDBL_MIN
230da2e3ebdSchin	<<"#ifndef LDBL_MIN">>
231da2e3ebdSchin	<<"#define LDBL_MIN">>		LDBL_MIN
232da2e3ebdSchin	<<"#endif">>
233da2e3ebdSchin	#endif
234da2e3ebdSchin	#ifdef LDBL_MIN_10_EXP
235da2e3ebdSchin	<<"#ifndef LDBL_MIN_10_EXP">>
236da2e3ebdSchin	<<"#define LDBL_MIN_10_EXP">>	LDBL_MIN_10_EXP
237da2e3ebdSchin	<<"#endif">>
238da2e3ebdSchin	#endif
239da2e3ebdSchin	#ifdef LDBL_MIN_EXP
240da2e3ebdSchin	<<"#ifndef LDBL_MIN_EXP">>
241da2e3ebdSchin	<<"#define LDBL_MIN_EXP">>	LDBL_MIN_EXP
242da2e3ebdSchin	<<"#endif">>
243da2e3ebdSchin	#endif
244da2e3ebdSchin}end
245da2e3ebdSchin
246da2e3ebdSchintst	- note{ missing floating point limits }end output{
247da2e3ebdSchin	#include "FEATURE/common"
2487c2fbfb3SApril Chin	#include <stdio.h>
249da2e3ebdSchin	#if _hdr_float
250da2e3ebdSchin	#include <float.h>
251da2e3ebdSchin	#endif
252da2e3ebdSchin	#if _hdr_limits
253da2e3ebdSchin	#include <limits.h>
254da2e3ebdSchin	#endif
255da2e3ebdSchin	#if _hdr_math
256da2e3ebdSchin	#include <math.h>
257da2e3ebdSchin	#endif
258da2e3ebdSchin	#if _hdr_values
259da2e3ebdSchin	#include <values.h>
260da2e3ebdSchin	#endif
261da2e3ebdSchin	#include <signal.h>
262da2e3ebdSchin	#ifdef SIGFPE
263da2e3ebdSchin	static int caught = 0;
264da2e3ebdSchin	#if _STD_
265da2e3ebdSchin	static void catch(int sig)
266da2e3ebdSchin	#else
267da2e3ebdSchin	static void catch(sig) int sig;
268da2e3ebdSchin	#endif
269da2e3ebdSchin	{
270da2e3ebdSchin		signal(sig, SIG_IGN);
271da2e3ebdSchin		caught++;
272da2e3ebdSchin	}
273da2e3ebdSchin	#endif
274da2e3ebdSchin	int
275da2e3ebdSchin	main()
276da2e3ebdSchin	{
277da2e3ebdSchin		register int		i;
278da2e3ebdSchin		register int		s;
279da2e3ebdSchin		float			f;
280da2e3ebdSchin		float			pf;
281da2e3ebdSchin		float			mf;
282da2e3ebdSchin		float			xf;
283da2e3ebdSchin		double			d;
284da2e3ebdSchin		double			pd;
285da2e3ebdSchin		double			md;
286da2e3ebdSchin		char*			fp;
287da2e3ebdSchin	#if _ast_fltmax_double
288da2e3ebdSchin		char*			fs = "";
289da2e3ebdSchin		char*			ds = "";
290da2e3ebdSchin	#else
291da2e3ebdSchin		_ast_fltmax_t		l;
292da2e3ebdSchin		_ast_fltmax_t		pl;
293da2e3ebdSchin		_ast_fltmax_t		ml;
294da2e3ebdSchin		char*			fs = "F";
295da2e3ebdSchin		char*			ds = "";
296da2e3ebdSchin		char*			ls = "L";
297da2e3ebdSchin	#endif
298da2e3ebdSchin		unsigned long		u;
299da2e3ebdSchin		unsigned _ast_intmax_t	w;
300da2e3ebdSchin		unsigned _ast_intmax_t	pw;
301da2e3ebdSchin		unsigned _ast_intmax_t	x;
302da2e3ebdSchin		unsigned short		us;
303da2e3ebdSchin		unsigned int		ui;
304da2e3ebdSchin		unsigned long		ul;
305da2e3ebdSchin		unsigned _ast_intmax_t	uq;
306da2e3ebdSchin
307da2e3ebdSchin	#ifdef SIGFPE
308da2e3ebdSchin		signal(SIGFPE, catch);
309da2e3ebdSchin	#endif
310da2e3ebdSchin		printf("\n");
311da2e3ebdSchin		printf("\n");
312da2e3ebdSchin		us = 0;
313da2e3ebdSchin		us = ~us;
314da2e3ebdSchin		i = 0;
315da2e3ebdSchin		while (us /= 10)
316da2e3ebdSchin			i++;
317da2e3ebdSchin		printf("#define USHRT_DIG		%d\n", i);
318da2e3ebdSchin		ui = 0;
319da2e3ebdSchin		ui = ~ui;
320da2e3ebdSchin		i = 0;
321da2e3ebdSchin		while (ui /= 10)
322da2e3ebdSchin			i++;
323da2e3ebdSchin		printf("#define UINT_DIG		%d\n", i);
324da2e3ebdSchin		ul = 0;
325da2e3ebdSchin		ul = ~ul;
326da2e3ebdSchin		i = 0;
327da2e3ebdSchin		while (ul /= 10)
328da2e3ebdSchin			i++;
329da2e3ebdSchin		printf("#define ULONG_DIG		%d\n", i);
330da2e3ebdSchin		if (sizeof(uq) > sizeof(ul))
331da2e3ebdSchin		{
332da2e3ebdSchin			uq = 0;
333da2e3ebdSchin			uq = ~uq;
334da2e3ebdSchin			i = 0;
335da2e3ebdSchin			while (uq /= 10)
336da2e3ebdSchin				i++;
337da2e3ebdSchin			printf("#define ULLONG_DIG		%d\n", i);
338da2e3ebdSchin			printf("#define UINTMAX_DIG		ULLONG_DIG\n");
339da2e3ebdSchin		}
340da2e3ebdSchin		else
341da2e3ebdSchin			printf("#define UINTMAX_DIG		ULONG_DIG\n");
342da2e3ebdSchin		printf("\n");
343da2e3ebdSchin		w = 1;
344da2e3ebdSchin		do
345da2e3ebdSchin		{
346da2e3ebdSchin			pw = w;
347da2e3ebdSchin			w *= 2;
348da2e3ebdSchin			f = (_ast_intmax_t)w;
349da2e3ebdSchin			x = (_ast_intmax_t)f;
350da2e3ebdSchin		} while (w > pw && w == x);
351da2e3ebdSchin		w = (pw - 1) + pw;
352da2e3ebdSchin		u = ~0;
353da2e3ebdSchin		if (u > w)
354da2e3ebdSchin			u = w;
355da2e3ebdSchin		printf("#define FLT_ULONG_MAX		%lu.0F\n", u);
356da2e3ebdSchin		if (sizeof(w) > sizeof(u))
357da2e3ebdSchin		{
358da2e3ebdSchin			printf("#define FLT_ULLONG_MAX		%llu.0F\n", w);
359da2e3ebdSchin			printf("#define FLT_UINTMAX_MAX		FLT_ULLONG_MAX\n");
360da2e3ebdSchin		}
361da2e3ebdSchin		else
362da2e3ebdSchin		{
363da2e3ebdSchin			printf("#define FLT_ULLONG_MAX		FLT_ULONG_MAX\n");
364da2e3ebdSchin			printf("#define FLT_UINTMAX_MAX		FLT_ULONG_MAX\n");
365da2e3ebdSchin		}
366da2e3ebdSchin		u /= 2;
367da2e3ebdSchin		w /= 2;
368da2e3ebdSchin		printf("#define FLT_LONG_MAX		%lu.0F\n", u);
369da2e3ebdSchin		if (sizeof(w) > sizeof(u))
370da2e3ebdSchin		{
371da2e3ebdSchin			printf("#define FLT_LLONG_MAX		%llu.0F\n", w);
372da2e3ebdSchin			printf("#define FLT_INTMAX_MAX		FLT_LLONG_MAX\n");
373da2e3ebdSchin		}
374da2e3ebdSchin		else
375da2e3ebdSchin		{
376da2e3ebdSchin			printf("#define FLT_LLONG_MAX		FLT_LONG_MAX\n");
377da2e3ebdSchin			printf("#define FLT_INTMAX_MAX		FLT_LONG_MAX\n");
378da2e3ebdSchin		}
379da2e3ebdSchin		u++;
380da2e3ebdSchin		w++;
381da2e3ebdSchin		printf("#define FLT_LONG_MIN		(-%lu.0F)\n", u);
382da2e3ebdSchin		if (sizeof(w) > sizeof(u))
383da2e3ebdSchin		{
384da2e3ebdSchin			printf("#define FLT_LLONG_MIN		(-%llu.0F)\n", w);
385da2e3ebdSchin			printf("#define FLT_INTMAX_MIN		FLT_LLONG_MIN\n");
386da2e3ebdSchin		}
387da2e3ebdSchin		else
388da2e3ebdSchin		{
389da2e3ebdSchin			printf("#define FLT_LLONG_MIN		FLT_LONG_MIN\n");
390da2e3ebdSchin			printf("#define FLT_INTMAX_MIN		FLT_LONG_MIN\n");
391da2e3ebdSchin		}
392da2e3ebdSchin	#ifdef FLT_DIG
393da2e3ebdSchin		s = FLT_DIG;
394da2e3ebdSchin	#else
395da2e3ebdSchin		f = pf = 1.0;
396da2e3ebdSchin		s = -1;
397da2e3ebdSchin		do
398da2e3ebdSchin		{
399da2e3ebdSchin			s++;
400da2e3ebdSchin			f *= 10.0;
401da2e3ebdSchin		} while (f != (f + pf));
402da2e3ebdSchin	#endif
403da2e3ebdSchin	#if defined(FLT_MIN) && defined(FLT_MIN_EXP)
404da2e3ebdSchin		i = FLT_MIN_EXP;
405da2e3ebdSchin		mf = FLT_MIN;
406da2e3ebdSchin	#else
407da2e3ebdSchin		i = 3;
408da2e3ebdSchin		f = pf = 1.0;
409da2e3ebdSchin		do
410da2e3ebdSchin		{
411da2e3ebdSchin			i--;
412da2e3ebdSchin			mf = pf;
413da2e3ebdSchin			pf = f;
414da2e3ebdSchin			f /= 2.0;
415da2e3ebdSchin		} while (f < pf);
416da2e3ebdSchin	#ifdef FLT_MIN_EXP
417da2e3ebdSchin		i = FLT_MIN_EXP;
418da2e3ebdSchin	#endif
419da2e3ebdSchin	#ifdef FLT_MIN
420da2e3ebdSchin		mf = FLT_MIN;
421da2e3ebdSchin	#endif
422da2e3ebdSchin	#endif
423da2e3ebdSchin	#ifndef FLT_DIG
424da2e3ebdSchin		printf("#ifndef FLT_DIG\n");
425da2e3ebdSchin		printf("#define FLT_DIG			%d\n", s);
426da2e3ebdSchin		printf("#endif\n");
427da2e3ebdSchin	#endif
428da2e3ebdSchin	#ifndef FLT_MIN
429da2e3ebdSchin		printf("#ifndef FLT_MIN\n");
430da2e3ebdSchin		printf("#define FLT_MIN			%.*E%s\n", s + 1, mf, fs);
431da2e3ebdSchin		printf("#endif\n");
432da2e3ebdSchin	#endif
433da2e3ebdSchin	#ifndef FLT_MIN_EXP
434da2e3ebdSchin		printf("#ifndef FLT_MIN_EXP\n");
435da2e3ebdSchin		printf("#define FLT_MIN_EXP		(%d)\n", i);
436da2e3ebdSchin		printf("#endif\n");
437da2e3ebdSchin	#endif
438da2e3ebdSchin
439da2e3ebdSchin	#if defined(FLT_MAX) && defined(FLT_MAX_EXP)
440da2e3ebdSchin		i = FLT_MAX_EXP;
441da2e3ebdSchin		f = FLT_MAX;
442da2e3ebdSchin	#else
443da2e3ebdSchin		i = -1;
444da2e3ebdSchin		f = pf = 1.0;
445da2e3ebdSchin		do
446da2e3ebdSchin		{
447da2e3ebdSchin			i++;
448da2e3ebdSchin			mf = pf;
449da2e3ebdSchin			pf = f;
450da2e3ebdSchin			f *= 2.0;
451da2e3ebdSchin		} while (f > pf);
452da2e3ebdSchin	#ifdef FLT_MAX_EXP
453da2e3ebdSchin		i = FLT_MAX_EXP;
454da2e3ebdSchin	#endif
455da2e3ebdSchin	#ifdef FLT_MAX
456da2e3ebdSchin		f = FLT_MAX;
457da2e3ebdSchin	#endif
458da2e3ebdSchin	#endif
459da2e3ebdSchin	#ifdef FLT_MAX_EXP
460da2e3ebdSchin		i = FLT_MAX_EXP;
461da2e3ebdSchin	#else
462da2e3ebdSchin		f = 1;
463da2e3ebdSchin		do
464da2e3ebdSchin		{
465da2e3ebdSchin			f *= 2.0;
466da2e3ebdSchin		} while (mf == (mf + f));
467da2e3ebdSchin		f = (mf - f) * 2.0 + f;
468da2e3ebdSchin	#endif
469da2e3ebdSchin		xf = f;
470da2e3ebdSchin	#ifndef FLT_MAX
471da2e3ebdSchin		printf("#ifndef FLT_MAX\n");
472da2e3ebdSchin		printf("#define FLT_MAX			%.*E%s\n", s + 1, f, fs);
473da2e3ebdSchin		printf("#endif\n");
474da2e3ebdSchin	#endif
475da2e3ebdSchin	#ifndef FLT_MAX_EXP
476da2e3ebdSchin		printf("#ifndef FLT_MAX_EXP\n");
477da2e3ebdSchin		printf("#define FLT_MAX_EXP		%d\n", i);
478da2e3ebdSchin		printf("#endif\n");
479da2e3ebdSchin	#endif
480da2e3ebdSchin
481da2e3ebdSchin	#ifdef FLT_MIN_10_EXP
482da2e3ebdSchin		i = FLT_MIN_10_EXP;
483da2e3ebdSchin	#else
484da2e3ebdSchin		i = 2;
485da2e3ebdSchin		f = 1.0;
486da2e3ebdSchin		do
487da2e3ebdSchin		{
488da2e3ebdSchin			i--;
489da2e3ebdSchin			pf = f;
490da2e3ebdSchin			f /= 10.0;
491da2e3ebdSchin		} while (f < pf);
492da2e3ebdSchin	#endif
493da2e3ebdSchin	#ifndef FLT_MIN_10_EXP
494da2e3ebdSchin		printf("#ifndef FLT_MIN_10_EXP\n");
495da2e3ebdSchin		printf("#define FLT_MIN_10_EXP		(%d)\n", i);
496da2e3ebdSchin		printf("#endif\n");
497da2e3ebdSchin	#endif
498da2e3ebdSchin
499da2e3ebdSchin	#ifdef FLT_MAX_10_EXP
500da2e3ebdSchin		i = FLT_MAX_10_EXP;
501da2e3ebdSchin	#else
502da2e3ebdSchin		i = -2;
503da2e3ebdSchin		f = 1.0;
504da2e3ebdSchin		do
505da2e3ebdSchin		{
506da2e3ebdSchin			i++;
507da2e3ebdSchin			pf = f;
508da2e3ebdSchin			f *= 10.0;
509da2e3ebdSchin		} while (f > pf);
510da2e3ebdSchin	#endif
511da2e3ebdSchin	#ifndef FLT_MAX_10_EXP
512da2e3ebdSchin		printf("#ifndef FLT_MAX_10_EXP\n");
513da2e3ebdSchin		printf("#define FLT_MAX_10_EXP		%d\n", i);
514da2e3ebdSchin		printf("#endif\n");
515da2e3ebdSchin	#endif
516da2e3ebdSchin
517da2e3ebdSchin		printf("\n");
518da2e3ebdSchin		w = 1;
519da2e3ebdSchin		do
520da2e3ebdSchin		{
521da2e3ebdSchin			pw = w;
522da2e3ebdSchin			w *= 2;
523da2e3ebdSchin			d = (_ast_intmax_t)w;
524da2e3ebdSchin			x = (_ast_intmax_t)d;
525da2e3ebdSchin		} while (w > pw && w == x);
526da2e3ebdSchin		w = (pw - 1) + pw;
527da2e3ebdSchin		u = ~0;
528da2e3ebdSchin		if (u > w)
529da2e3ebdSchin			u = w;
530da2e3ebdSchin		printf("#define DBL_ULONG_MAX		%lu.0\n", u);
531da2e3ebdSchin		if (sizeof(w) > sizeof(u))
532da2e3ebdSchin		{
533da2e3ebdSchin			printf("#define DBL_ULLONG_MAX		%llu.0\n", w);
534da2e3ebdSchin			printf("#define DBL_UINTMAX_MAX		DBL_ULLONG_MAX\n");
535da2e3ebdSchin		}
536da2e3ebdSchin		else
537da2e3ebdSchin		{
538da2e3ebdSchin			printf("#define DBL_ULLONG_MAX		DBL_ULONG_MAX\n");
539da2e3ebdSchin			printf("#define DBL_UINTMAX_MAX		DBL_ULONG_MAX\n");
540da2e3ebdSchin		}
541da2e3ebdSchin		u /= 2;
542da2e3ebdSchin		w /= 2;
543da2e3ebdSchin		printf("#define DBL_LONG_MAX		%lu.0\n", u);
544da2e3ebdSchin		if (sizeof(w) > sizeof(u))
545da2e3ebdSchin		{
546da2e3ebdSchin			printf("#define DBL_LLONG_MAX		%llu.0\n", w);
547da2e3ebdSchin			printf("#define DBL_INTMAX_MAX		DBL_LLONG_MAX\n");
548da2e3ebdSchin		}
549da2e3ebdSchin		else
550da2e3ebdSchin		{
551da2e3ebdSchin			printf("#define DBL_LLONG_MAX		DBL_LONG_MAX\n");
552da2e3ebdSchin			printf("#define DBL_INTMAX_MAX		DBL_LONG_MAX\n");
553da2e3ebdSchin		}
554da2e3ebdSchin		u++;
555da2e3ebdSchin		w++;
556da2e3ebdSchin		printf("#define DBL_LONG_MIN		(-%lu.0)\n", u);
557da2e3ebdSchin		if (sizeof(w) > sizeof(u))
558da2e3ebdSchin		{
559da2e3ebdSchin			printf("#define DBL_LLONG_MIN		(-%llu.0)\n", w);
560da2e3ebdSchin			printf("#define DBL_INTMAX_MIN		DBL_LLONG_MIN\n");
561da2e3ebdSchin		}
562da2e3ebdSchin		else
563da2e3ebdSchin		{
564da2e3ebdSchin			printf("#define DBL_LLONG_MIN		DBL_LONG_MIN\n");
565da2e3ebdSchin			printf("#define DBL_INTMAX_MIN		DBL_LONG_MIN\n");
566da2e3ebdSchin		}
567da2e3ebdSchin	#ifdef DBL_DIG
568da2e3ebdSchin		s = DBL_DIG;
569da2e3ebdSchin	#else
570da2e3ebdSchin		d = pd = 1.0;
571da2e3ebdSchin		s = -1;
572da2e3ebdSchin		do
573da2e3ebdSchin		{
574da2e3ebdSchin			s++;
575da2e3ebdSchin			d *= 10.0;
576da2e3ebdSchin		} while (d != (d + pd));
577da2e3ebdSchin	#endif
578da2e3ebdSchin	#if defined(DBL_MIN) && defined(DBL_MIN_EXP)
579da2e3ebdSchin		i = DBL_MIN_EXP;
580da2e3ebdSchin		md = DBL_MIN;
581da2e3ebdSchin	#else
582da2e3ebdSchin		i = 3;
583da2e3ebdSchin		d = pd = 1.0;
584da2e3ebdSchin		do
585da2e3ebdSchin		{
586da2e3ebdSchin			i--;
587da2e3ebdSchin			md = pd;
588da2e3ebdSchin			pd = d;
589da2e3ebdSchin			d /= 2.0;
590da2e3ebdSchin		} while (d < pd);
591da2e3ebdSchin	#ifdef DBL_MIN_EXP
592da2e3ebdSchin		i = DBL_MIN_EXP;
593da2e3ebdSchin	#endif
594da2e3ebdSchin	#ifdef DBL_MIN
595da2e3ebdSchin		md = DBL_MIN;
596da2e3ebdSchin	#endif
597da2e3ebdSchin	#endif
598da2e3ebdSchin	#ifndef DBL_DIG
599da2e3ebdSchin		printf("#ifndef DBL_DIG\n");
600da2e3ebdSchin		printf("#define DBL_DIG			%d\n", s);
601da2e3ebdSchin		printf("#endif\n");
602da2e3ebdSchin	#endif
603da2e3ebdSchin	#ifndef DBL_MIN
604da2e3ebdSchin		printf("#ifndef DBL_MIN\n");
605da2e3ebdSchin		printf("#define DBL_MIN			%.*E%s\n", s + 1, md, ds);
606da2e3ebdSchin		printf("#endif\n");
607da2e3ebdSchin	#endif
608da2e3ebdSchin	#ifndef DBL_MIN_EXP
609da2e3ebdSchin		printf("#ifndef DBL_MIN_EXP\n");
610da2e3ebdSchin		printf("#define DBL_MIN_EXP		(%d)\n", i);
611da2e3ebdSchin		printf("#endif\n");
612da2e3ebdSchin	#endif
613da2e3ebdSchin
614da2e3ebdSchin	#if defined(DBL_MAX) && defined(DBL_MAX_EXP)
615da2e3ebdSchin		i = DBL_MAX_EXP;
616da2e3ebdSchin		d = DBL_MAX;
617da2e3ebdSchin	#else
618da2e3ebdSchin		i = -1;
619da2e3ebdSchin		d = pd = 1.0;
620da2e3ebdSchin		do
621da2e3ebdSchin		{
622da2e3ebdSchin			i++;
623da2e3ebdSchin			md = pd;
624da2e3ebdSchin			pd = d;
625da2e3ebdSchin			d *= 2.0;
626da2e3ebdSchin		} while (d > pd);
627da2e3ebdSchin		d = 1.0;
628da2e3ebdSchin		do
629da2e3ebdSchin		{
630da2e3ebdSchin			d *= 2.0;
631da2e3ebdSchin		} while (md == (md + d));
632da2e3ebdSchin		d = (md - d) * 2.0 + d;
633da2e3ebdSchin	#ifdef DBL_MAX_EXP
634da2e3ebdSchin		i = DBL_MAX_EXP;
635da2e3ebdSchin	#endif
636da2e3ebdSchin	#ifdef DBL_MAX
637da2e3ebdSchin		d = DBL_MAX;
638da2e3ebdSchin	#endif
639da2e3ebdSchin	#endif
640da2e3ebdSchin	#ifndef DBL_MAX
641da2e3ebdSchin		printf("#ifndef DBL_MAX\n");
642da2e3ebdSchin		printf("#define DBL_MAX			%.*E%s\n", s + 1, d, ds);
643da2e3ebdSchin		printf("#endif\n");
644da2e3ebdSchin	#endif
645da2e3ebdSchin	#ifndef DBL_MAX_EXP
646da2e3ebdSchin		printf("#ifndef DBL_MAX_EXP\n");
647da2e3ebdSchin		printf("#define DBL_MAX_EXP		%d\n", i);
648da2e3ebdSchin		printf("#endif\n");
649da2e3ebdSchin	#endif
650da2e3ebdSchin
651da2e3ebdSchin	#ifdef DBL_MIN_10_EXP
652da2e3ebdSchin		i = DBL_MIN_10_EXP;
653da2e3ebdSchin	#else
654da2e3ebdSchin		i = 2;
655da2e3ebdSchin		d = 1.0;
656da2e3ebdSchin		do
657da2e3ebdSchin		{
658da2e3ebdSchin			i--;
659da2e3ebdSchin			pd = d;
660da2e3ebdSchin			d /= 10.0;
661da2e3ebdSchin		} while (d < pd);
662da2e3ebdSchin	#endif
663da2e3ebdSchin	#ifndef DBL_MIN_10_EXP
664da2e3ebdSchin		printf("#ifndef DBL_MIN_10_EXP\n");
665da2e3ebdSchin		printf("#define DBL_MIN_10_EXP		(%d)\n", i);
666da2e3ebdSchin		printf("#endif\n");
667da2e3ebdSchin	#endif
668da2e3ebdSchin
669da2e3ebdSchin	#ifdef DBL_MAX_10_EXP
670da2e3ebdSchin		i = DBL_MAX_10_EXP;
671da2e3ebdSchin	#else
672da2e3ebdSchin		i = -2;
673da2e3ebdSchin		d = 1.0;
674da2e3ebdSchin		do
675da2e3ebdSchin		{
676da2e3ebdSchin			i++;
677da2e3ebdSchin			pd = d;
678da2e3ebdSchin			d *= 10.0;
679da2e3ebdSchin		} while (d > pd);
680da2e3ebdSchin	#endif
681da2e3ebdSchin	#ifndef DBL_MAX_10_EXP
682da2e3ebdSchin		printf("#ifndef DBL_MAX_10_EXP\n");
683da2e3ebdSchin		printf("#define DBL_MAX_10_EXP		%d\n", i);
684da2e3ebdSchin		printf("#endif\n");
685da2e3ebdSchin	#endif
686da2e3ebdSchin
687da2e3ebdSchin	#if !_ast_fltmax_double
688da2e3ebdSchin		printf("\n");
689da2e3ebdSchin		w = 1;
690da2e3ebdSchin		do
691da2e3ebdSchin		{
692da2e3ebdSchin			pw = w;
693da2e3ebdSchin			w *= 2;
694da2e3ebdSchin			l = (_ast_intmax_t)w;
695da2e3ebdSchin			x = (_ast_intmax_t)l;
696da2e3ebdSchin		} while (w > pw && w == x);
697da2e3ebdSchin		w = (pw - 1) + pw;
698da2e3ebdSchin		u = ~0;
699da2e3ebdSchin		if (u > w)
700da2e3ebdSchin			u = w;
701da2e3ebdSchin		printf("#define LDBL_ULONG_MAX		%lu.0L\n", u);
702da2e3ebdSchin		if (sizeof(w) > sizeof(u))
703da2e3ebdSchin		{
704da2e3ebdSchin			printf("#define LDBL_ULLONG_MAX		%llu.0L\n", w);
705da2e3ebdSchin			printf("#define LDBL_UINTMAX_MAX	LDBL_ULLONG_MAX\n");
706da2e3ebdSchin		}
707da2e3ebdSchin		else
708da2e3ebdSchin		{
709da2e3ebdSchin			printf("#define LDBL_ULLONG_MAX		LDBL_ULONG_MAX\n");
710da2e3ebdSchin			printf("#define LDBL_UINTMAX_MAX	LDBL_ULONG_MAX\n");
711da2e3ebdSchin		}
712da2e3ebdSchin		u /= 2;
713da2e3ebdSchin		w /= 2;
714da2e3ebdSchin		printf("#define LDBL_LONG_MAX		%lu.0L\n", u);
715da2e3ebdSchin		if (sizeof(w) > sizeof(u))
716da2e3ebdSchin		{
717da2e3ebdSchin			printf("#define LDBL_LLONG_MAX		%llu.0L\n", w);
718da2e3ebdSchin			printf("#define LDBL_INTMAX_MAX		LDBL_LLONG_MAX\n");
719da2e3ebdSchin		}
720da2e3ebdSchin		else
721da2e3ebdSchin		{
722da2e3ebdSchin			printf("#define LDBL_LLONG_MAX		LDBL_LONG_MAX\n");
723da2e3ebdSchin			printf("#define LDBL_INTMAX_MAX		LDBL_LONG_MAX\n");
724da2e3ebdSchin		}
725da2e3ebdSchin		u++;
726da2e3ebdSchin		w++;
727da2e3ebdSchin		printf("#define LDBL_LONG_MIN		(-%lu.0L)\n", u);
728da2e3ebdSchin		if (sizeof(w) > sizeof(u))
729da2e3ebdSchin		{
730da2e3ebdSchin			printf("#define LDBL_LLONG_MIN		(-%llu.0L)\n", w);
731da2e3ebdSchin			printf("#define LDBL_INTMAX_MIN		LDBL_LLONG_MIN\n");
732da2e3ebdSchin		}
733da2e3ebdSchin		else
734da2e3ebdSchin		{
735da2e3ebdSchin			printf("#define LDBL_LLONG_MIN		LDBL_LONG_MIN\n");
736da2e3ebdSchin			printf("#define LDBL_INTMAX_MIN		LDBL_LONG_MIN\n");
737da2e3ebdSchin		}
738da2e3ebdSchin	#ifdef LDBL_DIG
739da2e3ebdSchin		s = LDBL_DIG;
740da2e3ebdSchin	#else
741da2e3ebdSchin		l = pl = 1.0L;
742da2e3ebdSchin		s = -1;
743da2e3ebdSchin		do
744da2e3ebdSchin		{
745da2e3ebdSchin			s++;
746da2e3ebdSchin			l *= 10.0L;
747da2e3ebdSchin		} while (l != (l + pl));
748da2e3ebdSchin	#endif
749da2e3ebdSchin	#if defined(LDBL_MIN) && defined(LDBL_MIN_EXP)
750da2e3ebdSchin		i = LDBL_MIN_EXP;
751da2e3ebdSchin		ml = LDBL_MIN;
752da2e3ebdSchin	#else
753da2e3ebdSchin		i = 3;
754da2e3ebdSchin		l = pl = 1.0L;
755da2e3ebdSchin		do
756da2e3ebdSchin		{
757da2e3ebdSchin			i--;
758da2e3ebdSchin			ml = pl;
759da2e3ebdSchin			pl = l;
760da2e3ebdSchin			l /= 2.0L;
761da2e3ebdSchin		} while (l < pl);
762da2e3ebdSchin	#ifdef LDBL_MIN_EXP
763da2e3ebdSchin		i = LDBL_MIN_EXP;
764da2e3ebdSchin	#endif
765da2e3ebdSchin	#ifdef LDBL_MIN
766da2e3ebdSchin		ml = LDBL_MIN;
767da2e3ebdSchin	#endif
768da2e3ebdSchin	#endif
769da2e3ebdSchin	#ifndef LDBL_DIG
770da2e3ebdSchin		printf("#ifndef LDBL_DIG\n");
771da2e3ebdSchin		printf("#define LDBL_DIG		%d\n", s);
772da2e3ebdSchin		printf("#endif\n");
773da2e3ebdSchin	#endif
774da2e3ebdSchin	#ifndef LDBL_MIN
775da2e3ebdSchin		printf("#ifndef LDBL_MIN\n");
776da2e3ebdSchin		printf("#define LDBL_MIN		%.*LE%s\n", s + 1, ml, ls);
777da2e3ebdSchin		printf("#endif\n");
778da2e3ebdSchin	#endif
779da2e3ebdSchin	#ifndef LDBL_MIN_EXP
780da2e3ebdSchin		printf("#ifndef LDBL_MIN_EXP\n");
781da2e3ebdSchin		printf("#define LDBL_MIN_EXP		(%d)\n", i);
782da2e3ebdSchin		printf("#endif\n");
783da2e3ebdSchin	#endif
784da2e3ebdSchin
785da2e3ebdSchin	#if defined(LDBL_MAX) && defined(LDBL_MAX_EXP)
786da2e3ebdSchin		i = LDBL_MAX_EXP;
787da2e3ebdSchin		l = LDBL_MAX;
788da2e3ebdSchin	#else
789da2e3ebdSchin		i = -1;
790da2e3ebdSchin		l = pl = 1.0L;
791da2e3ebdSchin		do
792da2e3ebdSchin		{
793da2e3ebdSchin			i++;
794da2e3ebdSchin			ml = pl;
795da2e3ebdSchin			pl = l;
796da2e3ebdSchin			l *= 2.0L;
797da2e3ebdSchin		} while (l > pl);
798da2e3ebdSchin		l = 1.0L;
799da2e3ebdSchin		do
800da2e3ebdSchin		{
801da2e3ebdSchin			l *= 2.0L;
802da2e3ebdSchin		} while (ml == (ml + l));
803da2e3ebdSchin		l = (ml - l) * 2.0L + l;
804da2e3ebdSchin	#ifdef LDBL_MAX_EXP
805da2e3ebdSchin		i = LDBL_MAX_EXP;
806da2e3ebdSchin	#endif
807da2e3ebdSchin	#ifdef LDBL_MAX
808da2e3ebdSchin		l = LDBL_MAX;
809da2e3ebdSchin	#endif
810da2e3ebdSchin	#endif
811da2e3ebdSchin	#ifndef LDBL_MAX
812da2e3ebdSchin		printf("#ifndef LDBL_MAX\n");
813da2e3ebdSchin		printf("#define LDBL_MAX		%.*LE%s\n", s + 1, l, ls);
814da2e3ebdSchin		printf("#endif\n");
815da2e3ebdSchin	#endif
816da2e3ebdSchin	#ifndef LDBL_MAX_EXP
817da2e3ebdSchin		printf("#ifndef LDBL_MAX_EXP\n");
818da2e3ebdSchin		printf("#define LDBL_MAX_EXP		%d\n", i);
819da2e3ebdSchin		printf("#endif\n");
820da2e3ebdSchin	#endif
821da2e3ebdSchin
822da2e3ebdSchin	#ifdef LDBL_MIN_10_EXP
823da2e3ebdSchin		i = LDBL_MIN_10_EXP;
824da2e3ebdSchin	#else
825da2e3ebdSchin		i = 2;
826da2e3ebdSchin		l = 1.0L;
827da2e3ebdSchin		do
828da2e3ebdSchin		{
829da2e3ebdSchin			i--;
830da2e3ebdSchin			pl = l;
831da2e3ebdSchin			l /= 10.0L;
832da2e3ebdSchin		} while (l < pl);
833da2e3ebdSchin	#endif
834da2e3ebdSchin	#ifndef LDBL_MIN_10_EXP
835da2e3ebdSchin		printf("#ifndef LDBL_MIN_10_EXP\n");
836da2e3ebdSchin		printf("#define LDBL_MIN_10_EXP		(%d)\n", i);
837da2e3ebdSchin		printf("#endif\n");
838da2e3ebdSchin	#endif
839da2e3ebdSchin
840da2e3ebdSchin	#ifdef LDBL_MAX_10_EXP
841da2e3ebdSchin		i = LDBL_MAX_10_EXP;
842da2e3ebdSchin	#else
843da2e3ebdSchin		i = -2;
844da2e3ebdSchin		l = 1.0L;
845da2e3ebdSchin		do
846da2e3ebdSchin		{
847da2e3ebdSchin			i++;
848da2e3ebdSchin			pl = l;
849da2e3ebdSchin			l *= 10.0L;
850da2e3ebdSchin		} while (l > pl);
851da2e3ebdSchin	#endif
852da2e3ebdSchin	#ifndef LDBL_MAX_10_EXP
853da2e3ebdSchin		printf("#ifndef LDBL_MAX_10_EXP\n");
854da2e3ebdSchin		printf("#define LDBL_MAX_10_EXP		%d\n", i);
855da2e3ebdSchin		printf("#endif\n");
856da2e3ebdSchin	#endif
857da2e3ebdSchin		fp = "LDBL";
858da2e3ebdSchin	#else
859da2e3ebdSchin		fp = "DBL";
860da2e3ebdSchin	#endif
861da2e3ebdSchin
862da2e3ebdSchin	printf("\n");
863da2e3ebdSchin	printf("#define FLTMAX_UINTMAX_MAX	%s_UINTMAX_MAX\n", fp);
864da2e3ebdSchin	printf("#define FLTMAX_INTMAX_MAX	%s_INTMAX_MAX\n", fp);
865da2e3ebdSchin	printf("#define FLTMAX_INTMAX_MIN	%s_INTMAX_MIN\n", fp);
866da2e3ebdSchin
867da2e3ebdSchin	#ifdef SIGFPE
868da2e3ebdSchin		if (!caught)
869da2e3ebdSchin		{
870da2e3ebdSchin	#if !__MVS__
871da2e3ebdSchin			f = xf;
872da2e3ebdSchin			f *= 2;
873da2e3ebdSchin			if (!f)
874da2e3ebdSchin	#endif
875da2e3ebdSchin				caught = 1;
876da2e3ebdSchin		}
877da2e3ebdSchin		if (caught)
878da2e3ebdSchin			printf("\n#define _ast_fltsig		%d\n", SIGFPE);
879da2e3ebdSchin	#endif
880da2e3ebdSchin
881da2e3ebdSchin		printf("\n");
882*b30d1939SAndy Fiddaman	#if !_lib_frexp || _npt_frexp
883da2e3ebdSchin		printf("extern double		frexp(double, int*);\n");
884da2e3ebdSchin	#endif
885*b30d1939SAndy Fiddaman	#if !_lib_frexpl || _npt_frexpl
886da2e3ebdSchin		printf("extern _ast_fltmax_t	frexpl(_ast_fltmax_t, int*);\n");
887da2e3ebdSchin	#endif
888*b30d1939SAndy Fiddaman	#if !_lib_ldexp || _npt_ldexp
889da2e3ebdSchin		printf("extern double		ldexp(double, int);\n");
890da2e3ebdSchin	#endif
891*b30d1939SAndy Fiddaman	#if !_lib_ldexpl || _npt_ldexpl
892da2e3ebdSchin		printf("extern _ast_fltmax_t	ldexpl(_ast_fltmax_t, int);\n");
893da2e3ebdSchin	#endif
894da2e3ebdSchin
895da2e3ebdSchin		return 0;
896da2e3ebdSchin	}
897da2e3ebdSchin}end
898da2e3ebdSchin
899da2e3ebdSchintst	- note{ double exponent bitfoolery }end output{
900da2e3ebdSchin	#include "FEATURE/common"
9017c2fbfb3SApril Chin	#include <stdio.h>
902da2e3ebdSchin	typedef union _dbl_exp_u
903da2e3ebdSchin	{
904da2e3ebdSchin		unsigned _ast_int4_t	e[sizeof(double) / 4];
905da2e3ebdSchin		double			f;
906da2e3ebdSchin	} _ast_dbl_exp_t;
907da2e3ebdSchin	int
908da2e3ebdSchin	main()
909da2e3ebdSchin	{
910da2e3ebdSchin		int			i;
911da2e3ebdSchin		int			j;
912da2e3ebdSchin		unsigned _ast_int4_t	e;
913da2e3ebdSchin		_ast_dbl_exp_t		a;
914da2e3ebdSchin		_ast_dbl_exp_t		b;
915da2e3ebdSchin		a.f = 1;
916da2e3ebdSchin		b.f = 2;
917da2e3ebdSchin		for (i = 0; i < sizeof(a.e) / sizeof(a.e[0]); i++)
918da2e3ebdSchin			if (e = a.e[i] ^ b.e[i])
919da2e3ebdSchin			{
920da2e3ebdSchin				for (j = i + 1; j < sizeof(a.e) / sizeof(a.e[0]); j++)
921da2e3ebdSchin					if (a.e[j] ^ b.e[j])
922da2e3ebdSchin						return 0;
923da2e3ebdSchin				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");
924da2e3ebdSchin				printf("#define _ast_dbl_exp_index	%d\n", i);
925da2e3ebdSchin				for (i = 0; !(e & 1); e >>= 1, i++);
926da2e3ebdSchin				printf("#define _ast_dbl_exp_shift	%d\n\n", i);
927da2e3ebdSchin				return 0;
928da2e3ebdSchin			}
929da2e3ebdSchin		return 0;
930da2e3ebdSchin	}
931da2e3ebdSchin}end
932da2e3ebdSchin
933da2e3ebdSchintst	- note{ long double exponent bitfoolery }end output{
934da2e3ebdSchin	#include "FEATURE/common"
9357c2fbfb3SApril Chin	#include <stdio.h>
936da2e3ebdSchin	typedef union _ast_fltmax_exp_u
937da2e3ebdSchin	{
938da2e3ebdSchin		unsigned _ast_int4_t	e[sizeof(_ast_fltmax_t) / 4];
939da2e3ebdSchin		_ast_fltmax_t		f;
940da2e3ebdSchin	} _ast_fltmax_exp_t;
941da2e3ebdSchin	int
942da2e3ebdSchin	main()
943da2e3ebdSchin	{
944da2e3ebdSchin		int			i;
945da2e3ebdSchin		int			j;
946da2e3ebdSchin		unsigned _ast_int4_t	e;
947da2e3ebdSchin		_ast_fltmax_exp_t	a;
948da2e3ebdSchin		_ast_fltmax_exp_t	b;
949da2e3ebdSchin		a.f = 1;
950da2e3ebdSchin		b.f = 2;
951da2e3ebdSchin		for (i = 0; i < sizeof(a.e) / sizeof(a.e[0]); i++)
952da2e3ebdSchin			if (e = a.e[i] ^ b.e[i])
953da2e3ebdSchin			{
954da2e3ebdSchin				for (j = i + 1; j < sizeof(a.e) / sizeof(a.e[0]); j++)
955da2e3ebdSchin					if (a.e[j] ^ b.e[j])
956da2e3ebdSchin						return 0;
957da2e3ebdSchin				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");
958da2e3ebdSchin				printf("#define _ast_fltmax_exp_index\t%d\n", i);
959da2e3ebdSchin				for (i = 0; !(e & 1); e >>= 1, i++);
960da2e3ebdSchin				printf("#define _ast_fltmax_exp_shift\t%d\n\n", i);
961da2e3ebdSchin				return 0;
962da2e3ebdSchin			}
963da2e3ebdSchin		return 0;
964da2e3ebdSchin	}
965da2e3ebdSchin}end
966da2e3ebdSchin
967da2e3ebdSchintst	- -DN=1 - -DN=2 note{ _ast_fltmax_t maximum integral type }end output{
9687c2fbfb3SApril Chin	#include <stdio.h>
969da2e3ebdSchin	int
970da2e3ebdSchin	main()
971da2e3ebdSchin	{
972da2e3ebdSchin	#if N == 1
973da2e3ebdSchin		unsigned long long	m;
974da2e3ebdSchin		long double		f = 123.456;
975da2e3ebdSchin
976da2e3ebdSchin		m = f;
977da2e3ebdSchin		if (!m || f == m)
978da2e3ebdSchin			return 1;
979da2e3ebdSchin		printf("#define _ast_flt_unsigned_max_t	unsigned long long\n");
980da2e3ebdSchin	#else
981da2e3ebdSchin		printf("#define _ast_flt_unsigned_max_t	unsigned long\n");
982da2e3ebdSchin	#endif
983da2e3ebdSchin		return 0;
984da2e3ebdSchin	}
985da2e3ebdSchin}end
986da2e3ebdSchin
98734f9b3eeSRoland Mainztst	- -DSCAN=1 - -lm -DSTRTO=1 - -DMAC=1 - -DDIV=1 - -DEXP=1 - -DADD=1 - -DMPY=1 note{ INF and NAN memory representations }end output{
98834f9b3eeSRoland Mainz	#if MAC
98934f9b3eeSRoland Mainz	#define _AIX_COMPATIBILITY	1
99034f9b3eeSRoland Mainz	#define _FP_MODE_VARIABLE	1
99134f9b3eeSRoland Mainz	#endif
992da2e3ebdSchin	#include "FEATURE/common"
9937c2fbfb3SApril Chin	#include <stdio.h>
994da2e3ebdSchin	#include <sys/types.h>
995da2e3ebdSchin	#include <signal.h>
996*b30d1939SAndy Fiddaman	#include <strings.h>
997da2e3ebdSchin	#if _hdr_float
998da2e3ebdSchin	#include <float.h>
999da2e3ebdSchin	#endif
1000da2e3ebdSchin	#if _hdr_limits
1001da2e3ebdSchin	#include <limits.h>
1002da2e3ebdSchin	#endif
1003da2e3ebdSchin	#if _hdr_math
1004da2e3ebdSchin	#include <math.h>
1005da2e3ebdSchin	#endif
1006da2e3ebdSchin	#if _hdr_values
1007da2e3ebdSchin	#include <values.h>
1008da2e3ebdSchin	#endif
1009da2e3ebdSchin	#if STRTO && _hdr_stdlib
1010da2e3ebdSchin	#include <stdlib.h>
1011da2e3ebdSchin	#endif
1012da2e3ebdSchin	#if !defined(FLT_MAX) && defined(MAXFLOAT)
1013da2e3ebdSchin	#define FLT_MAX		MAXFLOAT
1014da2e3ebdSchin	#endif
1015da2e3ebdSchin	#if !defined(DBL_MAX) && defined(MAXDOUBLE)
1016da2e3ebdSchin	#define DBL_MAX		MAXDOUBLE
1017da2e3ebdSchin	#endif
1018da2e3ebdSchin	#if _ast_fltmax_double
1019da2e3ebdSchin	#undef	LDBL_MAX
1020da2e3ebdSchin	#endif
1021da2e3ebdSchin	static void
1022da2e3ebdSchin	#if _STD_
1023da2e3ebdSchin	list(const char* typ, const char* var, void* val, int siz)
1024da2e3ebdSchin	#else
1025da2e3ebdSchin	list(typ, var, val, siz)
1026da2e3ebdSchin	char* typ;
1027da2e3ebdSchin	char* var;
1028da2e3ebdSchin	void* val;
1029da2e3ebdSchin	int siz;
1030da2e3ebdSchin	#endif
1031da2e3ebdSchin	{
1032da2e3ebdSchin		register unsigned char*	u = (unsigned char*)val;
1033da2e3ebdSchin		register unsigned char*	e = u + siz;
1034da2e3ebdSchin
1035da2e3ebdSchin		printf("#define _ast_%s_%s_init\t0x%02x", typ, var, *u);
1036da2e3ebdSchin		while (++u < e)
1037da2e3ebdSchin			printf(",0x%02x", *u);
1038da2e3ebdSchin		printf("\n");
1039da2e3ebdSchin	}
1040da2e3ebdSchin	int
1041da2e3ebdSchin	main()
1042da2e3ebdSchin	{
1043da2e3ebdSchin	#if SCAN || STRTO
1044da2e3ebdSchin	#undef	NAN
1045da2e3ebdSchin	#define NAN	"NaN"
1046da2e3ebdSchin	#undef	INF
1047da2e3ebdSchin	#define INF	"INF"
1048da2e3ebdSchin	{
1049da2e3ebdSchin		float	f;
1050da2e3ebdSchin
1051da2e3ebdSchin	#if SCAN
1052da2e3ebdSchin		if (sscanf(NAN, "%g", &f) != 1)
1053da2e3ebdSchin			return 1;
1054da2e3ebdSchin	#else
1055da2e3ebdSchin		f = atof(NAN);
1056da2e3ebdSchin	#endif
1057da2e3ebdSchin		list("flt", "nan", &f, sizeof(f));
1058da2e3ebdSchin	#if SCAN
1059da2e3ebdSchin		if (sscanf(INF, "%g", &f) != 1)
1060da2e3ebdSchin			return 1;
1061da2e3ebdSchin	#else
1062da2e3ebdSchin		f = atof(INF);
1063da2e3ebdSchin	#endif
1064da2e3ebdSchin		list("flt", "inf", &f, sizeof(f));
1065da2e3ebdSchin	}
1066da2e3ebdSchin	{
1067da2e3ebdSchin		double	f;
1068da2e3ebdSchin	#if STRTO
1069da2e3ebdSchin		char*	e;
1070da2e3ebdSchin	#endif
1071da2e3ebdSchin
1072da2e3ebdSchin	#if SCAN
1073da2e3ebdSchin		if (sscanf(NAN, "%lg", &f) != 1)
1074da2e3ebdSchin			return 1;
1075da2e3ebdSchin	#else
1076da2e3ebdSchin		f = strtod(NAN, &e);
1077da2e3ebdSchin		if (*e)
1078da2e3ebdSchin			return 1;
1079da2e3ebdSchin	#endif
1080da2e3ebdSchin		list("dbl", "nan", &f, sizeof(f));
1081da2e3ebdSchin	#if SCAN
1082da2e3ebdSchin		if (sscanf(INF, "%lg", &f) != 1)
1083da2e3ebdSchin			return 1;
1084da2e3ebdSchin	#else
1085da2e3ebdSchin		f = strtod(INF, &e);
1086da2e3ebdSchin		if (*e)
1087da2e3ebdSchin			return 1;
1088da2e3ebdSchin	#endif
1089da2e3ebdSchin		list("dbl", "inf", &f, sizeof(f));
1090da2e3ebdSchin	}
1091da2e3ebdSchin	#ifdef LDBL_MAX
1092da2e3ebdSchin	{
1093da2e3ebdSchin		long double	f;
1094da2e3ebdSchin	#if STRTO
1095da2e3ebdSchin		char*	e;
1096da2e3ebdSchin	#endif
1097da2e3ebdSchin
1098*b30d1939SAndy Fiddaman	bzero(&f, sizeof (f));
1099da2e3ebdSchin	#if SCAN
1100da2e3ebdSchin		if (sscanf(NAN, "%Lg", &f) != 1)
1101da2e3ebdSchin			return 1;
1102da2e3ebdSchin	#else
1103da2e3ebdSchin		f = strtold(NAN, &e);
1104da2e3ebdSchin		if (*e)
1105da2e3ebdSchin			return 1;
1106da2e3ebdSchin	#endif
1107da2e3ebdSchin		list("ldbl", "nan", &f, sizeof(f));
1108*b30d1939SAndy Fiddaman	bzero(&f, sizeof (f));
1109da2e3ebdSchin	#if SCAN
1110da2e3ebdSchin		if (sscanf(INF, "%Lg", &f) != 1)
1111da2e3ebdSchin			return 1;
1112da2e3ebdSchin	#else
1113da2e3ebdSchin		f = strtold(INF, &e);
1114da2e3ebdSchin		if (*e)
1115da2e3ebdSchin			return 1;
1116da2e3ebdSchin	#endif
1117da2e3ebdSchin		list("ldbl", "inf", &f, sizeof(f));
1118da2e3ebdSchin	}
1119da2e3ebdSchin	#endif
1120da2e3ebdSchin	#else
1121da2e3ebdSchin	#ifdef SIGFPE
1122da2e3ebdSchin		signal(SIGFPE, SIG_IGN);
1123da2e3ebdSchin	#endif
1124da2e3ebdSchin	#ifdef FLT_MAX
1125da2e3ebdSchin		{
1126da2e3ebdSchin			float	f = FLT_MAX;
1127da2e3ebdSchin	#if DIV
1128da2e3ebdSchin			float	z = 0;
1129da2e3ebdSchin
1130da2e3ebdSchin			f = 0.0 / z;
1131da2e3ebdSchin			if (!f)
1132da2e3ebdSchin				return 1;
1133da2e3ebdSchin			list("flt", "nan", &f, sizeof(f));
1134da2e3ebdSchin			f = 1.0 / z;
1135da2e3ebdSchin			list("flt", "inf", &f, sizeof(f));
1136da2e3ebdSchin	#else
1137da2e3ebdSchin	#if ADD
1138da2e3ebdSchin			f += f;
1139da2e3ebdSchin	#endif
1140da2e3ebdSchin	#if EXP
1141da2e3ebdSchin			f = exp(f);
1142da2e3ebdSchin	#endif
1143da2e3ebdSchin	#if MPY
1144da2e3ebdSchin			f *= 2;
114534f9b3eeSRoland Mainz	#endif
114634f9b3eeSRoland Mainz	#if MAC
114734f9b3eeSRoland Mainz			f = FLT_QNAN;
1148da2e3ebdSchin	#endif
1149da2e3ebdSchin			list("flt", "nan", &f, sizeof(f));
115034f9b3eeSRoland Mainz	#if MAC
115134f9b3eeSRoland Mainz			f = FLT_INFINITY;
115234f9b3eeSRoland Mainz	#endif
1153da2e3ebdSchin			list("flt", "inf", &f, sizeof(f));
1154da2e3ebdSchin	#endif
1155da2e3ebdSchin		}
1156da2e3ebdSchin	#endif
1157da2e3ebdSchin	#ifdef DBL_MAX
1158da2e3ebdSchin		{
1159da2e3ebdSchin			double	f = DBL_MAX;
1160da2e3ebdSchin	#if DIV
1161da2e3ebdSchin			double	z = 0;
1162da2e3ebdSchin
1163da2e3ebdSchin			f = 0.0 / z;
1164da2e3ebdSchin			if (!f)
1165da2e3ebdSchin				return 1;
1166da2e3ebdSchin			list("dbl", "nan", &f, sizeof(f));
1167da2e3ebdSchin			f = 1.0 / z;
1168da2e3ebdSchin			list("dbl", "inf", &f, sizeof(f));
1169da2e3ebdSchin	#else
1170da2e3ebdSchin	#if ADD
1171da2e3ebdSchin			f += f;
1172da2e3ebdSchin	#endif
1173da2e3ebdSchin	#if EXP
1174da2e3ebdSchin			f = exp(f);
1175da2e3ebdSchin	#endif
1176da2e3ebdSchin	#if MPY
1177da2e3ebdSchin			f *= 2;
117834f9b3eeSRoland Mainz	#endif
117934f9b3eeSRoland Mainz	#if MAC
118034f9b3eeSRoland Mainz			f = DBL_QNAN;
1181da2e3ebdSchin	#endif
1182da2e3ebdSchin			list("dbl", "nan", &f, sizeof(f));
118334f9b3eeSRoland Mainz	#if MAC
118434f9b3eeSRoland Mainz			f = DBL_INFINITY;
118534f9b3eeSRoland Mainz	#endif
1186da2e3ebdSchin			list("dbl", "inf", &f, sizeof(f));
1187da2e3ebdSchin	#endif
1188da2e3ebdSchin		}
1189da2e3ebdSchin	#endif
1190da2e3ebdSchin	#ifdef LDBL_MAX
1191da2e3ebdSchin		{
1192da2e3ebdSchin			long double	f = LDBL_MAX;
1193da2e3ebdSchin	#if DIV
1194da2e3ebdSchin			long double	z = 0;
1195da2e3ebdSchin
1196da2e3ebdSchin			f = 0.0 / z;
1197da2e3ebdSchin			if (!f)
1198da2e3ebdSchin				return 1;
1199da2e3ebdSchin			list("ldbl", "nan", &f, sizeof(f));
1200da2e3ebdSchin			f = 1.0 / z;
1201da2e3ebdSchin			list("ldbl", "inf", &f, sizeof(f));
1202da2e3ebdSchin	#else
1203da2e3ebdSchin	#if ADD
1204da2e3ebdSchin			f += f;
1205da2e3ebdSchin	#endif
1206da2e3ebdSchin	#if EXP
1207da2e3ebdSchin			f = exp(f);
1208da2e3ebdSchin	#endif
1209da2e3ebdSchin	#if MPY
1210da2e3ebdSchin			f *= 2;
121134f9b3eeSRoland Mainz	#endif
121234f9b3eeSRoland Mainz	#if MAC
121334f9b3eeSRoland Mainz			f = LDBL_QNAN;
1214da2e3ebdSchin	#endif
1215da2e3ebdSchin			list("ldbl", "nan", &f, sizeof(f));
121634f9b3eeSRoland Mainz	#if MAC
121734f9b3eeSRoland Mainz			f = LDBL_INFINITY;
121834f9b3eeSRoland Mainz	#endif
1219da2e3ebdSchin			list("ldbl", "inf", &f, sizeof(f));
1220da2e3ebdSchin	#endif
1221da2e3ebdSchin		}
1222da2e3ebdSchin	#endif
1223da2e3ebdSchin	#endif
1224da2e3ebdSchin		return 0;
1225da2e3ebdSchin	}
1226da2e3ebdSchin}end
1227