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