New file.
[glibc.git] / math / test-misc.c
blob1ba2943a5ae762bf6e57788f0bcbaf267338c3c7
1 /* Miscellaneous tests which don't fit anywhere else.
2 Copyright (C) 2000 Free Software Foundation, Inc.
3 This file is part of the GNU C Library.
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public License as
7 published by the Free Software Foundation; either version 2 of the
8 License, or (at your option) any later version.
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 Library General Public License for more details.
15 You should have received a copy of the GNU Library General Public
16 License along with the GNU C Library; see the file COPYING.LIB. If not,
17 write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. */
20 #include <fenv.h>
21 #include <ieee754.h>
22 #include <math.h>
23 #include <stdio.h>
24 #include <string.h>
27 int
28 main (void)
30 int result = 0;
32 #ifndef NO_LONG_DOUBLE
34 long double x = 0x100000001ll + (long double) 0.5;
35 long double q;
36 long double r;
38 r = modfl (x, &q);
39 if (q != (long double) 0x100000001ll || r != 0.5)
41 printf ("modfl (%Lg, ...) failed\n", x);
42 result = 1;
46 # if __GNUC__ >= 3 || __GNUC_MINOR__ >= 96
48 long double x;
49 long double m;
50 long double r;
51 int e;
52 int i;
54 # if LDBL_MANT_DIG == 64
55 m = 0xf.fffffffffffffffp-4L;
56 # elif LDBL_MANT_DIG == 113
57 m = 0x1.ffffffffffffffffffffffffffffp-1L;
58 # else
59 # error "Please adjust"
60 # endif
62 for (i = LDBL_MAX_EXP, x = LDBL_MAX; i >= LDBL_MIN_EXP; --i, x /= 2.0L)
64 printf ("2^%d: ", i);
66 r = frexpl (x, &e);
67 if (r != m)
69 printf ("mantissa incorrect: %.20La\n", r);
70 result = 1;
71 continue;
73 if (e != i)
75 printf ("exponent wrong %d (%.20Lg)\n", e, x);
76 result = 1;
77 continue;
79 puts ("ok");
82 # endif
84 #if 0
86 int e;
87 long double r = frexpl (LDBL_MIN * LDBL_EPSILON, &e);
89 if (r != 0.5)
91 printf ("frexpl (LDBL_MIN * LDBL_EPSILON, ...): mantissa wrong: %Lg\n",
92 r);
93 result = 1;
95 else if (e != -16444)
97 printf ("frexpl (LDBL_MIN * LDBL_EPSILON, ...): exponent wrong: %d\n",
98 e);
99 result = 1;
102 #endif
103 #endif
106 double x = 0x100000001ll + (double) 0.5;
107 double q;
108 double r;
110 r = modf (x, &q);
111 if (q != (double) 0x100000001ll || r != 0.5)
113 printf ("modf (%g, ...) failed\n", x);
114 result = 1;
119 union ieee754_float v1;
120 union ieee754_float v2;
121 float f;
123 v1.f = f = FLT_MIN;
124 if (fpclassify (f) != FP_NORMAL)
126 printf ("fpclassify (FLT_MIN) failed: %d\n", fpclassify (f));
127 result = 1;
129 f = nextafterf (f, FLT_MIN / 2.0f);
130 if (fpclassify (f) != FP_SUBNORMAL)
132 printf ("fpclassify (FLT_MIN-epsilon) failed: %d\n", fpclassify (f));
133 result = 1;
135 v2.f = f = nextafterf (f, FLT_MIN);
136 if (fpclassify (f) != FP_NORMAL)
138 printf ("fpclassify (FLT_MIN-epsilon+epsilon) failed: %d\n",
139 fpclassify (f));
140 result = 1;
143 if (v1.ieee.mantissa != v2.ieee.mantissa)
145 printf ("FLT_MIN: mantissa differs: %8x vs %8x\n",
146 v1.ieee.mantissa, v2.ieee.mantissa);
147 result = 1;
149 if (v1.ieee.exponent != v2.ieee.exponent)
151 printf ("FLT_MIN: exponent differs: %4x vs %4x\n",
152 v1.ieee.exponent, v2.ieee.exponent);
153 result = 1;
155 if (v1.ieee.negative != v2.ieee.negative)
157 printf ("FLT_MIN: negative differs: %d vs %d\n",
158 v1.ieee.negative, v2.ieee.negative);
159 result = 1;
162 v1.f = f = -FLT_MIN;
163 if (fpclassify (f) != FP_NORMAL)
165 printf ("fpclassify (-FLT_MIN) failed: %d\n", fpclassify (f));
166 result = 1;
168 f = nextafterf (f, -FLT_MIN / 2.0f);
169 if (fpclassify (f) != FP_SUBNORMAL)
171 printf ("fpclassify (-FLT_MIN-epsilon) failed: %d\n", fpclassify (f));
172 result = 1;
174 v2.f = f = nextafterf (f, -FLT_MIN);
175 if (fpclassify (f) != FP_NORMAL)
177 printf ("fpclassify (-FLT_MIN-epsilon+epsilon) failed: %d\n",
178 fpclassify (f));
179 result = 1;
182 if (v1.ieee.mantissa != v2.ieee.mantissa)
184 printf ("-FLT_MIN: mantissa differs: %8x vs %8x\n",
185 v1.ieee.mantissa, v2.ieee.mantissa);
186 result = 1;
188 if (v1.ieee.exponent != v2.ieee.exponent)
190 printf ("-FLT_MIN: exponent differs: %4x vs %4x\n",
191 v1.ieee.exponent, v2.ieee.exponent);
192 result = 1;
194 if (v1.ieee.negative != v2.ieee.negative)
196 printf ("-FLT_MIN: negative differs: %d vs %d\n",
197 v1.ieee.negative, v2.ieee.negative);
198 result = 1;
201 f = FLT_MAX;
202 if (fpclassify (f) != FP_NORMAL)
204 printf ("fpclassify (FLT_MAX) failed: %d\n", fpclassify (f));
205 result = 1;
207 f = nextafterf (f, INFINITY);
208 if (fpclassify (f) != FP_INFINITE)
210 printf ("fpclassify (FLT_MAX+epsilon) failed: %d\n", fpclassify (f));
211 result = 1;
214 f = -FLT_MAX;
215 if (fpclassify (f) != FP_NORMAL)
217 printf ("fpclassify (-FLT_MAX) failed: %d\n", fpclassify (f));
218 result = 1;
220 f = nextafterf (f, -INFINITY);
221 if (fpclassify (f) != FP_INFINITE)
223 printf ("fpclassify (-FLT_MAX-epsilon) failed: %d\n", fpclassify (f));
224 result = 1;
227 v1.f = f = 0.0625;
228 f = nextafterf (f, 0.0);
229 v2.f = f = nextafterf (f, 1.0);
231 if (v1.ieee.mantissa != v2.ieee.mantissa)
233 printf ("0.0625f down: mantissa differs: %8x vs %8x\n",
234 v1.ieee.mantissa, v2.ieee.mantissa);
235 result = 1;
237 if (v1.ieee.exponent != v2.ieee.exponent)
239 printf ("0.0625f down: exponent differs: %4x vs %4x\n",
240 v1.ieee.exponent, v2.ieee.exponent);
241 result = 1;
243 if (v1.ieee.negative != v2.ieee.negative)
245 printf ("0.0625f down: negative differs: %d vs %d\n",
246 v1.ieee.negative, v2.ieee.negative);
247 result = 1;
250 v1.f = f = 0.0625;
251 f = nextafterf (f, 1.0);
252 v2.f = f = nextafterf (f, 0.0);
254 if (v1.ieee.mantissa != v2.ieee.mantissa)
256 printf ("0.0625f up: mantissa differs: %8x vs %8x\n",
257 v1.ieee.mantissa, v2.ieee.mantissa);
258 result = 1;
260 if (v1.ieee.exponent != v2.ieee.exponent)
262 printf ("0.0625f up: exponent differs: %4x vs %4x\n",
263 v1.ieee.exponent, v2.ieee.exponent);
264 result = 1;
266 if (v1.ieee.negative != v2.ieee.negative)
268 printf ("0.0625f up: negative differs: %d vs %d\n",
269 v1.ieee.negative, v2.ieee.negative);
270 result = 1;
273 v1.f = f = -0.0625;
274 f = nextafterf (f, 0.0);
275 v2.f = f = nextafterf (f, -1.0);
277 if (v1.ieee.mantissa != v2.ieee.mantissa)
279 printf ("-0.0625f up: mantissa differs: %8x vs %8x\n",
280 v1.ieee.mantissa, v2.ieee.mantissa);
281 result = 1;
283 if (v1.ieee.exponent != v2.ieee.exponent)
285 printf ("-0.0625f up: exponent differs: %4x vs %4x\n",
286 v1.ieee.exponent, v2.ieee.exponent);
287 result = 1;
289 if (v1.ieee.negative != v2.ieee.negative)
291 printf ("-0.0625f up: negative differs: %d vs %d\n",
292 v1.ieee.negative, v2.ieee.negative);
293 result = 1;
296 v1.f = f = -0.0625;
297 f = nextafterf (f, -1.0);
298 v2.f = f = nextafterf (f, 0.0);
300 if (v1.ieee.mantissa != v2.ieee.mantissa)
302 printf ("-0.0625f down: mantissa differs: %8x vs %8x\n",
303 v1.ieee.mantissa, v2.ieee.mantissa);
304 result = 1;
306 if (v1.ieee.exponent != v2.ieee.exponent)
308 printf ("-0.0625f down: exponent differs: %4x vs %4x\n",
309 v1.ieee.exponent, v2.ieee.exponent);
310 result = 1;
312 if (v1.ieee.negative != v2.ieee.negative)
314 printf ("-0.0625f down: negative differs: %d vs %d\n",
315 v1.ieee.negative, v2.ieee.negative);
316 result = 1;
319 v1.f = f = 0.0f;
320 f = nextafterf (f, 1.0);
321 v2.f = nextafterf (f, -1.0);
323 if (v1.ieee.mantissa != v2.ieee.mantissa)
325 printf ("0.0f up: mantissa differs: %8x vs %8x\n",
326 v1.ieee.mantissa, v2.ieee.mantissa);
327 result = 1;
329 if (v1.ieee.exponent != v2.ieee.exponent)
331 printf ("0.0f up: exponent differs: %4x vs %4x\n",
332 v1.ieee.exponent, v2.ieee.exponent);
333 result = 1;
335 if (0 != v2.ieee.negative)
337 printf ("0.0f up: negative differs: 0 vs %d\n",
338 v2.ieee.negative);
339 result = 1;
342 v1.f = f = 0.0f;
343 f = nextafterf (f, -1.0);
344 v2.f = nextafterf (f, 1.0);
346 if (v1.ieee.mantissa != v2.ieee.mantissa)
348 printf ("0.0f down: mantissa differs: %8x vs %8x\n",
349 v1.ieee.mantissa, v2.ieee.mantissa);
350 result = 1;
352 if (v1.ieee.exponent != v2.ieee.exponent)
354 printf ("0.0f down: exponent differs: %4x vs %4x\n",
355 v1.ieee.exponent, v2.ieee.exponent);
356 result = 1;
358 if (1 != v2.ieee.negative)
360 printf ("0.0f down: negative differs: 1 vs %d\n",
361 v2.ieee.negative);
362 result = 1;
367 union ieee754_double v1;
368 union ieee754_double v2;
369 double d;
371 v1.d = d = DBL_MIN;
372 if (fpclassify (d) != FP_NORMAL)
374 printf ("fpclassify (DBL_MIN) failed: %d\n", fpclassify (d));
375 result = 1;
377 d = nextafter (d, DBL_MIN / 2.0);
378 if (fpclassify (d) != FP_SUBNORMAL)
380 printf ("fpclassify (DBL_MIN-epsilon) failed: %d\n", fpclassify (d));
381 result = 1;
383 v2.d = d = nextafter (d, DBL_MIN);
384 if (fpclassify (d) != FP_NORMAL)
386 printf ("fpclassify (DBL_MIN-epsilon+epsilon) failed: %d\n",
387 fpclassify (d));
388 result = 1;
391 if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
393 printf ("DBL_MIN: mantissa0 differs: %8x vs %8x\n",
394 v1.ieee.mantissa0, v2.ieee.mantissa0);
395 result = 1;
397 if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
399 printf ("DBL_MIN: mantissa1 differs: %8x vs %8x\n",
400 v1.ieee.mantissa1, v2.ieee.mantissa1);
401 result = 1;
403 if (v1.ieee.exponent != v2.ieee.exponent)
405 printf ("DBL_MIN: exponent differs: %4x vs %4x\n",
406 v1.ieee.exponent, v2.ieee.exponent);
407 result = 1;
409 if (v1.ieee.negative != v2.ieee.negative)
411 printf ("DBL_MIN: negative differs: %d vs %d\n",
412 v1.ieee.negative, v2.ieee.negative);
413 result = 1;
416 v1.d = d = -DBL_MIN;
417 if (fpclassify (d) != FP_NORMAL)
419 printf ("fpclassify (-DBL_MIN) failed: %d\n", fpclassify (d));
420 result = 1;
422 d = nextafter (d, -DBL_MIN / 2.0);
423 if (fpclassify (d) != FP_SUBNORMAL)
425 printf ("fpclassify (-DBL_MIN-epsilon) failed: %d\n", fpclassify (d));
426 result = 1;
428 v2.d = d = nextafter (d, -DBL_MIN);
429 if (fpclassify (d) != FP_NORMAL)
431 printf ("fpclassify (-DBL_MIN-epsilon+epsilon) failed: %d\n",
432 fpclassify (d));
433 result = 1;
436 if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
438 printf ("-DBL_MIN: mantissa0 differs: %8x vs %8x\n",
439 v1.ieee.mantissa0, v2.ieee.mantissa0);
440 result = 1;
442 if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
444 printf ("-DBL_MIN: mantissa1 differs: %8x vs %8x\n",
445 v1.ieee.mantissa1, v2.ieee.mantissa1);
446 result = 1;
448 if (v1.ieee.exponent != v2.ieee.exponent)
450 printf ("-DBL_MIN: exponent differs: %4x vs %4x\n",
451 v1.ieee.exponent, v2.ieee.exponent);
452 result = 1;
454 if (v1.ieee.negative != v2.ieee.negative)
456 printf ("-DBL_MIN: negative differs: %d vs %d\n",
457 v1.ieee.negative, v2.ieee.negative);
458 result = 1;
461 d = DBL_MAX;
462 if (fpclassify (d) != FP_NORMAL)
464 printf ("fpclassify (DBL_MAX) failed: %d\n", fpclassify (d));
465 result = 1;
467 d = nextafter (d, INFINITY);
468 if (fpclassify (d) != FP_INFINITE)
470 printf ("fpclassify (DBL_MAX+epsilon) failed: %d\n", fpclassify (d));
471 result = 1;
474 d = -DBL_MAX;
475 if (fpclassify (d) != FP_NORMAL)
477 printf ("fpclassify (-DBL_MAX) failed: %d\n", fpclassify (d));
478 result = 1;
480 d = nextafter (d, -INFINITY);
481 if (fpclassify (d) != FP_INFINITE)
483 printf ("fpclassify (-DBL_MAX-epsilon) failed: %d\n", fpclassify (d));
484 result = 1;
487 v1.d = d = 0.0625;
488 d = nextafter (d, 0.0);
489 v2.d = d = nextafter (d, 1.0);
491 if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
493 printf ("0.0625 down: mantissa0 differs: %8x vs %8x\n",
494 v1.ieee.mantissa0, v2.ieee.mantissa0);
495 result = 1;
497 if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
499 printf ("0.0625 down: mantissa1 differs: %8x vs %8x\n",
500 v1.ieee.mantissa1, v2.ieee.mantissa1);
501 result = 1;
503 if (v1.ieee.exponent != v2.ieee.exponent)
505 printf ("0.0625 down: exponent differs: %4x vs %4x\n",
506 v1.ieee.exponent, v2.ieee.exponent);
507 result = 1;
509 if (v1.ieee.negative != v2.ieee.negative)
511 printf ("0.0625 down: negative differs: %d vs %d\n",
512 v1.ieee.negative, v2.ieee.negative);
513 result = 1;
516 v1.d = d = 0.0625;
517 d = nextafter (d, 1.0);
518 v2.d = d = nextafter (d, 0.0);
520 if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
522 printf ("0.0625 up: mantissa0 differs: %8x vs %8x\n",
523 v1.ieee.mantissa0, v2.ieee.mantissa0);
524 result = 1;
526 if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
528 printf ("0.0625 up: mantissa1 differs: %8x vs %8x\n",
529 v1.ieee.mantissa1, v2.ieee.mantissa1);
530 result = 1;
532 if (v1.ieee.exponent != v2.ieee.exponent)
534 printf ("0.0625 up: exponent differs: %4x vs %4x\n",
535 v1.ieee.exponent, v2.ieee.exponent);
536 result = 1;
538 if (v1.ieee.negative != v2.ieee.negative)
540 printf ("0.0625 up: negative differs: %d vs %d\n",
541 v1.ieee.negative, v2.ieee.negative);
542 result = 1;
545 v1.d = d = -0.0625;
546 d = nextafter (d, 0.0);
547 v2.d = d = nextafter (d, -1.0);
549 if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
551 printf ("-0.0625 up: mantissa0 differs: %8x vs %8x\n",
552 v1.ieee.mantissa0, v2.ieee.mantissa0);
553 result = 1;
555 if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
557 printf ("-0.0625 up: mantissa1 differs: %8x vs %8x\n",
558 v1.ieee.mantissa1, v2.ieee.mantissa1);
559 result = 1;
561 if (v1.ieee.exponent != v2.ieee.exponent)
563 printf ("-0.0625 up: exponent differs: %4x vs %4x\n",
564 v1.ieee.exponent, v2.ieee.exponent);
565 result = 1;
567 if (v1.ieee.negative != v2.ieee.negative)
569 printf ("-0.0625 up: negative differs: %d vs %d\n",
570 v1.ieee.negative, v2.ieee.negative);
571 result = 1;
574 v1.d = d = -0.0625;
575 d = nextafter (d, -1.0);
576 v2.d = d = nextafter (d, 0.0);
578 if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
580 printf ("-0.0625 down: mantissa0 differs: %8x vs %8x\n",
581 v1.ieee.mantissa0, v2.ieee.mantissa0);
582 result = 1;
584 if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
586 printf ("-0.0625 down: mantissa1 differs: %8x vs %8x\n",
587 v1.ieee.mantissa1, v2.ieee.mantissa1);
588 result = 1;
590 if (v1.ieee.exponent != v2.ieee.exponent)
592 printf ("-0.0625 down: exponent differs: %4x vs %4x\n",
593 v1.ieee.exponent, v2.ieee.exponent);
594 result = 1;
596 if (v1.ieee.negative != v2.ieee.negative)
598 printf ("-0.0625 down: negative differs: %d vs %d\n",
599 v1.ieee.negative, v2.ieee.negative);
600 result = 1;
603 v1.d = d = 0.0;
604 d = nextafter (d, 1.0);
605 v2.d = nextafter (d, -1.0);
607 if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
609 printf ("0.0 up: mantissa0 differs: %8x vs %8x\n",
610 v1.ieee.mantissa0, v2.ieee.mantissa0);
611 result = 1;
613 if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
615 printf ("0.0 up: mantissa1 differs: %8x vs %8x\n",
616 v1.ieee.mantissa1, v2.ieee.mantissa1);
617 result = 1;
619 if (v1.ieee.exponent != v2.ieee.exponent)
621 printf ("0.0 up: exponent differs: %4x vs %4x\n",
622 v1.ieee.exponent, v2.ieee.exponent);
623 result = 1;
625 if (0 != v2.ieee.negative)
627 printf ("0.0 up: negative differs: 0 vs %d\n",
628 v2.ieee.negative);
629 result = 1;
632 v1.d = d = 0.0;
633 d = nextafter (d, -1.0);
634 v2.d = nextafter (d, 1.0);
636 if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
638 printf ("0.0 down: mantissa0 differs: %8x vs %8x\n",
639 v1.ieee.mantissa0, v2.ieee.mantissa0);
640 result = 1;
642 if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
644 printf ("0.0 down: mantissa1 differs: %8x vs %8x\n",
645 v1.ieee.mantissa1, v2.ieee.mantissa1);
646 result = 1;
648 if (v1.ieee.exponent != v2.ieee.exponent)
650 printf ("0.0 down: exponent differs: %4x vs %4x\n",
651 v1.ieee.exponent, v2.ieee.exponent);
652 result = 1;
654 if (1 != v2.ieee.negative)
656 printf ("0.0 down: negative differs: 1 vs %d\n",
657 v2.ieee.negative);
658 result = 1;
662 #ifndef NO_LONG_DOUBLE
664 union ieee854_long_double v1;
665 union ieee854_long_double v2;
666 long double ld;
668 v1.d = ld = LDBL_MIN;
669 if (fpclassify (ld) != FP_NORMAL)
671 printf ("fpclassify (LDBL_MIN) failed: %d\n", fpclassify (ld));
672 result = 1;
674 ld = nextafterl (ld, LDBL_MIN / 2.0);
675 if (fpclassify (ld) != FP_SUBNORMAL)
677 printf ("fpclassify (LDBL_MIN-epsilon) failed: %d (%La)\n",
678 fpclassify (ld), ld);
679 result = 1;
681 v2.d = ld = nextafterl (ld, LDBL_MIN);
682 if (fpclassify (ld) != FP_NORMAL)
684 printf ("fpclassify (LDBL_MIN-epsilon+epsilon) failed: %d (%La)\n",
685 fpclassify (ld), ld);
686 result = 1;
689 if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
691 printf ("LDBL_MIN: mantissa0 differs: %8x vs %8x\n",
692 v1.ieee.mantissa0, v2.ieee.mantissa0);
693 result = 1;
695 if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
697 printf ("LDBL_MIN: mantissa1 differs: %8x vs %8x\n",
698 v1.ieee.mantissa1, v2.ieee.mantissa1);
699 result = 1;
701 if (v1.ieee.exponent != v2.ieee.exponent)
703 printf ("LDBL_MIN: exponent differs: %4x vs %4x\n",
704 v1.ieee.exponent, v2.ieee.exponent);
705 result = 1;
707 if (v1.ieee.negative != v2.ieee.negative)
709 printf ("LDBL_MIN: negative differs: %d vs %d\n",
710 v1.ieee.negative, v2.ieee.negative);
711 result = 1;
714 v1.d = ld = -LDBL_MIN;
715 if (fpclassify (ld) != FP_NORMAL)
717 printf ("fpclassify (-LDBL_MIN) failed: %d\n", fpclassify (ld));
718 result = 1;
720 ld = nextafterl (ld, -LDBL_MIN / 2.0);
721 if (fpclassify (ld) != FP_SUBNORMAL)
723 printf ("fpclassify (-LDBL_MIN-epsilon) failed: %d (%La)\n",
724 fpclassify (ld), ld);
725 result = 1;
727 v2.d = ld = nextafterl (ld, -LDBL_MIN);
728 if (fpclassify (ld) != FP_NORMAL)
730 printf ("fpclassify (-LDBL_MIN-epsilon+epsilon) failed: %d (%La)\n",
731 fpclassify (ld), ld);
732 result = 1;
735 if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
737 printf ("-LDBL_MIN: mantissa0 differs: %8x vs %8x\n",
738 v1.ieee.mantissa0, v2.ieee.mantissa0);
739 result = 1;
741 if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
743 printf ("-LDBL_MIN: mantissa1 differs: %8x vs %8x\n",
744 v1.ieee.mantissa1, v2.ieee.mantissa1);
745 result = 1;
747 if (v1.ieee.exponent != v2.ieee.exponent)
749 printf ("-LDBL_MIN: exponent differs: %4x vs %4x\n",
750 v1.ieee.exponent, v2.ieee.exponent);
751 result = 1;
753 if (v1.ieee.negative != v2.ieee.negative)
755 printf ("-LDBL_MIN: negative differs: %d vs %d\n",
756 v1.ieee.negative, v2.ieee.negative);
757 result = 1;
760 ld = LDBL_MAX;
761 if (fpclassify (ld) != FP_NORMAL)
763 printf ("fpclassify (LDBL_MAX) failed: %d\n", fpclassify (ld));
764 result = 1;
766 ld = nextafterl (ld, INFINITY);
767 if (fpclassify (ld) != FP_INFINITE)
769 printf ("fpclassify (LDBL_MAX+epsilon) failed: %d\n", fpclassify (ld));
770 result = 1;
773 ld = -LDBL_MAX;
774 if (fpclassify (ld) != FP_NORMAL)
776 printf ("fpclassify (-LDBL_MAX) failed: %d\n", fpclassify (ld));
777 result = 1;
779 ld = nextafterl (ld, -INFINITY);
780 if (fpclassify (ld) != FP_INFINITE)
782 printf ("fpclassify (-LDBL_MAX-epsilon) failed: %d\n",
783 fpclassify (ld));
784 result = 1;
787 v1.d = ld = 0.0625;
788 ld = nextafterl (ld, 0.0);
789 v2.d = ld = nextafterl (ld, 1.0);
791 if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
793 printf ("0.0625L down: mantissa0 differs: %8x vs %8x\n",
794 v1.ieee.mantissa0, v2.ieee.mantissa0);
795 result = 1;
797 if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
799 printf ("0.0625L down: mantissa1 differs: %8x vs %8x\n",
800 v1.ieee.mantissa1, v2.ieee.mantissa1);
801 result = 1;
803 if (v1.ieee.exponent != v2.ieee.exponent)
805 printf ("0.0625L down: exponent differs: %4x vs %4x\n",
806 v1.ieee.exponent, v2.ieee.exponent);
807 result = 1;
809 if (v1.ieee.negative != v2.ieee.negative)
811 printf ("0.0625L down: negative differs: %d vs %d\n",
812 v1.ieee.negative, v2.ieee.negative);
813 result = 1;
816 v1.d = ld = 0.0625;
817 ld = nextafterl (ld, 1.0);
818 v2.d = ld = nextafterl (ld, 0.0);
820 if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
822 printf ("0.0625L up: mantissa0 differs: %8x vs %8x\n",
823 v1.ieee.mantissa0, v2.ieee.mantissa0);
824 result = 1;
826 if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
828 printf ("0.0625L up: mantissa1 differs: %8x vs %8x\n",
829 v1.ieee.mantissa1, v2.ieee.mantissa1);
830 result = 1;
832 if (v1.ieee.exponent != v2.ieee.exponent)
834 printf ("0.0625L up: exponent differs: %4x vs %4x\n",
835 v1.ieee.exponent, v2.ieee.exponent);
836 result = 1;
838 if (v1.ieee.negative != v2.ieee.negative)
840 printf ("0.0625L up: negative differs: %d vs %d\n",
841 v1.ieee.negative, v2.ieee.negative);
842 result = 1;
845 v1.d = ld = -0.0625;
846 ld = nextafterl (ld, 0.0);
847 v2.d = ld = nextafterl (ld, -1.0);
849 if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
851 printf ("-0.0625L up: mantissa0 differs: %8x vs %8x\n",
852 v1.ieee.mantissa0, v2.ieee.mantissa0);
853 result = 1;
855 if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
857 printf ("-0.0625L up: mantissa1 differs: %8x vs %8x\n",
858 v1.ieee.mantissa1, v2.ieee.mantissa1);
859 result = 1;
861 if (v1.ieee.exponent != v2.ieee.exponent)
863 printf ("-0.0625L up: exponent differs: %4x vs %4x\n",
864 v1.ieee.exponent, v2.ieee.exponent);
865 result = 1;
867 if (v1.ieee.negative != v2.ieee.negative)
869 printf ("-0.0625L up: negative differs: %d vs %d\n",
870 v1.ieee.negative, v2.ieee.negative);
871 result = 1;
874 v1.d = ld = -0.0625;
875 ld = nextafterl (ld, -1.0);
876 v2.d = ld = nextafterl (ld, 0.0);
878 if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
880 printf ("-0.0625L down: mantissa0 differs: %8x vs %8x\n",
881 v1.ieee.mantissa0, v2.ieee.mantissa0);
882 result = 1;
884 if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
886 printf ("-0.0625L down: mantissa1 differs: %8x vs %8x\n",
887 v1.ieee.mantissa1, v2.ieee.mantissa1);
888 result = 1;
890 if (v1.ieee.exponent != v2.ieee.exponent)
892 printf ("-0.0625L down: exponent differs: %4x vs %4x\n",
893 v1.ieee.exponent, v2.ieee.exponent);
894 result = 1;
896 if (v1.ieee.negative != v2.ieee.negative)
898 printf ("-0.0625L down: negative differs: %d vs %d\n",
899 v1.ieee.negative, v2.ieee.negative);
900 result = 1;
903 v1.d = ld = 0.0;
904 ld = nextafterl (ld, 1.0);
905 v2.d = nextafterl (ld, -1.0);
907 if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
909 printf ("0.0L up: mantissa0 differs: %8x vs %8x\n",
910 v1.ieee.mantissa0, v2.ieee.mantissa0);
911 result = 1;
913 if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
915 printf ("0.0L up: mantissa1 differs: %8x vs %8x\n",
916 v1.ieee.mantissa1, v2.ieee.mantissa1);
917 result = 1;
919 if (v1.ieee.exponent != v2.ieee.exponent)
921 printf ("0.0L up: exponent differs: %4x vs %4x\n",
922 v1.ieee.exponent, v2.ieee.exponent);
923 result = 1;
925 if (0 != v2.ieee.negative)
927 printf ("0.0L up: negative differs: 0 vs %d\n",
928 v2.ieee.negative);
929 result = 1;
932 v1.d = ld = 0.0;
933 ld = nextafterl (ld, -1.0);
934 v2.d = nextafterl (ld, 1.0);
936 if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
938 printf ("0.0L down: mantissa0 differs: %8x vs %8x\n",
939 v1.ieee.mantissa0, v2.ieee.mantissa0);
940 result = 1;
942 if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
944 printf ("0.0L down: mantissa1 differs: %8x vs %8x\n",
945 v1.ieee.mantissa1, v2.ieee.mantissa1);
946 result = 1;
948 if (v1.ieee.exponent != v2.ieee.exponent)
950 printf ("0.0L down: exponent differs: %4x vs %4x\n",
951 v1.ieee.exponent, v2.ieee.exponent);
952 result = 1;
954 if (1 != v2.ieee.negative)
956 printf ("0.0L down: negative differs: 1 vs %d\n",
957 v2.ieee.negative);
958 result = 1;
961 #endif
963 if (! isnormal (FLT_MIN))
965 puts ("isnormal (FLT_MIN) failed");
966 result = 1;
968 if (! isnormal (DBL_MIN))
970 puts ("isnormal (DBL_MIN) failed");
971 result = 1;
973 #ifndef NO_LONG_DOUBLE
974 if (! isnormal (LDBL_MIN))
976 puts ("isnormal (LDBL_MIN) failed");
977 result = 1;
979 #endif
981 #ifdef __i386__
982 /* This is a test for the strange long doubles in x86 FPUs. */
984 union
986 char b[10];
987 long double d;
988 } u =
989 { .b = { 0, 0, 0, 0, 0, 0, 0, 0x80, 0, 0 } };
991 if (fpclassify (u.d) != FP_NORMAL)
993 printf ("fpclassify (0x00008000000000000000) failed: %d (%Lg)\n",
994 fpclassify (u.d), u.d);
995 result = 1;
999 /* Special NaNs in x86 long double. Test for scalbl. */
1001 union
1003 char b[10];
1004 long double d;
1005 } u =
1006 { .b = { 0, 1, 0, 0, 0, 0, 0, 0xc0, 0xff, 0x7f } };
1007 long double r;
1009 r = scalbl (u.d, 0.0);
1010 if (!isnan (r))
1012 puts ("scalbl(NaN, 0) does not return NaN");
1013 result = 1;
1015 else if (memcmp (&r, &u.d, sizeof (double)) != 0)
1017 puts ("scalbl(NaN, 0) does not return the same NaN");
1018 result = 1;
1021 #endif
1023 #ifndef NO_LONG_DOUBLE
1025 long double r;
1027 feclearexcept (FE_ALL_EXCEPT);
1028 r = scalbl (LDBL_MIN, 2147483647);
1029 if (! isinf (r))
1031 puts ("scalbl (LDBL_MIN, 2147483647) does not return Inf");
1032 result = 1;
1034 else if (signbit (r) != 0)
1036 puts ("scalbl (LDBL_MIN, 2147483647) returns -Inf");
1037 result = 1;
1039 else if (fetestexcept (FE_UNDERFLOW))
1041 puts ("scalbl(NaN, 0) raises underflow exception");
1042 result = 1;
1045 feclearexcept (FE_ALL_EXCEPT);
1046 r = scalbl (LDBL_MAX, -2147483647);
1047 if (r != 0.0)
1049 puts ("scalbl (LDBL_MAX, -2147483647) does not return 0");
1050 result = 1;
1052 else if (signbit (r) != 0)
1054 puts ("scalbl (LDBL_MAX, -2147483647) returns -Inf");
1055 result = 1;
1057 else if (fetestexcept (FE_OVERFLOW))
1059 puts ("scalbl(NaN, 0) raises overflow exception");
1060 result = 1;
1063 #endif
1065 return result;