Updated to fedora-glibc-20050523T1354
[kopensolaris-gnu/glibc.git] / math / test-misc.c
1 /* Miscellaneous tests which don't fit anywhere else.
2    Copyright (C) 2000, 2001, 2004, 2005 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
4
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, write to the Free
17    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18    02111-1307 USA.  */
19
20 #include <fenv.h>
21 #include <float.h>
22 #include <ieee754.h>
23 #include <math.h>
24 #include <stdio.h>
25 #include <string.h>
26
27
28 int
29 main (void)
30 {
31   int result = 0;
32
33 #ifndef NO_LONG_DOUBLE
34   {
35     long double x = 0x100000001ll + (long double) 0.5;
36     long double q;
37     long double r;
38
39     r = modfl (x, &q);
40     if (q != (long double) 0x100000001ll || r != 0.5)
41       {
42         printf ("modfl (%Lg, ...) failed\n", x);
43         result = 1;
44       }
45   }
46
47 # if __GNUC__ >= 3 || __GNUC_MINOR__ >= 96
48   {
49     long double x;
50     long double m;
51     long double r;
52     int e;
53     int i;
54
55 #  if LDBL_MANT_DIG == 64
56     m = 0xf.fffffffffffffffp-4L;
57 #  elif LDBL_MANT_DIG == 106
58     /* This has to match the mantissa of LDBL_MAX which actually does have a
59        missing bit in the middle.  */
60     m = 0x1.fffffffffffff7ffffffffffff8p-1L;
61 #  elif LDBL_MANT_DIG == 113
62     m = 0x1.ffffffffffffffffffffffffffffp-1L;
63 #  else
64 #   error "Please adjust"
65 #  endif
66
67     for (i = LDBL_MAX_EXP, x = LDBL_MAX; i >= LDBL_MIN_EXP; --i, x /= 2.0L)
68       {
69         printf ("2^%d: ", i);
70
71         r = frexpl (x, &e);
72         if (r != m)
73           {
74             printf ("mantissa incorrect: %.20La\n", r);
75             result = 1;
76             continue;
77           }
78         if (e != i)
79           {
80             printf ("exponent wrong %d (%.20Lg)\n", e, x);
81             result = 1;
82             continue;
83           }
84         puts ("ok");
85       }
86
87     for (i = LDBL_MIN_EXP, x = LDBL_MIN; i >= LDBL_MIN_EXP - LDBL_MANT_DIG + 1;
88          --i, x /= 2.0L)
89       {
90         printf ("2^%d: ", i);
91
92         r = frexpl (x, &e);
93         if (r != 0.5L)
94           {
95             printf ("mantissa incorrect: %.20La\n", r);
96             result = 1;
97             continue;
98           }
99         if (e != i)
100           {
101             printf ("exponent wrong %d (%.20Lg)\n", e, x);
102             result = 1;
103             continue;
104           }
105         puts ("ok");
106       }
107
108   }
109 # endif
110
111 #if 0
112   {
113     int e;
114     long double r = frexpl (LDBL_MIN * LDBL_EPSILON, &e);
115
116     if (r != 0.5)
117       {
118         printf ("frexpl (LDBL_MIN * LDBL_EPSILON, ...): mantissa wrong: %Lg\n",
119                 r);
120         result = 1;
121       }
122     else if (e != -16444)
123       {
124         printf ("frexpl (LDBL_MIN * LDBL_EPSILON, ...): exponent wrong: %d\n",
125                 e);
126         result = 1;
127       }
128   }
129 #endif
130 #endif
131
132   {
133     double x = 0x100000001ll + (double) 0.5;
134     double q;
135     double r;
136
137     r = modf (x, &q);
138     if (q != (double) 0x100000001ll || r != 0.5)
139       {
140         printf ("modf (%g, ...) failed\n", x);
141         result = 1;
142       }
143   }
144
145   {
146     union ieee754_float v1;
147     union ieee754_float v2;
148     float f;
149
150     v1.f = f = FLT_MIN;
151     if (fpclassify (f) != FP_NORMAL)
152       {
153         printf ("fpclassify (FLT_MIN) failed: %d\n", fpclassify (f));
154         result = 1;
155       }
156     f = nextafterf (f, FLT_MIN / 2.0f);
157     if (fpclassify (f) != FP_SUBNORMAL)
158       {
159         printf ("fpclassify (FLT_MIN-epsilon) failed: %d\n", fpclassify (f));
160         result = 1;
161       }
162     v2.f = f = nextafterf (f, FLT_MIN);
163     if (fpclassify (f) != FP_NORMAL)
164       {
165         printf ("fpclassify (FLT_MIN-epsilon+epsilon) failed: %d\n",
166                 fpclassify (f));
167         result = 1;
168       }
169
170     if (v1.ieee.mantissa != v2.ieee.mantissa)
171       {
172         printf ("FLT_MIN: mantissa differs: %8x vs %8x\n",
173                 v1.ieee.mantissa, v2.ieee.mantissa);
174         result = 1;
175       }
176     if (v1.ieee.exponent != v2.ieee.exponent)
177       {
178         printf ("FLT_MIN: exponent differs: %4x vs %4x\n",
179                 v1.ieee.exponent, v2.ieee.exponent);
180         result = 1;
181       }
182     if (v1.ieee.negative != v2.ieee.negative)
183       {
184         printf ("FLT_MIN: negative differs: %d vs %d\n",
185                 v1.ieee.negative, v2.ieee.negative);
186         result = 1;
187       }
188
189     v1.f = f = -FLT_MIN;
190     if (fpclassify (f) != FP_NORMAL)
191       {
192         printf ("fpclassify (-FLT_MIN) failed: %d\n", fpclassify (f));
193         result = 1;
194       }
195     f = nextafterf (f, -FLT_MIN / 2.0f);
196     if (fpclassify (f) != FP_SUBNORMAL)
197       {
198         printf ("fpclassify (-FLT_MIN-epsilon) failed: %d\n", fpclassify (f));
199         result = 1;
200       }
201     v2.f = f = nextafterf (f, -FLT_MIN);
202     if (fpclassify (f) != FP_NORMAL)
203       {
204         printf ("fpclassify (-FLT_MIN-epsilon+epsilon) failed: %d\n",
205                 fpclassify (f));
206         result = 1;
207       }
208
209     if (v1.ieee.mantissa != v2.ieee.mantissa)
210       {
211         printf ("-FLT_MIN: mantissa differs: %8x vs %8x\n",
212                 v1.ieee.mantissa, v2.ieee.mantissa);
213         result = 1;
214       }
215     if (v1.ieee.exponent != v2.ieee.exponent)
216       {
217         printf ("-FLT_MIN: exponent differs: %4x vs %4x\n",
218                 v1.ieee.exponent, v2.ieee.exponent);
219         result = 1;
220       }
221     if (v1.ieee.negative != v2.ieee.negative)
222       {
223         printf ("-FLT_MIN: negative differs: %d vs %d\n",
224                 v1.ieee.negative, v2.ieee.negative);
225         result = 1;
226       }
227
228     f = FLT_MAX;
229     if (fpclassify (f) != FP_NORMAL)
230       {
231         printf ("fpclassify (FLT_MAX) failed: %d\n", fpclassify (f));
232         result = 1;
233       }
234     f = nextafterf (f, INFINITY);
235     if (fpclassify (f) != FP_INFINITE)
236       {
237         printf ("fpclassify (FLT_MAX+epsilon) failed: %d\n", fpclassify (f));
238         result = 1;
239       }
240
241     f = -FLT_MAX;
242     if (fpclassify (f) != FP_NORMAL)
243       {
244         printf ("fpclassify (-FLT_MAX) failed: %d\n", fpclassify (f));
245         result = 1;
246       }
247     f = nextafterf (f, -INFINITY);
248     if (fpclassify (f) != FP_INFINITE)
249       {
250         printf ("fpclassify (-FLT_MAX-epsilon) failed: %d\n", fpclassify (f));
251         result = 1;
252       }
253
254     v1.f = f = 0.0625;
255     f = nextafterf (f, 0.0);
256     v2.f = f = nextafterf (f, 1.0);
257
258     if (v1.ieee.mantissa != v2.ieee.mantissa)
259       {
260         printf ("0.0625f down: mantissa differs: %8x vs %8x\n",
261                 v1.ieee.mantissa, v2.ieee.mantissa);
262         result = 1;
263       }
264     if (v1.ieee.exponent != v2.ieee.exponent)
265       {
266         printf ("0.0625f down: exponent differs: %4x vs %4x\n",
267                 v1.ieee.exponent, v2.ieee.exponent);
268         result = 1;
269       }
270     if (v1.ieee.negative != v2.ieee.negative)
271       {
272         printf ("0.0625f down: negative differs: %d vs %d\n",
273                 v1.ieee.negative, v2.ieee.negative);
274         result = 1;
275       }
276
277     v1.f = f = 0.0625;
278     f = nextafterf (f, 1.0);
279     v2.f = f = nextafterf (f, 0.0);
280
281     if (v1.ieee.mantissa != v2.ieee.mantissa)
282       {
283         printf ("0.0625f up: mantissa differs: %8x vs %8x\n",
284                 v1.ieee.mantissa, v2.ieee.mantissa);
285         result = 1;
286       }
287     if (v1.ieee.exponent != v2.ieee.exponent)
288       {
289         printf ("0.0625f up: exponent differs: %4x vs %4x\n",
290                 v1.ieee.exponent, v2.ieee.exponent);
291         result = 1;
292       }
293     if (v1.ieee.negative != v2.ieee.negative)
294       {
295         printf ("0.0625f up: negative differs: %d vs %d\n",
296                 v1.ieee.negative, v2.ieee.negative);
297         result = 1;
298       }
299
300     v1.f = f = -0.0625;
301     f = nextafterf (f, 0.0);
302     v2.f = f = nextafterf (f, -1.0);
303
304     if (v1.ieee.mantissa != v2.ieee.mantissa)
305       {
306         printf ("-0.0625f up: mantissa differs: %8x vs %8x\n",
307                 v1.ieee.mantissa, v2.ieee.mantissa);
308         result = 1;
309       }
310     if (v1.ieee.exponent != v2.ieee.exponent)
311       {
312         printf ("-0.0625f up: exponent differs: %4x vs %4x\n",
313                 v1.ieee.exponent, v2.ieee.exponent);
314         result = 1;
315       }
316     if (v1.ieee.negative != v2.ieee.negative)
317       {
318         printf ("-0.0625f up: negative differs: %d vs %d\n",
319                 v1.ieee.negative, v2.ieee.negative);
320         result = 1;
321       }
322
323     v1.f = f = -0.0625;
324     f = nextafterf (f, -1.0);
325     v2.f = f = nextafterf (f, 0.0);
326
327     if (v1.ieee.mantissa != v2.ieee.mantissa)
328       {
329         printf ("-0.0625f down: mantissa differs: %8x vs %8x\n",
330                 v1.ieee.mantissa, v2.ieee.mantissa);
331         result = 1;
332       }
333     if (v1.ieee.exponent != v2.ieee.exponent)
334       {
335         printf ("-0.0625f down: exponent differs: %4x vs %4x\n",
336                 v1.ieee.exponent, v2.ieee.exponent);
337         result = 1;
338       }
339     if (v1.ieee.negative != v2.ieee.negative)
340       {
341         printf ("-0.0625f down: negative differs: %d vs %d\n",
342                 v1.ieee.negative, v2.ieee.negative);
343         result = 1;
344       }
345
346     v1.f = f = 0.0f;
347     f = nextafterf (f, 1.0);
348     v2.f = nextafterf (f, -1.0);
349
350     if (v1.ieee.mantissa != v2.ieee.mantissa)
351       {
352         printf ("0.0f up: mantissa differs: %8x vs %8x\n",
353                 v1.ieee.mantissa, v2.ieee.mantissa);
354         result = 1;
355       }
356     if (v1.ieee.exponent != v2.ieee.exponent)
357       {
358         printf ("0.0f up: exponent differs: %4x vs %4x\n",
359                 v1.ieee.exponent, v2.ieee.exponent);
360         result = 1;
361       }
362     if (0 != v2.ieee.negative)
363       {
364         printf ("0.0f up: negative differs: 0 vs %d\n",
365                 v2.ieee.negative);
366         result = 1;
367       }
368
369     v1.f = f = 0.0f;
370     f = nextafterf (f, -1.0);
371     v2.f = nextafterf (f, 1.0);
372
373     if (v1.ieee.mantissa != v2.ieee.mantissa)
374       {
375         printf ("0.0f down: mantissa differs: %8x vs %8x\n",
376                 v1.ieee.mantissa, v2.ieee.mantissa);
377         result = 1;
378       }
379     if (v1.ieee.exponent != v2.ieee.exponent)
380       {
381         printf ("0.0f down: exponent differs: %4x vs %4x\n",
382                 v1.ieee.exponent, v2.ieee.exponent);
383         result = 1;
384       }
385     if (1 != v2.ieee.negative)
386       {
387         printf ("0.0f down: negative differs: 1 vs %d\n",
388                 v2.ieee.negative);
389         result = 1;
390       }
391
392     if (nextafterf (0.0f, INFINITY) != nextafterf (0.0f, 1.0f)
393         || nextafterf (-0.0f, INFINITY) != nextafterf (-0.0f, 1.0f)
394         || nextafterf (0.0f, -INFINITY) != nextafterf (0.0f, -1.0f)
395         || nextafterf (-0.0f, -INFINITY) != nextafterf (-0.0f, -1.0f))
396       {
397         printf ("nextafterf (+-0, +-Inf) != nextafterf (+-0, +-1)\n");
398         result = 1;
399       }
400
401     if (nexttowardf (0.0f, INFINITY) != nexttowardf (0.0f, 1.0f)
402         || nexttowardf (-0.0f, INFINITY) != nexttowardf (-0.0f, 1.0f)
403         || nexttowardf (0.0f, -INFINITY) != nexttowardf (0.0f, -1.0f)
404         || nexttowardf (-0.0f, -INFINITY) != nexttowardf (-0.0f, -1.0f))
405       {
406         printf ("nexttowardf (+-0, +-Inf) != nexttowardf (+-0, +-1)\n");
407         result = 1;
408       }
409   }
410
411   {
412     union ieee754_double v1;
413     union ieee754_double v2;
414     double d;
415
416     v1.d = d = DBL_MIN;
417     if (fpclassify (d) != FP_NORMAL)
418       {
419         printf ("fpclassify (DBL_MIN) failed: %d\n", fpclassify (d));
420         result = 1;
421       }
422     d = nextafter (d, DBL_MIN / 2.0);
423     if (fpclassify (d) != FP_SUBNORMAL)
424       {
425         printf ("fpclassify (DBL_MIN-epsilon) failed: %d\n", fpclassify (d));
426         result = 1;
427       }
428     v2.d = d = nextafter (d, DBL_MIN);
429     if (fpclassify (d) != FP_NORMAL)
430       {
431         printf ("fpclassify (DBL_MIN-epsilon+epsilon) failed: %d\n",
432                 fpclassify (d));
433         result = 1;
434       }
435
436     if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
437       {
438         printf ("DBL_MIN: mantissa0 differs: %8x vs %8x\n",
439                 v1.ieee.mantissa0, v2.ieee.mantissa0);
440         result = 1;
441       }
442     if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
443       {
444         printf ("DBL_MIN: mantissa1 differs: %8x vs %8x\n",
445                 v1.ieee.mantissa1, v2.ieee.mantissa1);
446         result = 1;
447       }
448     if (v1.ieee.exponent != v2.ieee.exponent)
449       {
450         printf ("DBL_MIN: exponent differs: %4x vs %4x\n",
451                 v1.ieee.exponent, v2.ieee.exponent);
452         result = 1;
453       }
454     if (v1.ieee.negative != v2.ieee.negative)
455       {
456         printf ("DBL_MIN: negative differs: %d vs %d\n",
457                 v1.ieee.negative, v2.ieee.negative);
458         result = 1;
459       }
460
461     v1.d = d = -DBL_MIN;
462     if (fpclassify (d) != FP_NORMAL)
463       {
464         printf ("fpclassify (-DBL_MIN) failed: %d\n", fpclassify (d));
465         result = 1;
466       }
467     d = nextafter (d, -DBL_MIN / 2.0);
468     if (fpclassify (d) != FP_SUBNORMAL)
469       {
470         printf ("fpclassify (-DBL_MIN-epsilon) failed: %d\n", fpclassify (d));
471         result = 1;
472       }
473     v2.d = d = nextafter (d, -DBL_MIN);
474     if (fpclassify (d) != FP_NORMAL)
475       {
476         printf ("fpclassify (-DBL_MIN-epsilon+epsilon) failed: %d\n",
477                 fpclassify (d));
478         result = 1;
479       }
480
481     if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
482       {
483         printf ("-DBL_MIN: mantissa0 differs: %8x vs %8x\n",
484                 v1.ieee.mantissa0, v2.ieee.mantissa0);
485         result = 1;
486       }
487     if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
488       {
489         printf ("-DBL_MIN: mantissa1 differs: %8x vs %8x\n",
490                 v1.ieee.mantissa1, v2.ieee.mantissa1);
491         result = 1;
492       }
493     if (v1.ieee.exponent != v2.ieee.exponent)
494       {
495         printf ("-DBL_MIN: exponent differs: %4x vs %4x\n",
496                 v1.ieee.exponent, v2.ieee.exponent);
497         result = 1;
498       }
499     if (v1.ieee.negative != v2.ieee.negative)
500       {
501         printf ("-DBL_MIN: negative differs: %d vs %d\n",
502                 v1.ieee.negative, v2.ieee.negative);
503         result = 1;
504       }
505
506     d = DBL_MAX;
507     if (fpclassify (d) != FP_NORMAL)
508       {
509         printf ("fpclassify (DBL_MAX) failed: %d\n", fpclassify (d));
510         result = 1;
511       }
512     d = nextafter (d, INFINITY);
513     if (fpclassify (d) != FP_INFINITE)
514       {
515         printf ("fpclassify (DBL_MAX+epsilon) failed: %d\n", fpclassify (d));
516         result = 1;
517       }
518
519     d = -DBL_MAX;
520     if (fpclassify (d) != FP_NORMAL)
521       {
522         printf ("fpclassify (-DBL_MAX) failed: %d\n", fpclassify (d));
523         result = 1;
524       }
525     d = nextafter (d, -INFINITY);
526     if (fpclassify (d) != FP_INFINITE)
527       {
528         printf ("fpclassify (-DBL_MAX-epsilon) failed: %d\n", fpclassify (d));
529         result = 1;
530       }
531
532     v1.d = d = 0.0625;
533     d = nextafter (d, 0.0);
534     v2.d = d = nextafter (d, 1.0);
535
536     if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
537       {
538         printf ("0.0625 down: mantissa0 differs: %8x vs %8x\n",
539                 v1.ieee.mantissa0, v2.ieee.mantissa0);
540         result = 1;
541       }
542     if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
543       {
544         printf ("0.0625 down: mantissa1 differs: %8x vs %8x\n",
545                 v1.ieee.mantissa1, v2.ieee.mantissa1);
546         result = 1;
547       }
548     if (v1.ieee.exponent != v2.ieee.exponent)
549       {
550         printf ("0.0625 down: exponent differs: %4x vs %4x\n",
551                 v1.ieee.exponent, v2.ieee.exponent);
552         result = 1;
553       }
554     if (v1.ieee.negative != v2.ieee.negative)
555       {
556         printf ("0.0625 down: negative differs: %d vs %d\n",
557                 v1.ieee.negative, v2.ieee.negative);
558         result = 1;
559       }
560
561     v1.d = d = 0.0625;
562     d = nextafter (d, 1.0);
563     v2.d = d = nextafter (d, 0.0);
564
565     if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
566       {
567         printf ("0.0625 up: mantissa0 differs: %8x vs %8x\n",
568                 v1.ieee.mantissa0, v2.ieee.mantissa0);
569         result = 1;
570       }
571     if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
572       {
573         printf ("0.0625 up: mantissa1 differs: %8x vs %8x\n",
574                 v1.ieee.mantissa1, v2.ieee.mantissa1);
575         result = 1;
576       }
577     if (v1.ieee.exponent != v2.ieee.exponent)
578       {
579         printf ("0.0625 up: exponent differs: %4x vs %4x\n",
580                 v1.ieee.exponent, v2.ieee.exponent);
581         result = 1;
582       }
583     if (v1.ieee.negative != v2.ieee.negative)
584       {
585         printf ("0.0625 up: negative differs: %d vs %d\n",
586                 v1.ieee.negative, v2.ieee.negative);
587         result = 1;
588       }
589
590     v1.d = d = -0.0625;
591     d = nextafter (d, 0.0);
592     v2.d = d = nextafter (d, -1.0);
593
594     if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
595       {
596         printf ("-0.0625 up: mantissa0 differs: %8x vs %8x\n",
597                 v1.ieee.mantissa0, v2.ieee.mantissa0);
598         result = 1;
599       }
600     if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
601       {
602         printf ("-0.0625 up: mantissa1 differs: %8x vs %8x\n",
603                 v1.ieee.mantissa1, v2.ieee.mantissa1);
604         result = 1;
605       }
606     if (v1.ieee.exponent != v2.ieee.exponent)
607       {
608         printf ("-0.0625 up: exponent differs: %4x vs %4x\n",
609                 v1.ieee.exponent, v2.ieee.exponent);
610         result = 1;
611       }
612     if (v1.ieee.negative != v2.ieee.negative)
613       {
614         printf ("-0.0625 up: negative differs: %d vs %d\n",
615                 v1.ieee.negative, v2.ieee.negative);
616         result = 1;
617       }
618
619     v1.d = d = -0.0625;
620     d = nextafter (d, -1.0);
621     v2.d = d = nextafter (d, 0.0);
622
623     if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
624       {
625         printf ("-0.0625 down: mantissa0 differs: %8x vs %8x\n",
626                 v1.ieee.mantissa0, v2.ieee.mantissa0);
627         result = 1;
628       }
629     if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
630       {
631         printf ("-0.0625 down: mantissa1 differs: %8x vs %8x\n",
632                 v1.ieee.mantissa1, v2.ieee.mantissa1);
633         result = 1;
634       }
635     if (v1.ieee.exponent != v2.ieee.exponent)
636       {
637         printf ("-0.0625 down: exponent differs: %4x vs %4x\n",
638                 v1.ieee.exponent, v2.ieee.exponent);
639         result = 1;
640       }
641     if (v1.ieee.negative != v2.ieee.negative)
642       {
643         printf ("-0.0625 down: negative differs: %d vs %d\n",
644                 v1.ieee.negative, v2.ieee.negative);
645         result = 1;
646       }
647
648     v1.d = d = 0.0;
649     d = nextafter (d, 1.0);
650     v2.d = nextafter (d, -1.0);
651
652     if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
653       {
654         printf ("0.0 up: mantissa0 differs: %8x vs %8x\n",
655                 v1.ieee.mantissa0, v2.ieee.mantissa0);
656         result = 1;
657       }
658     if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
659       {
660         printf ("0.0 up: mantissa1 differs: %8x vs %8x\n",
661                 v1.ieee.mantissa1, v2.ieee.mantissa1);
662         result = 1;
663       }
664     if (v1.ieee.exponent != v2.ieee.exponent)
665       {
666         printf ("0.0 up: exponent differs: %4x vs %4x\n",
667                 v1.ieee.exponent, v2.ieee.exponent);
668         result = 1;
669       }
670     if (0 != v2.ieee.negative)
671       {
672         printf ("0.0 up: negative differs: 0 vs %d\n",
673                 v2.ieee.negative);
674         result = 1;
675       }
676
677     v1.d = d = 0.0;
678     d = nextafter (d, -1.0);
679     v2.d = nextafter (d, 1.0);
680
681     if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
682       {
683         printf ("0.0 down: mantissa0 differs: %8x vs %8x\n",
684                 v1.ieee.mantissa0, v2.ieee.mantissa0);
685         result = 1;
686       }
687     if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
688       {
689         printf ("0.0 down: mantissa1 differs: %8x vs %8x\n",
690                 v1.ieee.mantissa1, v2.ieee.mantissa1);
691         result = 1;
692       }
693     if (v1.ieee.exponent != v2.ieee.exponent)
694       {
695         printf ("0.0 down: exponent differs: %4x vs %4x\n",
696                 v1.ieee.exponent, v2.ieee.exponent);
697         result = 1;
698       }
699     if (1 != v2.ieee.negative)
700       {
701         printf ("0.0 down: negative differs: 1 vs %d\n",
702                 v2.ieee.negative);
703         result = 1;
704       }
705
706     if (nextafter (0.0, INFINITY) != nextafter (0.0, 1.0)
707         || nextafter (-0.0, INFINITY) != nextafter (-0.0, 1.0)
708         || nextafter (0.0, -INFINITY) != nextafter (0.0, -1.0)
709         || nextafter (-0.0, -INFINITY) != nextafter (-0.0, -1.0))
710       {
711         printf ("nextafter (+-0, +-Inf) != nextafter (+-0, +-1)\n");
712         result = 1;
713       }
714
715     if (nexttoward (0.0, INFINITY) != nexttoward (0.0, 1.0)
716         || nexttoward (-0.0, INFINITY) != nexttoward (-0.0, 1.0)
717         || nexttoward (0.0, -INFINITY) != nexttoward (0.0, -1.0)
718         || nexttoward (-0.0, -INFINITY) != nexttoward (-0.0, -1.0))
719       {
720         printf ("nexttoward (+-0, +-Inf) != nexttoward (+-0, +-1)\n");
721         result = 1;
722       }
723   }
724
725 #ifndef NO_LONG_DOUBLE
726   {
727     union ieee854_long_double v1;
728     union ieee854_long_double v2;
729     long double ld;
730
731     v1.d = ld = LDBL_MIN;
732     if (fpclassify (ld) != FP_NORMAL)
733       {
734         printf ("fpclassify (LDBL_MIN) failed: %d\n", fpclassify (ld));
735         result = 1;
736       }
737     ld = nextafterl (ld, LDBL_MIN / 2.0);
738     if (fpclassify (ld) != FP_SUBNORMAL)
739       {
740         printf ("fpclassify (LDBL_MIN-epsilon) failed: %d (%La)\n",
741                 fpclassify (ld), ld);
742         result = 1;
743       }
744     v2.d = ld = nextafterl (ld, LDBL_MIN);
745     if (fpclassify (ld) != FP_NORMAL)
746       {
747         printf ("fpclassify (LDBL_MIN-epsilon+epsilon) failed: %d (%La)\n",
748                 fpclassify (ld), ld);
749         result = 1;
750       }
751
752     if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
753       {
754         printf ("LDBL_MIN: mantissa0 differs: %8x vs %8x\n",
755                 v1.ieee.mantissa0, v2.ieee.mantissa0);
756         result = 1;
757       }
758     if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
759       {
760         printf ("LDBL_MIN: mantissa1 differs: %8x vs %8x\n",
761                 v1.ieee.mantissa1, v2.ieee.mantissa1);
762         result = 1;
763       }
764     if (v1.ieee.exponent != v2.ieee.exponent)
765       {
766         printf ("LDBL_MIN: exponent differs: %4x vs %4x\n",
767                 v1.ieee.exponent, v2.ieee.exponent);
768         result = 1;
769       }
770     if (v1.ieee.negative != v2.ieee.negative)
771       {
772         printf ("LDBL_MIN: negative differs: %d vs %d\n",
773                 v1.ieee.negative, v2.ieee.negative);
774         result = 1;
775       }
776
777     v1.d = ld = -LDBL_MIN;
778     if (fpclassify (ld) != FP_NORMAL)
779       {
780         printf ("fpclassify (-LDBL_MIN) failed: %d\n", fpclassify (ld));
781         result = 1;
782       }
783     ld = nextafterl (ld, -LDBL_MIN / 2.0);
784     if (fpclassify (ld) != FP_SUBNORMAL)
785       {
786         printf ("fpclassify (-LDBL_MIN-epsilon) failed: %d (%La)\n",
787                 fpclassify (ld), ld);
788         result = 1;
789       }
790     v2.d = ld = nextafterl (ld, -LDBL_MIN);
791     if (fpclassify (ld) != FP_NORMAL)
792       {
793         printf ("fpclassify (-LDBL_MIN-epsilon+epsilon) failed: %d (%La)\n",
794                 fpclassify (ld), ld);
795         result = 1;
796       }
797
798     if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
799       {
800         printf ("-LDBL_MIN: mantissa0 differs: %8x vs %8x\n",
801                 v1.ieee.mantissa0, v2.ieee.mantissa0);
802         result = 1;
803       }
804     if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
805       {
806         printf ("-LDBL_MIN: mantissa1 differs: %8x vs %8x\n",
807                 v1.ieee.mantissa1, v2.ieee.mantissa1);
808         result = 1;
809       }
810     if (v1.ieee.exponent != v2.ieee.exponent)
811       {
812         printf ("-LDBL_MIN: exponent differs: %4x vs %4x\n",
813                 v1.ieee.exponent, v2.ieee.exponent);
814         result = 1;
815       }
816     if (v1.ieee.negative != v2.ieee.negative)
817       {
818         printf ("-LDBL_MIN: negative differs: %d vs %d\n",
819                 v1.ieee.negative, v2.ieee.negative);
820         result = 1;
821       }
822
823     ld = LDBL_MAX;
824     if (fpclassify (ld) != FP_NORMAL)
825       {
826         printf ("fpclassify (LDBL_MAX) failed: %d\n", fpclassify (ld));
827         result = 1;
828       }
829     ld = nextafterl (ld, INFINITY);
830     if (fpclassify (ld) != FP_INFINITE)
831       {
832         printf ("fpclassify (LDBL_MAX+epsilon) failed: %d\n", fpclassify (ld));
833         result = 1;
834       }
835
836     ld = -LDBL_MAX;
837     if (fpclassify (ld) != FP_NORMAL)
838       {
839         printf ("fpclassify (-LDBL_MAX) failed: %d\n", fpclassify (ld));
840         result = 1;
841       }
842     ld = nextafterl (ld, -INFINITY);
843     if (fpclassify (ld) != FP_INFINITE)
844       {
845         printf ("fpclassify (-LDBL_MAX-epsilon) failed: %d\n",
846                 fpclassify (ld));
847         result = 1;
848       }
849
850     v1.d = ld = 0.0625;
851     ld = nextafterl (ld, 0.0);
852     v2.d = ld = nextafterl (ld, 1.0);
853
854     if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
855       {
856         printf ("0.0625L down: mantissa0 differs: %8x vs %8x\n",
857                 v1.ieee.mantissa0, v2.ieee.mantissa0);
858         result = 1;
859       }
860     if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
861       {
862         printf ("0.0625L down: mantissa1 differs: %8x vs %8x\n",
863                 v1.ieee.mantissa1, v2.ieee.mantissa1);
864         result = 1;
865       }
866     if (v1.ieee.exponent != v2.ieee.exponent)
867       {
868         printf ("0.0625L down: exponent differs: %4x vs %4x\n",
869                 v1.ieee.exponent, v2.ieee.exponent);
870         result = 1;
871       }
872     if (v1.ieee.negative != v2.ieee.negative)
873       {
874         printf ("0.0625L down: negative differs: %d vs %d\n",
875                 v1.ieee.negative, v2.ieee.negative);
876         result = 1;
877       }
878
879     v1.d = ld = 0.0625;
880     ld = nextafterl (ld, 1.0);
881     v2.d = ld = nextafterl (ld, 0.0);
882
883     if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
884       {
885         printf ("0.0625L up: mantissa0 differs: %8x vs %8x\n",
886                 v1.ieee.mantissa0, v2.ieee.mantissa0);
887         result = 1;
888       }
889     if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
890       {
891         printf ("0.0625L up: mantissa1 differs: %8x vs %8x\n",
892                 v1.ieee.mantissa1, v2.ieee.mantissa1);
893         result = 1;
894       }
895     if (v1.ieee.exponent != v2.ieee.exponent)
896       {
897         printf ("0.0625L up: exponent differs: %4x vs %4x\n",
898                 v1.ieee.exponent, v2.ieee.exponent);
899         result = 1;
900       }
901     if (v1.ieee.negative != v2.ieee.negative)
902       {
903         printf ("0.0625L up: negative differs: %d vs %d\n",
904                 v1.ieee.negative, v2.ieee.negative);
905         result = 1;
906       }
907
908     v1.d = ld = -0.0625;
909     ld = nextafterl (ld, 0.0);
910     v2.d = ld = nextafterl (ld, -1.0);
911
912     if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
913       {
914         printf ("-0.0625L up: mantissa0 differs: %8x vs %8x\n",
915                 v1.ieee.mantissa0, v2.ieee.mantissa0);
916         result = 1;
917       }
918     if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
919       {
920         printf ("-0.0625L up: mantissa1 differs: %8x vs %8x\n",
921                 v1.ieee.mantissa1, v2.ieee.mantissa1);
922         result = 1;
923       }
924     if (v1.ieee.exponent != v2.ieee.exponent)
925       {
926         printf ("-0.0625L up: exponent differs: %4x vs %4x\n",
927                 v1.ieee.exponent, v2.ieee.exponent);
928         result = 1;
929       }
930     if (v1.ieee.negative != v2.ieee.negative)
931       {
932         printf ("-0.0625L up: negative differs: %d vs %d\n",
933                 v1.ieee.negative, v2.ieee.negative);
934         result = 1;
935       }
936
937     v1.d = ld = -0.0625;
938     ld = nextafterl (ld, -1.0);
939     v2.d = ld = nextafterl (ld, 0.0);
940
941     if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
942       {
943         printf ("-0.0625L down: mantissa0 differs: %8x vs %8x\n",
944                 v1.ieee.mantissa0, v2.ieee.mantissa0);
945         result = 1;
946       }
947     if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
948       {
949         printf ("-0.0625L down: mantissa1 differs: %8x vs %8x\n",
950                 v1.ieee.mantissa1, v2.ieee.mantissa1);
951         result = 1;
952       }
953     if (v1.ieee.exponent != v2.ieee.exponent)
954       {
955         printf ("-0.0625L down: exponent differs: %4x vs %4x\n",
956                 v1.ieee.exponent, v2.ieee.exponent);
957         result = 1;
958       }
959     if (v1.ieee.negative != v2.ieee.negative)
960       {
961         printf ("-0.0625L down: negative differs: %d vs %d\n",
962                 v1.ieee.negative, v2.ieee.negative);
963         result = 1;
964       }
965
966     v1.d = ld = 0.0;
967     ld = nextafterl (ld, 1.0);
968     v2.d = nextafterl (ld, -1.0);
969
970     if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
971       {
972         printf ("0.0L up: mantissa0 differs: %8x vs %8x\n",
973                 v1.ieee.mantissa0, v2.ieee.mantissa0);
974         result = 1;
975       }
976     if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
977       {
978         printf ("0.0L up: mantissa1 differs: %8x vs %8x\n",
979                 v1.ieee.mantissa1, v2.ieee.mantissa1);
980         result = 1;
981       }
982     if (v1.ieee.exponent != v2.ieee.exponent)
983       {
984         printf ("0.0L up: exponent differs: %4x vs %4x\n",
985                 v1.ieee.exponent, v2.ieee.exponent);
986         result = 1;
987       }
988     if (0 != v2.ieee.negative)
989       {
990         printf ("0.0L up: negative differs: 0 vs %d\n",
991                 v2.ieee.negative);
992         result = 1;
993       }
994
995     v1.d = ld = 0.0;
996     ld = nextafterl (ld, -1.0);
997     v2.d = nextafterl (ld, 1.0);
998
999     if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
1000       {
1001         printf ("0.0L down: mantissa0 differs: %8x vs %8x\n",
1002                 v1.ieee.mantissa0, v2.ieee.mantissa0);
1003         result = 1;
1004       }
1005     if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
1006       {
1007         printf ("0.0L down: mantissa1 differs: %8x vs %8x\n",
1008                 v1.ieee.mantissa1, v2.ieee.mantissa1);
1009         result = 1;
1010       }
1011     if (v1.ieee.exponent != v2.ieee.exponent)
1012       {
1013         printf ("0.0L down: exponent differs: %4x vs %4x\n",
1014                 v1.ieee.exponent, v2.ieee.exponent);
1015         result = 1;
1016       }
1017     if (1 != v2.ieee.negative)
1018       {
1019         printf ("0.0L down: negative differs: 1 vs %d\n",
1020                 v2.ieee.negative);
1021         result = 1;
1022       }
1023
1024     if (nextafterl (0.0, INFINITY) != nextafterl (0.0, 1.0)
1025         || nextafterl (-0.0, INFINITY) != nextafterl (-0.0, 1.0)
1026         || nextafterl (0.0, -INFINITY) != nextafterl (0.0, -1.0)
1027         || nextafterl (-0.0, -INFINITY) != nextafterl (-0.0, -1.0))
1028       {
1029         printf ("nextafterl (+-0, +-Inf) != nextafterl (+-0, +-1)\n");
1030         result = 1;
1031       }
1032
1033     if (nexttowardl (0.0L, INFINITY) != nexttowardl (0.0L, 1.0L)
1034         || nexttowardl (-0.0L, INFINITY) != nexttowardl (-0.0L, 1.0L)
1035         || nexttowardl (0.0L, -INFINITY) != nexttowardl (0.0L, -1.0L)
1036         || nexttowardl (-0.0L, -INFINITY) != nexttowardl (-0.0L, -1.0L))
1037       {
1038         printf ("nexttowardl (+-0, +-Inf) != nexttowardl (+-0, +-1)\n");
1039         result = 1;
1040       }
1041   }
1042 #endif
1043
1044   if (! isnormal (FLT_MIN))
1045     {
1046       puts ("isnormal (FLT_MIN) failed");
1047       result = 1;
1048     }
1049   if (! isnormal (DBL_MIN))
1050     {
1051       puts ("isnormal (DBL_MIN) failed");
1052       result = 1;
1053     }
1054 #ifndef NO_LONG_DOUBLE
1055   if (! isnormal (LDBL_MIN))
1056     {
1057       puts ("isnormal (LDBL_MIN) failed");
1058       result = 1;
1059     }
1060 #endif
1061
1062 #ifdef __i386__
1063   /* This is a test for the strange long doubles in x86 FPUs.  */
1064   {
1065     union
1066     {
1067       char b[10];
1068       long double d;
1069     } u =
1070       { .b = { 0, 0, 0, 0, 0, 0, 0, 0x80, 0, 0 } };
1071
1072     if (fpclassify (u.d) != FP_NORMAL)
1073       {
1074         printf ("fpclassify (0x00008000000000000000) failed: %d (%Lg)\n",
1075                 fpclassify (u.d), u.d);
1076         result = 1;
1077       }
1078   }
1079
1080   /* Special NaNs in x86 long double.  Test for scalbl.  */
1081   {
1082     union
1083     {
1084       char b[10];
1085       long double d;
1086     } u =
1087       { .b = { 0, 1, 0, 0, 0, 0, 0, 0xc0, 0xff, 0x7f } };
1088     long double r;
1089
1090     r = scalbl (u.d, 0.0);
1091     if (!isnan (r))
1092       {
1093         puts ("scalbl(NaN, 0) does not return NaN");
1094         result = 1;
1095       }
1096     else if (memcmp (&r, &u.d, sizeof (double)) != 0)
1097       {
1098         puts ("scalbl(NaN, 0) does not return the same NaN");
1099         result = 1;
1100       }
1101   }
1102 #endif
1103
1104 #ifndef NO_LONG_DOUBLE
1105   {
1106     long double r;
1107
1108     feclearexcept (FE_ALL_EXCEPT);
1109     r = scalbl (LDBL_MIN, 2147483647);
1110     if (! isinf (r))
1111       {
1112         puts ("scalbl (LDBL_MIN, 2147483647) does not return Inf");
1113         result = 1;
1114       }
1115     else if (signbit (r) != 0)
1116       {
1117         puts ("scalbl (LDBL_MIN, 2147483647) returns -Inf");
1118         result = 1;
1119       }
1120     else if (fetestexcept (FE_UNDERFLOW))
1121       {
1122         puts ("scalbl(NaN, 0) raises underflow exception");
1123         result = 1;
1124       }
1125
1126     feclearexcept (FE_ALL_EXCEPT);
1127     r = scalbl (LDBL_MAX, -2147483647);
1128     if (r != 0.0)
1129       {
1130         puts ("scalbl (LDBL_MAX, -2147483647) does not return 0");
1131         result = 1;
1132       }
1133     else if (signbit (r) != 0)
1134       {
1135         puts ("scalbl (LDBL_MAX, -2147483647) returns -Inf");
1136         result = 1;
1137       }
1138     else if (fetestexcept (FE_OVERFLOW))
1139       {
1140         puts ("scalbl(NaN, 0) raises overflow exception");
1141         result = 1;
1142       }
1143   }
1144 #endif
1145
1146   /* The tests here are very similar to tests earlier in this file,
1147      the important difference is just that there are no intervening
1148      union variables that cause some GCC versions to hide possible
1149      bugs in nextafter* implementation.  */
1150   if (nextafterf (nextafterf (FLT_MIN, FLT_MIN / 2.0), FLT_MIN) != FLT_MIN)
1151     {
1152       puts ("nextafterf FLT_MIN test failed");
1153       result = 1;
1154     }
1155   if (nextafterf (nextafterf (-FLT_MIN, -FLT_MIN / 2.0), -FLT_MIN)
1156       != -FLT_MIN)
1157     {
1158       puts ("nextafterf -FLT_MIN test failed");
1159       result = 1;
1160     }
1161   if (nextafter (nextafter (DBL_MIN, DBL_MIN / 2.0), DBL_MIN) != DBL_MIN)
1162     {
1163       puts ("nextafter DBL_MIN test failed");
1164       result = 1;
1165     }
1166   if (nextafter (nextafter (-DBL_MIN, -DBL_MIN / 2.0), -DBL_MIN) != -DBL_MIN)
1167     {
1168       puts ("nextafter -DBL_MIN test failed");
1169       result = 1;
1170     }
1171 #ifndef NO_LONG_DOUBLE
1172   if (nextafterl (nextafterl (LDBL_MIN, LDBL_MIN / 2.0), LDBL_MIN)
1173       != LDBL_MIN)
1174     {
1175       puts ("nextafterl LDBL_MIN test failed");
1176       result = 1;
1177     }
1178   if (nextafterl (nextafterl (-LDBL_MIN, -LDBL_MIN / 2.0), -LDBL_MIN)
1179       != -LDBL_MIN)
1180     {
1181       puts ("nextafterl -LDBL_MIN test failed");
1182       result = 1;
1183     }
1184 #endif
1185
1186   return result;
1187 }