[BZ #3306]
[platform/upstream/glibc.git] / math / bug-nextafter.c
1 #include <fenv.h>
2 #include <math.h>
3 #include <float.h>
4 #include <stdlib.h>
5 #include <stdio.h>
6
7 float zero = 0.0;
8 float inf = INFINITY;
9
10 int
11 main (void)
12 {
13   int result = 0;
14
15   float i = INFINITY;
16   float m = FLT_MAX;
17   feclearexcept (FE_ALL_EXCEPT);
18   if (nextafterf (m, i) != i)
19     {
20       puts ("nextafterf+ failed");
21       ++result;
22     }
23   if (fetestexcept (FE_OVERFLOW) == 0)
24     {
25       puts ("nextafterf+ did not overflow");
26       ++result;
27     }
28   feclearexcept (FE_ALL_EXCEPT);
29   if (nextafterf (-m, -i) != -i)
30     {
31       puts ("nextafterf- failed");
32       ++result;
33     }
34   if (fetestexcept (FE_OVERFLOW) == 0)
35     {
36       puts ("nextafterf- did not overflow");
37       ++result;
38     }
39
40   i = 0;
41   m = FLT_MIN;
42   feclearexcept (FE_ALL_EXCEPT);
43   i = nextafterf (m, i);
44   if (i < 0 || i >= FLT_MIN)
45     {
46       puts ("nextafterf+ failed");
47       ++result;
48     }
49   if (fetestexcept (FE_UNDERFLOW) == 0)
50     {
51       puts ("nextafterf+ did not underflow");
52       ++result;
53     }
54   i = 0;
55   feclearexcept (FE_ALL_EXCEPT);
56   i = nextafterf (-m, -i);
57   if (i > 0 || i <= -FLT_MIN)
58     {
59       puts ("nextafterf- failed");
60       ++result;
61     }
62   if (fetestexcept (FE_UNDERFLOW) == 0)
63     {
64       puts ("nextafterf- did not underflow");
65       ++result;
66     }
67   i = -INFINITY;
68   feclearexcept (FE_ALL_EXCEPT);
69   m = nextafterf (zero, inf);
70   if (m < 0.0 || m >= FLT_MIN)
71     {
72       puts ("nextafterf+ failed");
73       ++result;
74     }
75   if (fetestexcept (FE_UNDERFLOW) == 0)
76     {
77       puts ("nextafterf+ did not underflow");
78       ++result;
79     }
80   feclearexcept (FE_ALL_EXCEPT);
81   if (nextafterf (m, i) != 0.0)
82     {
83       puts ("nextafterf+ failed");
84       ++result;
85     }
86   if (fetestexcept (FE_UNDERFLOW) == 0)
87     {
88       puts ("nextafterf+ did not underflow");
89       ++result;
90     }
91   feclearexcept (FE_ALL_EXCEPT);
92   m = nextafterf (copysignf (zero, -1.0), -inf);
93   if (m > 0.0 || m <= -FLT_MIN)
94     {
95       puts ("nextafterf- failed");
96       ++result;
97     }
98   if (fetestexcept (FE_UNDERFLOW) == 0)
99     {
100       puts ("nextafterf- did not underflow");
101       ++result;
102     }
103   feclearexcept (FE_ALL_EXCEPT);
104   if (nextafterf (m, -i) != 0.0)
105     {
106       puts ("nextafterf- failed");
107       ++result;
108     }
109   if (fetestexcept (FE_UNDERFLOW) == 0)
110     {
111       puts ("nextafterf- did not underflow");
112       ++result;
113     }
114
115   double di = INFINITY;
116   double dm = DBL_MAX;
117   feclearexcept (FE_ALL_EXCEPT);
118   if (nextafter (dm, di) != di)
119     {
120       puts ("nextafter+ failed");
121       ++result;
122     }
123   if (fetestexcept (FE_OVERFLOW) == 0)
124     {
125       puts ("nextafter+ did not overflow");
126       ++result;
127     }
128   feclearexcept (FE_ALL_EXCEPT);
129   if (nextafter (-dm, -di) != -di)
130     {
131       puts ("nextafter failed");
132       ++result;
133     }
134   if (fetestexcept (FE_OVERFLOW) == 0)
135     {
136       puts ("nextafter- did not overflow");
137       ++result;
138     }
139
140   di = 0;
141   dm = DBL_MIN;
142   feclearexcept (FE_ALL_EXCEPT);
143   di = nextafter (dm, di);
144   if (di < 0 || di >= DBL_MIN)
145     {
146       puts ("nextafter+ failed");
147       ++result;
148     }
149   if (fetestexcept (FE_UNDERFLOW) == 0)
150     {
151       puts ("nextafter+ did not underflow");
152       ++result;
153     }
154   di = 0;
155   feclearexcept (FE_ALL_EXCEPT);
156   di = nextafter (-dm, -di);
157   if (di > 0 || di <= -DBL_MIN)
158     {
159       puts ("nextafter- failed");
160       ++result;
161     }
162   if (fetestexcept (FE_UNDERFLOW) == 0)
163     {
164       puts ("nextafter- did not underflow");
165       ++result;
166     }
167   di = -INFINITY;
168   feclearexcept (FE_ALL_EXCEPT);
169   dm = nextafter (zero, inf);
170   if (dm < 0.0 || dm >= DBL_MIN)
171     {
172       puts ("nextafter+ failed");
173       ++result;
174     }
175   if (fetestexcept (FE_UNDERFLOW) == 0)
176     {
177       puts ("nextafter+ did not underflow");
178       ++result;
179     }
180   feclearexcept (FE_ALL_EXCEPT);
181   if (nextafter (dm, di) != 0.0)
182     {
183       puts ("nextafter+ failed");
184       ++result;
185     }
186   if (fetestexcept (FE_UNDERFLOW) == 0)
187     {
188       puts ("nextafter+ did not underflow");
189       ++result;
190     }
191   feclearexcept (FE_ALL_EXCEPT);
192   dm = nextafter (copysign (zero, -1.0), -inf);
193   if (dm > 0.0 || dm <= -DBL_MIN)
194     {
195       puts ("nextafter- failed");
196       ++result;
197     }
198   if (fetestexcept (FE_UNDERFLOW) == 0)
199     {
200       puts ("nextafter- did not underflow");
201       ++result;
202     }
203   feclearexcept (FE_ALL_EXCEPT);
204   if (nextafter (dm, -di) != 0.0)
205     {
206       puts ("nextafter- failed");
207       ++result;
208     }
209   if (fetestexcept (FE_UNDERFLOW) == 0)
210     {
211       puts ("nextafter- did not underflow");
212       ++result;
213     }
214
215 #ifndef NO_LONG_DOUBLE
216   long double li = INFINITY;
217   long double lm = LDBL_MAX;
218   feclearexcept (FE_ALL_EXCEPT);
219   if (nextafterl (lm, li) != li)
220     {
221       puts ("nextafterl+ failed");
222       ++result;
223     }
224   if (fetestexcept (FE_OVERFLOW) == 0)
225     {
226       puts ("nextafterl+ did not overflow");
227       ++result;
228     }
229   feclearexcept (FE_ALL_EXCEPT);
230   if (nextafterl (-lm, -li) != -li)
231     {
232       puts ("nextafterl failed");
233       ++result;
234     }
235   if (fetestexcept (FE_OVERFLOW) == 0)
236     {
237       puts ("nextafterl- did not overflow");
238       ++result;
239     }
240
241   li = 0;
242   lm = LDBL_MIN;
243   feclearexcept (FE_ALL_EXCEPT);
244   li = nextafterl (lm, li);
245   if (li < 0 || li >= LDBL_MIN)
246     {
247       puts ("nextafterl+ failed");
248       ++result;
249     }
250   if (fetestexcept (FE_UNDERFLOW) == 0)
251     {
252       puts ("nextafterl+ did not underflow");
253       ++result;
254     }
255   li = 0;
256   feclearexcept (FE_ALL_EXCEPT);
257   li = nextafterl (-lm, -li);
258   if (li > 0 || li <= -LDBL_MIN)
259     {
260       puts ("nextafterl- failed");
261       ++result;
262     }
263   if (fetestexcept (FE_UNDERFLOW) == 0)
264     {
265       puts ("nextafterl- did not underflow");
266       ++result;
267     }
268   li = -INFINITY;
269   feclearexcept (FE_ALL_EXCEPT);
270   lm = nextafterl (zero, inf);
271   if (lm < 0.0 || lm >= LDBL_MIN)
272     {
273       puts ("nextafterl+ failed");
274       ++result;
275     }
276   if (fetestexcept (FE_UNDERFLOW) == 0)
277     {
278       puts ("nextafterl+ did not underflow");
279       ++result;
280     }
281   feclearexcept (FE_ALL_EXCEPT);
282   if (nextafterl (lm, li) != 0.0)
283     {
284       puts ("nextafterl+ failed");
285       ++result;
286     }
287   if (fetestexcept (FE_UNDERFLOW) == 0)
288     {
289       puts ("nextafterl+ did not underflow");
290       ++result;
291     }
292   feclearexcept (FE_ALL_EXCEPT);
293   lm = nextafterl (copysign (zero, -1.0), -inf);
294   if (lm > 0.0 || lm <= -LDBL_MIN)
295     {
296       puts ("nextafterl- failed");
297       ++result;
298     }
299   if (fetestexcept (FE_UNDERFLOW) == 0)
300     {
301       puts ("nextafterl- did not underflow");
302       ++result;
303     }
304   feclearexcept (FE_ALL_EXCEPT);
305   if (nextafterl (lm, -li) != 0.0)
306     {
307       puts ("nextafterl- failed");
308       ++result;
309     }
310   if (fetestexcept (FE_UNDERFLOW) == 0)
311     {
312       puts ("nextafterl- did not underflow");
313       ++result;
314     }
315 #endif
316
317   return result;
318 }