1 #include <math.h>
2 #include <fenv.h>
3 
4 extern void abort(void);
5 
6 #define C99_MATH_TESTS(nan, inf, huge, norm1, norm2, norm3, sub, zero, neg) \
7 {							\
8   if (feclearexcept (FE_ALL_EXCEPT) != 0)		\
9     abort();						\
10 							\
11 							\
12   if (fpclassify (nan) != FP_NAN)			\
13     abort ();						\
14 							\
15   if (fpclassify (inf) != FP_INFINITE)			\
16     abort ();						\
17 							\
18   if (fpclassify (huge) != FP_INFINITE)			\
19     abort ();						\
20 							\
21   if (fpclassify (norm1) != FP_NORMAL)			\
22     abort ();						\
23 							\
24   if (fpclassify (norm2) != FP_NORMAL)			\
25     abort ();						\
26 							\
27   if (fpclassify (norm3) != FP_NORMAL)			\
28     abort ();						\
29 							\
30   if (fpclassify (sub) != FP_SUBNORMAL)			\
31     abort ();						\
32 							\
33   if (fpclassify (zero) != FP_ZERO)			\
34     abort ();						\
35 							\
36 							\
37   if (!isnan (nan))					\
38     abort ();						\
39 							\
40   if (isnan (inf))					\
41     abort ();						\
42 							\
43   if (isnan (huge))					\
44     abort ();						\
45 							\
46   if (isnan (norm1))					\
47     abort ();						\
48 							\
49   if (isnan (norm2))					\
50     abort ();						\
51 							\
52   if (isnan (norm3))					\
53     abort ();						\
54 							\
55   if (isnan (sub))					\
56     abort ();						\
57 							\
58   if (isnan (zero))					\
59     abort ();						\
60 							\
61 							\
62   if (isinf (nan))					\
63     abort ();						\
64 							\
65   if (!isinf (inf))					\
66     abort ();						\
67 							\
68   if (!isinf (huge))					\
69     abort ();						\
70 							\
71   if (isinf (norm1))					\
72     abort ();						\
73 							\
74   if (isinf (norm2))					\
75     abort ();						\
76 							\
77   if (isinf (norm3))					\
78     abort ();						\
79 							\
80   if (isinf (sub))					\
81     abort ();						\
82 							\
83   if (isinf (zero))					\
84     abort ();						\
85 							\
86 							\
87   if (isfinite (nan))					\
88     abort ();						\
89 							\
90   if (isfinite (inf))					\
91     abort ();						\
92 							\
93   if (isfinite (huge))					\
94     abort ();						\
95 							\
96   if (!isfinite (norm1))				\
97     abort ();						\
98 							\
99   if (!isfinite (norm2))				\
100     abort ();						\
101 							\
102   if (!isfinite (norm3))				\
103     abort ();						\
104 							\
105   if (!isfinite (sub))					\
106     abort ();						\
107 							\
108   if (!isfinite (zero))					\
109     abort ();						\
110 							\
111 							\
112   if (isnormal (nan))					\
113     abort ();						\
114 							\
115   if (isnormal (inf))					\
116     abort ();						\
117 							\
118   if (isnormal (huge))					\
119     abort ();						\
120 							\
121   if (!isnormal (norm1))				\
122     abort ();						\
123 							\
124   if (!isnormal (norm2))				\
125     abort ();						\
126 							\
127   if (!isnormal (norm3))				\
128     abort ();						\
129 							\
130   if (isnormal (sub))					\
131     abort ();						\
132 							\
133   if (isnormal (zero))					\
134     abort ();						\
135 							\
136 							\
137   if (!!signbit (nan) != neg)				\
138     abort ();						\
139 							\
140   if (!!signbit (inf) != neg)				\
141     abort ();						\
142 							\
143   if (!!signbit (huge) != neg)				\
144     abort ();						\
145 							\
146   if (!!signbit (norm1) != neg)				\
147     abort ();						\
148 							\
149   if (!!signbit (norm2) != neg)				\
150     abort ();						\
151 							\
152   if (!!signbit (norm3) != neg)				\
153     abort ();						\
154 							\
155   if (!!signbit (sub) != neg)				\
156     abort ();						\
157 							\
158   if (!!signbit (zero) != neg)				\
159     abort ();						\
160 							\
161 							\
162   if (neg)						\
163   {							\
164     if (!isless ((inf), (norm1)))			\
165       abort ();						\
166 							\
167     if (!isless ((inf), (norm2)))			\
168       abort ();						\
169 							\
170     if (!isless ((inf), (norm3)))			\
171       abort ();						\
172 							\
173     if (!islessequal ((inf), (huge)))			\
174       abort ();						\
175 							\
176     if (!isgreater ((norm1), (inf)))			\
177       abort ();						\
178 							\
179     if (!isgreater ((norm2), (inf)))			\
180       abort ();						\
181 							\
182     if (!isgreater ((norm3), (inf)))			\
183       abort ();						\
184 							\
185     if (!isgreaterequal ((huge), (inf)))		\
186       abort ();						\
187   }							\
188   else							\
189   {							\
190     if (!isgreater ((inf), (norm1)))			\
191       abort ();						\
192 							\
193     if (!isgreater ((inf), (norm2)))			\
194       abort ();						\
195 							\
196     if (!isgreater ((inf), (norm3)))			\
197       abort ();						\
198 							\
199     if (!isgreaterequal ((inf), (huge)))		\
200       abort ();						\
201 							\
202     if (!isless ((norm1), (inf)))			\
203       abort ();						\
204 							\
205     if (!isless ((norm2), (inf)))			\
206       abort ();						\
207 							\
208     if (!isless ((norm3), (inf)))			\
209       abort ();						\
210 							\
211     if (!islessequal ((huge), (inf)))			\
212       abort ();						\
213   }							\
214 							\
215   if (!islessgreater ((inf), (norm1)))			\
216     abort ();						\
217 							\
218   if (!islessgreater ((inf), (norm2)))			\
219     abort ();						\
220 							\
221   if (!islessgreater ((inf), (norm3)))			\
222     abort ();						\
223 							\
224   if (!isunordered ((nan), (norm1)))			\
225     abort ();						\
226 							\
227   if (!isunordered ((nan), (norm2)))			\
228     abort ();						\
229 							\
230   if (!isunordered ((nan), (norm3)))			\
231     abort ();						\
232 							\
233 							\
234   if (fetestexcept (FE_ALL_EXCEPT) != 0)		\
235     abort();						\
236 }
237