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