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