Update.
[glibc.git] / math / test-misc.c
blobba34f92e9ed49da249a81a27fd507a04187d640a
1 /* Miscellaneous tests which don't fit anywhere else.
2 Copyright (C) 2000, 2001 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 <float.h>
22 #include <ieee754.h>
23 #include <math.h>
24 #include <stdio.h>
25 #include <string.h>
28 int
29 main (void)
31 int result = 0;
33 #ifndef NO_LONG_DOUBLE
35 long double x = 0x100000001ll + (long double) 0.5;
36 long double q;
37 long double r;
39 r = modfl (x, &q);
40 if (q != (long double) 0x100000001ll || r != 0.5)
42 printf ("modfl (%Lg, ...) failed\n", x);
43 result = 1;
47 # if __GNUC__ >= 3 || __GNUC_MINOR__ >= 96
49 long double x;
50 long double m;
51 long double r;
52 int e;
53 int i;
55 # if LDBL_MANT_DIG == 64
56 m = 0xf.fffffffffffffffp-4L;
57 # elif LDBL_MANT_DIG == 113
58 m = 0x1.ffffffffffffffffffffffffffffp-1L;
59 # else
60 # error "Please adjust"
61 # endif
63 for (i = LDBL_MAX_EXP, x = LDBL_MAX; i >= LDBL_MIN_EXP; --i, x /= 2.0L)
65 printf ("2^%d: ", i);
67 r = frexpl (x, &e);
68 if (r != m)
70 printf ("mantissa incorrect: %.20La\n", r);
71 result = 1;
72 continue;
74 if (e != i)
76 printf ("exponent wrong %d (%.20Lg)\n", e, x);
77 result = 1;
78 continue;
80 puts ("ok");
83 # endif
85 #if 0
87 int e;
88 long double r = frexpl (LDBL_MIN * LDBL_EPSILON, &e);
90 if (r != 0.5)
92 printf ("frexpl (LDBL_MIN * LDBL_EPSILON, ...): mantissa wrong: %Lg\n",
93 r);
94 result = 1;
96 else if (e != -16444)
98 printf ("frexpl (LDBL_MIN * LDBL_EPSILON, ...): exponent wrong: %d\n",
99 e);
100 result = 1;
103 #endif
104 #endif
107 double x = 0x100000001ll + (double) 0.5;
108 double q;
109 double r;
111 r = modf (x, &q);
112 if (q != (double) 0x100000001ll || r != 0.5)
114 printf ("modf (%g, ...) failed\n", x);
115 result = 1;
120 union ieee754_float v1;
121 union ieee754_float v2;
122 float f;
124 v1.f = f = FLT_MIN;
125 if (fpclassify (f) != FP_NORMAL)
127 printf ("fpclassify (FLT_MIN) failed: %d\n", fpclassify (f));
128 result = 1;
130 f = nextafterf (f, FLT_MIN / 2.0f);
131 if (fpclassify (f) != FP_SUBNORMAL)
133 printf ("fpclassify (FLT_MIN-epsilon) failed: %d\n", fpclassify (f));
134 result = 1;
136 v2.f = f = nextafterf (f, FLT_MIN);
137 if (fpclassify (f) != FP_NORMAL)
139 printf ("fpclassify (FLT_MIN-epsilon+epsilon) failed: %d\n",
140 fpclassify (f));
141 result = 1;
144 if (v1.ieee.mantissa != v2.ieee.mantissa)
146 printf ("FLT_MIN: mantissa differs: %8x vs %8x\n",
147 v1.ieee.mantissa, v2.ieee.mantissa);
148 result = 1;
150 if (v1.ieee.exponent != v2.ieee.exponent)
152 printf ("FLT_MIN: exponent differs: %4x vs %4x\n",
153 v1.ieee.exponent, v2.ieee.exponent);
154 result = 1;
156 if (v1.ieee.negative != v2.ieee.negative)
158 printf ("FLT_MIN: negative differs: %d vs %d\n",
159 v1.ieee.negative, v2.ieee.negative);
160 result = 1;
163 v1.f = f = -FLT_MIN;
164 if (fpclassify (f) != FP_NORMAL)
166 printf ("fpclassify (-FLT_MIN) failed: %d\n", fpclassify (f));
167 result = 1;
169 f = nextafterf (f, -FLT_MIN / 2.0f);
170 if (fpclassify (f) != FP_SUBNORMAL)
172 printf ("fpclassify (-FLT_MIN-epsilon) failed: %d\n", fpclassify (f));
173 result = 1;
175 v2.f = f = nextafterf (f, -FLT_MIN);
176 if (fpclassify (f) != FP_NORMAL)
178 printf ("fpclassify (-FLT_MIN-epsilon+epsilon) failed: %d\n",
179 fpclassify (f));
180 result = 1;
183 if (v1.ieee.mantissa != v2.ieee.mantissa)
185 printf ("-FLT_MIN: mantissa differs: %8x vs %8x\n",
186 v1.ieee.mantissa, v2.ieee.mantissa);
187 result = 1;
189 if (v1.ieee.exponent != v2.ieee.exponent)
191 printf ("-FLT_MIN: exponent differs: %4x vs %4x\n",
192 v1.ieee.exponent, v2.ieee.exponent);
193 result = 1;
195 if (v1.ieee.negative != v2.ieee.negative)
197 printf ("-FLT_MIN: negative differs: %d vs %d\n",
198 v1.ieee.negative, v2.ieee.negative);
199 result = 1;
202 f = FLT_MAX;
203 if (fpclassify (f) != FP_NORMAL)
205 printf ("fpclassify (FLT_MAX) failed: %d\n", fpclassify (f));
206 result = 1;
208 f = nextafterf (f, INFINITY);
209 if (fpclassify (f) != FP_INFINITE)
211 printf ("fpclassify (FLT_MAX+epsilon) failed: %d\n", fpclassify (f));
212 result = 1;
215 f = -FLT_MAX;
216 if (fpclassify (f) != FP_NORMAL)
218 printf ("fpclassify (-FLT_MAX) failed: %d\n", fpclassify (f));
219 result = 1;
221 f = nextafterf (f, -INFINITY);
222 if (fpclassify (f) != FP_INFINITE)
224 printf ("fpclassify (-FLT_MAX-epsilon) failed: %d\n", fpclassify (f));
225 result = 1;
228 v1.f = f = 0.0625;
229 f = nextafterf (f, 0.0);
230 v2.f = f = nextafterf (f, 1.0);
232 if (v1.ieee.mantissa != v2.ieee.mantissa)
234 printf ("0.0625f down: mantissa differs: %8x vs %8x\n",
235 v1.ieee.mantissa, v2.ieee.mantissa);
236 result = 1;
238 if (v1.ieee.exponent != v2.ieee.exponent)
240 printf ("0.0625f down: exponent differs: %4x vs %4x\n",
241 v1.ieee.exponent, v2.ieee.exponent);
242 result = 1;
244 if (v1.ieee.negative != v2.ieee.negative)
246 printf ("0.0625f down: negative differs: %d vs %d\n",
247 v1.ieee.negative, v2.ieee.negative);
248 result = 1;
251 v1.f = f = 0.0625;
252 f = nextafterf (f, 1.0);
253 v2.f = f = nextafterf (f, 0.0);
255 if (v1.ieee.mantissa != v2.ieee.mantissa)
257 printf ("0.0625f up: mantissa differs: %8x vs %8x\n",
258 v1.ieee.mantissa, v2.ieee.mantissa);
259 result = 1;
261 if (v1.ieee.exponent != v2.ieee.exponent)
263 printf ("0.0625f up: exponent differs: %4x vs %4x\n",
264 v1.ieee.exponent, v2.ieee.exponent);
265 result = 1;
267 if (v1.ieee.negative != v2.ieee.negative)
269 printf ("0.0625f up: negative differs: %d vs %d\n",
270 v1.ieee.negative, v2.ieee.negative);
271 result = 1;
274 v1.f = f = -0.0625;
275 f = nextafterf (f, 0.0);
276 v2.f = f = nextafterf (f, -1.0);
278 if (v1.ieee.mantissa != v2.ieee.mantissa)
280 printf ("-0.0625f up: mantissa differs: %8x vs %8x\n",
281 v1.ieee.mantissa, v2.ieee.mantissa);
282 result = 1;
284 if (v1.ieee.exponent != v2.ieee.exponent)
286 printf ("-0.0625f up: exponent differs: %4x vs %4x\n",
287 v1.ieee.exponent, v2.ieee.exponent);
288 result = 1;
290 if (v1.ieee.negative != v2.ieee.negative)
292 printf ("-0.0625f up: negative differs: %d vs %d\n",
293 v1.ieee.negative, v2.ieee.negative);
294 result = 1;
297 v1.f = f = -0.0625;
298 f = nextafterf (f, -1.0);
299 v2.f = f = nextafterf (f, 0.0);
301 if (v1.ieee.mantissa != v2.ieee.mantissa)
303 printf ("-0.0625f down: mantissa differs: %8x vs %8x\n",
304 v1.ieee.mantissa, v2.ieee.mantissa);
305 result = 1;
307 if (v1.ieee.exponent != v2.ieee.exponent)
309 printf ("-0.0625f down: exponent differs: %4x vs %4x\n",
310 v1.ieee.exponent, v2.ieee.exponent);
311 result = 1;
313 if (v1.ieee.negative != v2.ieee.negative)
315 printf ("-0.0625f down: negative differs: %d vs %d\n",
316 v1.ieee.negative, v2.ieee.negative);
317 result = 1;
320 v1.f = f = 0.0f;
321 f = nextafterf (f, 1.0);
322 v2.f = nextafterf (f, -1.0);
324 if (v1.ieee.mantissa != v2.ieee.mantissa)
326 printf ("0.0f up: mantissa differs: %8x vs %8x\n",
327 v1.ieee.mantissa, v2.ieee.mantissa);
328 result = 1;
330 if (v1.ieee.exponent != v2.ieee.exponent)
332 printf ("0.0f up: exponent differs: %4x vs %4x\n",
333 v1.ieee.exponent, v2.ieee.exponent);
334 result = 1;
336 if (0 != v2.ieee.negative)
338 printf ("0.0f up: negative differs: 0 vs %d\n",
339 v2.ieee.negative);
340 result = 1;
343 v1.f = f = 0.0f;
344 f = nextafterf (f, -1.0);
345 v2.f = nextafterf (f, 1.0);
347 if (v1.ieee.mantissa != v2.ieee.mantissa)
349 printf ("0.0f down: mantissa differs: %8x vs %8x\n",
350 v1.ieee.mantissa, v2.ieee.mantissa);
351 result = 1;
353 if (v1.ieee.exponent != v2.ieee.exponent)
355 printf ("0.0f down: exponent differs: %4x vs %4x\n",
356 v1.ieee.exponent, v2.ieee.exponent);
357 result = 1;
359 if (1 != v2.ieee.negative)
361 printf ("0.0f down: negative differs: 1 vs %d\n",
362 v2.ieee.negative);
363 result = 1;
368 union ieee754_double v1;
369 union ieee754_double v2;
370 double d;
372 v1.d = d = DBL_MIN;
373 if (fpclassify (d) != FP_NORMAL)
375 printf ("fpclassify (DBL_MIN) failed: %d\n", fpclassify (d));
376 result = 1;
378 d = nextafter (d, DBL_MIN / 2.0);
379 if (fpclassify (d) != FP_SUBNORMAL)
381 printf ("fpclassify (DBL_MIN-epsilon) failed: %d\n", fpclassify (d));
382 result = 1;
384 v2.d = d = nextafter (d, DBL_MIN);
385 if (fpclassify (d) != FP_NORMAL)
387 printf ("fpclassify (DBL_MIN-epsilon+epsilon) failed: %d\n",
388 fpclassify (d));
389 result = 1;
392 if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
394 printf ("DBL_MIN: mantissa0 differs: %8x vs %8x\n",
395 v1.ieee.mantissa0, v2.ieee.mantissa0);
396 result = 1;
398 if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
400 printf ("DBL_MIN: mantissa1 differs: %8x vs %8x\n",
401 v1.ieee.mantissa1, v2.ieee.mantissa1);
402 result = 1;
404 if (v1.ieee.exponent != v2.ieee.exponent)
406 printf ("DBL_MIN: exponent differs: %4x vs %4x\n",
407 v1.ieee.exponent, v2.ieee.exponent);
408 result = 1;
410 if (v1.ieee.negative != v2.ieee.negative)
412 printf ("DBL_MIN: negative differs: %d vs %d\n",
413 v1.ieee.negative, v2.ieee.negative);
414 result = 1;
417 v1.d = d = -DBL_MIN;
418 if (fpclassify (d) != FP_NORMAL)
420 printf ("fpclassify (-DBL_MIN) failed: %d\n", fpclassify (d));
421 result = 1;
423 d = nextafter (d, -DBL_MIN / 2.0);
424 if (fpclassify (d) != FP_SUBNORMAL)
426 printf ("fpclassify (-DBL_MIN-epsilon) failed: %d\n", fpclassify (d));
427 result = 1;
429 v2.d = d = nextafter (d, -DBL_MIN);
430 if (fpclassify (d) != FP_NORMAL)
432 printf ("fpclassify (-DBL_MIN-epsilon+epsilon) failed: %d\n",
433 fpclassify (d));
434 result = 1;
437 if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
439 printf ("-DBL_MIN: mantissa0 differs: %8x vs %8x\n",
440 v1.ieee.mantissa0, v2.ieee.mantissa0);
441 result = 1;
443 if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
445 printf ("-DBL_MIN: mantissa1 differs: %8x vs %8x\n",
446 v1.ieee.mantissa1, v2.ieee.mantissa1);
447 result = 1;
449 if (v1.ieee.exponent != v2.ieee.exponent)
451 printf ("-DBL_MIN: exponent differs: %4x vs %4x\n",
452 v1.ieee.exponent, v2.ieee.exponent);
453 result = 1;
455 if (v1.ieee.negative != v2.ieee.negative)
457 printf ("-DBL_MIN: negative differs: %d vs %d\n",
458 v1.ieee.negative, v2.ieee.negative);
459 result = 1;
462 d = DBL_MAX;
463 if (fpclassify (d) != FP_NORMAL)
465 printf ("fpclassify (DBL_MAX) failed: %d\n", fpclassify (d));
466 result = 1;
468 d = nextafter (d, INFINITY);
469 if (fpclassify (d) != FP_INFINITE)
471 printf ("fpclassify (DBL_MAX+epsilon) failed: %d\n", fpclassify (d));
472 result = 1;
475 d = -DBL_MAX;
476 if (fpclassify (d) != FP_NORMAL)
478 printf ("fpclassify (-DBL_MAX) failed: %d\n", fpclassify (d));
479 result = 1;
481 d = nextafter (d, -INFINITY);
482 if (fpclassify (d) != FP_INFINITE)
484 printf ("fpclassify (-DBL_MAX-epsilon) failed: %d\n", fpclassify (d));
485 result = 1;
488 v1.d = d = 0.0625;
489 d = nextafter (d, 0.0);
490 v2.d = d = nextafter (d, 1.0);
492 if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
494 printf ("0.0625 down: mantissa0 differs: %8x vs %8x\n",
495 v1.ieee.mantissa0, v2.ieee.mantissa0);
496 result = 1;
498 if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
500 printf ("0.0625 down: mantissa1 differs: %8x vs %8x\n",
501 v1.ieee.mantissa1, v2.ieee.mantissa1);
502 result = 1;
504 if (v1.ieee.exponent != v2.ieee.exponent)
506 printf ("0.0625 down: exponent differs: %4x vs %4x\n",
507 v1.ieee.exponent, v2.ieee.exponent);
508 result = 1;
510 if (v1.ieee.negative != v2.ieee.negative)
512 printf ("0.0625 down: negative differs: %d vs %d\n",
513 v1.ieee.negative, v2.ieee.negative);
514 result = 1;
517 v1.d = d = 0.0625;
518 d = nextafter (d, 1.0);
519 v2.d = d = nextafter (d, 0.0);
521 if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
523 printf ("0.0625 up: mantissa0 differs: %8x vs %8x\n",
524 v1.ieee.mantissa0, v2.ieee.mantissa0);
525 result = 1;
527 if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
529 printf ("0.0625 up: mantissa1 differs: %8x vs %8x\n",
530 v1.ieee.mantissa1, v2.ieee.mantissa1);
531 result = 1;
533 if (v1.ieee.exponent != v2.ieee.exponent)
535 printf ("0.0625 up: exponent differs: %4x vs %4x\n",
536 v1.ieee.exponent, v2.ieee.exponent);
537 result = 1;
539 if (v1.ieee.negative != v2.ieee.negative)
541 printf ("0.0625 up: negative differs: %d vs %d\n",
542 v1.ieee.negative, v2.ieee.negative);
543 result = 1;
546 v1.d = d = -0.0625;
547 d = nextafter (d, 0.0);
548 v2.d = d = nextafter (d, -1.0);
550 if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
552 printf ("-0.0625 up: mantissa0 differs: %8x vs %8x\n",
553 v1.ieee.mantissa0, v2.ieee.mantissa0);
554 result = 1;
556 if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
558 printf ("-0.0625 up: mantissa1 differs: %8x vs %8x\n",
559 v1.ieee.mantissa1, v2.ieee.mantissa1);
560 result = 1;
562 if (v1.ieee.exponent != v2.ieee.exponent)
564 printf ("-0.0625 up: exponent differs: %4x vs %4x\n",
565 v1.ieee.exponent, v2.ieee.exponent);
566 result = 1;
568 if (v1.ieee.negative != v2.ieee.negative)
570 printf ("-0.0625 up: negative differs: %d vs %d\n",
571 v1.ieee.negative, v2.ieee.negative);
572 result = 1;
575 v1.d = d = -0.0625;
576 d = nextafter (d, -1.0);
577 v2.d = d = nextafter (d, 0.0);
579 if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
581 printf ("-0.0625 down: mantissa0 differs: %8x vs %8x\n",
582 v1.ieee.mantissa0, v2.ieee.mantissa0);
583 result = 1;
585 if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
587 printf ("-0.0625 down: mantissa1 differs: %8x vs %8x\n",
588 v1.ieee.mantissa1, v2.ieee.mantissa1);
589 result = 1;
591 if (v1.ieee.exponent != v2.ieee.exponent)
593 printf ("-0.0625 down: exponent differs: %4x vs %4x\n",
594 v1.ieee.exponent, v2.ieee.exponent);
595 result = 1;
597 if (v1.ieee.negative != v2.ieee.negative)
599 printf ("-0.0625 down: negative differs: %d vs %d\n",
600 v1.ieee.negative, v2.ieee.negative);
601 result = 1;
604 v1.d = d = 0.0;
605 d = nextafter (d, 1.0);
606 v2.d = nextafter (d, -1.0);
608 if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
610 printf ("0.0 up: mantissa0 differs: %8x vs %8x\n",
611 v1.ieee.mantissa0, v2.ieee.mantissa0);
612 result = 1;
614 if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
616 printf ("0.0 up: mantissa1 differs: %8x vs %8x\n",
617 v1.ieee.mantissa1, v2.ieee.mantissa1);
618 result = 1;
620 if (v1.ieee.exponent != v2.ieee.exponent)
622 printf ("0.0 up: exponent differs: %4x vs %4x\n",
623 v1.ieee.exponent, v2.ieee.exponent);
624 result = 1;
626 if (0 != v2.ieee.negative)
628 printf ("0.0 up: negative differs: 0 vs %d\n",
629 v2.ieee.negative);
630 result = 1;
633 v1.d = d = 0.0;
634 d = nextafter (d, -1.0);
635 v2.d = nextafter (d, 1.0);
637 if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
639 printf ("0.0 down: mantissa0 differs: %8x vs %8x\n",
640 v1.ieee.mantissa0, v2.ieee.mantissa0);
641 result = 1;
643 if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
645 printf ("0.0 down: mantissa1 differs: %8x vs %8x\n",
646 v1.ieee.mantissa1, v2.ieee.mantissa1);
647 result = 1;
649 if (v1.ieee.exponent != v2.ieee.exponent)
651 printf ("0.0 down: exponent differs: %4x vs %4x\n",
652 v1.ieee.exponent, v2.ieee.exponent);
653 result = 1;
655 if (1 != v2.ieee.negative)
657 printf ("0.0 down: negative differs: 1 vs %d\n",
658 v2.ieee.negative);
659 result = 1;
663 #ifndef NO_LONG_DOUBLE
665 union ieee854_long_double v1;
666 union ieee854_long_double v2;
667 long double ld;
669 v1.d = ld = LDBL_MIN;
670 if (fpclassify (ld) != FP_NORMAL)
672 printf ("fpclassify (LDBL_MIN) failed: %d\n", fpclassify (ld));
673 result = 1;
675 ld = nextafterl (ld, LDBL_MIN / 2.0);
676 if (fpclassify (ld) != FP_SUBNORMAL)
678 printf ("fpclassify (LDBL_MIN-epsilon) failed: %d (%La)\n",
679 fpclassify (ld), ld);
680 result = 1;
682 v2.d = ld = nextafterl (ld, LDBL_MIN);
683 if (fpclassify (ld) != FP_NORMAL)
685 printf ("fpclassify (LDBL_MIN-epsilon+epsilon) failed: %d (%La)\n",
686 fpclassify (ld), ld);
687 result = 1;
690 if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
692 printf ("LDBL_MIN: mantissa0 differs: %8x vs %8x\n",
693 v1.ieee.mantissa0, v2.ieee.mantissa0);
694 result = 1;
696 if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
698 printf ("LDBL_MIN: mantissa1 differs: %8x vs %8x\n",
699 v1.ieee.mantissa1, v2.ieee.mantissa1);
700 result = 1;
702 if (v1.ieee.exponent != v2.ieee.exponent)
704 printf ("LDBL_MIN: exponent differs: %4x vs %4x\n",
705 v1.ieee.exponent, v2.ieee.exponent);
706 result = 1;
708 if (v1.ieee.negative != v2.ieee.negative)
710 printf ("LDBL_MIN: negative differs: %d vs %d\n",
711 v1.ieee.negative, v2.ieee.negative);
712 result = 1;
715 v1.d = ld = -LDBL_MIN;
716 if (fpclassify (ld) != FP_NORMAL)
718 printf ("fpclassify (-LDBL_MIN) failed: %d\n", fpclassify (ld));
719 result = 1;
721 ld = nextafterl (ld, -LDBL_MIN / 2.0);
722 if (fpclassify (ld) != FP_SUBNORMAL)
724 printf ("fpclassify (-LDBL_MIN-epsilon) failed: %d (%La)\n",
725 fpclassify (ld), ld);
726 result = 1;
728 v2.d = ld = nextafterl (ld, -LDBL_MIN);
729 if (fpclassify (ld) != FP_NORMAL)
731 printf ("fpclassify (-LDBL_MIN-epsilon+epsilon) failed: %d (%La)\n",
732 fpclassify (ld), ld);
733 result = 1;
736 if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
738 printf ("-LDBL_MIN: mantissa0 differs: %8x vs %8x\n",
739 v1.ieee.mantissa0, v2.ieee.mantissa0);
740 result = 1;
742 if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
744 printf ("-LDBL_MIN: mantissa1 differs: %8x vs %8x\n",
745 v1.ieee.mantissa1, v2.ieee.mantissa1);
746 result = 1;
748 if (v1.ieee.exponent != v2.ieee.exponent)
750 printf ("-LDBL_MIN: exponent differs: %4x vs %4x\n",
751 v1.ieee.exponent, v2.ieee.exponent);
752 result = 1;
754 if (v1.ieee.negative != v2.ieee.negative)
756 printf ("-LDBL_MIN: negative differs: %d vs %d\n",
757 v1.ieee.negative, v2.ieee.negative);
758 result = 1;
761 ld = LDBL_MAX;
762 if (fpclassify (ld) != FP_NORMAL)
764 printf ("fpclassify (LDBL_MAX) failed: %d\n", fpclassify (ld));
765 result = 1;
767 ld = nextafterl (ld, INFINITY);
768 if (fpclassify (ld) != FP_INFINITE)
770 printf ("fpclassify (LDBL_MAX+epsilon) failed: %d\n", fpclassify (ld));
771 result = 1;
774 ld = -LDBL_MAX;
775 if (fpclassify (ld) != FP_NORMAL)
777 printf ("fpclassify (-LDBL_MAX) failed: %d\n", fpclassify (ld));
778 result = 1;
780 ld = nextafterl (ld, -INFINITY);
781 if (fpclassify (ld) != FP_INFINITE)
783 printf ("fpclassify (-LDBL_MAX-epsilon) failed: %d\n",
784 fpclassify (ld));
785 result = 1;
788 v1.d = ld = 0.0625;
789 ld = nextafterl (ld, 0.0);
790 v2.d = ld = nextafterl (ld, 1.0);
792 if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
794 printf ("0.0625L down: mantissa0 differs: %8x vs %8x\n",
795 v1.ieee.mantissa0, v2.ieee.mantissa0);
796 result = 1;
798 if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
800 printf ("0.0625L down: mantissa1 differs: %8x vs %8x\n",
801 v1.ieee.mantissa1, v2.ieee.mantissa1);
802 result = 1;
804 if (v1.ieee.exponent != v2.ieee.exponent)
806 printf ("0.0625L down: exponent differs: %4x vs %4x\n",
807 v1.ieee.exponent, v2.ieee.exponent);
808 result = 1;
810 if (v1.ieee.negative != v2.ieee.negative)
812 printf ("0.0625L down: negative differs: %d vs %d\n",
813 v1.ieee.negative, v2.ieee.negative);
814 result = 1;
817 v1.d = ld = 0.0625;
818 ld = nextafterl (ld, 1.0);
819 v2.d = ld = nextafterl (ld, 0.0);
821 if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
823 printf ("0.0625L up: mantissa0 differs: %8x vs %8x\n",
824 v1.ieee.mantissa0, v2.ieee.mantissa0);
825 result = 1;
827 if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
829 printf ("0.0625L up: mantissa1 differs: %8x vs %8x\n",
830 v1.ieee.mantissa1, v2.ieee.mantissa1);
831 result = 1;
833 if (v1.ieee.exponent != v2.ieee.exponent)
835 printf ("0.0625L up: exponent differs: %4x vs %4x\n",
836 v1.ieee.exponent, v2.ieee.exponent);
837 result = 1;
839 if (v1.ieee.negative != v2.ieee.negative)
841 printf ("0.0625L up: negative differs: %d vs %d\n",
842 v1.ieee.negative, v2.ieee.negative);
843 result = 1;
846 v1.d = ld = -0.0625;
847 ld = nextafterl (ld, 0.0);
848 v2.d = ld = nextafterl (ld, -1.0);
850 if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
852 printf ("-0.0625L up: mantissa0 differs: %8x vs %8x\n",
853 v1.ieee.mantissa0, v2.ieee.mantissa0);
854 result = 1;
856 if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
858 printf ("-0.0625L up: mantissa1 differs: %8x vs %8x\n",
859 v1.ieee.mantissa1, v2.ieee.mantissa1);
860 result = 1;
862 if (v1.ieee.exponent != v2.ieee.exponent)
864 printf ("-0.0625L up: exponent differs: %4x vs %4x\n",
865 v1.ieee.exponent, v2.ieee.exponent);
866 result = 1;
868 if (v1.ieee.negative != v2.ieee.negative)
870 printf ("-0.0625L up: negative differs: %d vs %d\n",
871 v1.ieee.negative, v2.ieee.negative);
872 result = 1;
875 v1.d = ld = -0.0625;
876 ld = nextafterl (ld, -1.0);
877 v2.d = ld = nextafterl (ld, 0.0);
879 if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
881 printf ("-0.0625L down: mantissa0 differs: %8x vs %8x\n",
882 v1.ieee.mantissa0, v2.ieee.mantissa0);
883 result = 1;
885 if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
887 printf ("-0.0625L down: mantissa1 differs: %8x vs %8x\n",
888 v1.ieee.mantissa1, v2.ieee.mantissa1);
889 result = 1;
891 if (v1.ieee.exponent != v2.ieee.exponent)
893 printf ("-0.0625L down: exponent differs: %4x vs %4x\n",
894 v1.ieee.exponent, v2.ieee.exponent);
895 result = 1;
897 if (v1.ieee.negative != v2.ieee.negative)
899 printf ("-0.0625L down: negative differs: %d vs %d\n",
900 v1.ieee.negative, v2.ieee.negative);
901 result = 1;
904 v1.d = ld = 0.0;
905 ld = nextafterl (ld, 1.0);
906 v2.d = nextafterl (ld, -1.0);
908 if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
910 printf ("0.0L up: mantissa0 differs: %8x vs %8x\n",
911 v1.ieee.mantissa0, v2.ieee.mantissa0);
912 result = 1;
914 if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
916 printf ("0.0L up: mantissa1 differs: %8x vs %8x\n",
917 v1.ieee.mantissa1, v2.ieee.mantissa1);
918 result = 1;
920 if (v1.ieee.exponent != v2.ieee.exponent)
922 printf ("0.0L up: exponent differs: %4x vs %4x\n",
923 v1.ieee.exponent, v2.ieee.exponent);
924 result = 1;
926 if (0 != v2.ieee.negative)
928 printf ("0.0L up: negative differs: 0 vs %d\n",
929 v2.ieee.negative);
930 result = 1;
933 v1.d = ld = 0.0;
934 ld = nextafterl (ld, -1.0);
935 v2.d = nextafterl (ld, 1.0);
937 if (v1.ieee.mantissa0 != v2.ieee.mantissa0)
939 printf ("0.0L down: mantissa0 differs: %8x vs %8x\n",
940 v1.ieee.mantissa0, v2.ieee.mantissa0);
941 result = 1;
943 if (v1.ieee.mantissa1 != v2.ieee.mantissa1)
945 printf ("0.0L down: mantissa1 differs: %8x vs %8x\n",
946 v1.ieee.mantissa1, v2.ieee.mantissa1);
947 result = 1;
949 if (v1.ieee.exponent != v2.ieee.exponent)
951 printf ("0.0L down: exponent differs: %4x vs %4x\n",
952 v1.ieee.exponent, v2.ieee.exponent);
953 result = 1;
955 if (1 != v2.ieee.negative)
957 printf ("0.0L down: negative differs: 1 vs %d\n",
958 v2.ieee.negative);
959 result = 1;
962 #endif
964 if (! isnormal (FLT_MIN))
966 puts ("isnormal (FLT_MIN) failed");
967 result = 1;
969 if (! isnormal (DBL_MIN))
971 puts ("isnormal (DBL_MIN) failed");
972 result = 1;
974 #ifndef NO_LONG_DOUBLE
975 if (! isnormal (LDBL_MIN))
977 puts ("isnormal (LDBL_MIN) failed");
978 result = 1;
980 #endif
982 #ifdef __i386__
983 /* This is a test for the strange long doubles in x86 FPUs. */
985 union
987 char b[10];
988 long double d;
989 } u =
990 { .b = { 0, 0, 0, 0, 0, 0, 0, 0x80, 0, 0 } };
992 if (fpclassify (u.d) != FP_NORMAL)
994 printf ("fpclassify (0x00008000000000000000) failed: %d (%Lg)\n",
995 fpclassify (u.d), u.d);
996 result = 1;
1000 /* Special NaNs in x86 long double. Test for scalbl. */
1002 union
1004 char b[10];
1005 long double d;
1006 } u =
1007 { .b = { 0, 1, 0, 0, 0, 0, 0, 0xc0, 0xff, 0x7f } };
1008 long double r;
1010 r = scalbl (u.d, 0.0);
1011 if (!isnan (r))
1013 puts ("scalbl(NaN, 0) does not return NaN");
1014 result = 1;
1016 else if (memcmp (&r, &u.d, sizeof (double)) != 0)
1018 puts ("scalbl(NaN, 0) does not return the same NaN");
1019 result = 1;
1022 #endif
1024 #ifndef NO_LONG_DOUBLE
1026 long double r;
1028 feclearexcept (FE_ALL_EXCEPT);
1029 r = scalbl (LDBL_MIN, 2147483647);
1030 if (! isinf (r))
1032 puts ("scalbl (LDBL_MIN, 2147483647) does not return Inf");
1033 result = 1;
1035 else if (signbit (r) != 0)
1037 puts ("scalbl (LDBL_MIN, 2147483647) returns -Inf");
1038 result = 1;
1040 else if (fetestexcept (FE_UNDERFLOW))
1042 puts ("scalbl(NaN, 0) raises underflow exception");
1043 result = 1;
1046 feclearexcept (FE_ALL_EXCEPT);
1047 r = scalbl (LDBL_MAX, -2147483647);
1048 if (r != 0.0)
1050 puts ("scalbl (LDBL_MAX, -2147483647) does not return 0");
1051 result = 1;
1053 else if (signbit (r) != 0)
1055 puts ("scalbl (LDBL_MAX, -2147483647) returns -Inf");
1056 result = 1;
1058 else if (fetestexcept (FE_OVERFLOW))
1060 puts ("scalbl(NaN, 0) raises overflow exception");
1061 result = 1;
1064 #endif
1066 return result;