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 }