]> git.ipfire.org Git - thirdparty/glibc.git/blame - math/test-misc.c
(CFLAGS-tst-align.c): Add -mpreferred-stack-boundary=4.
[thirdparty/glibc.git] / math / test-misc.c
CommitLineData
9861985f 1/* Miscellaneous tests which don't fit anywhere else.
a334319f 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
41bdb6e2
AJ
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.
9861985f
UD
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
41bdb6e2 13 Lesser General Public License for more details.
9861985f 14
41bdb6e2
AJ
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. */
9861985f 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 46
a334319f 47# if __GNUC__ >= 3 || __GNUC_MINOR__ >= 96
79569444 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
a334319f 55# if LDBL_MANT_DIG == 64
79569444 56 m = 0xf.fffffffffffffffp-4L;
a334319f 57# elif LDBL_MANT_DIG == 106
5ce98c3f
UD
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;
a334319f 61# elif LDBL_MANT_DIG == 113
7b84d129 62 m = 0x1.ffffffffffffffffffffffffffffp-1L;
a334319f
UD
63# else
64# error "Please adjust"
65# endif
79569444 66
0df757b1 67 for (i = LDBL_MAX_EXP, x = LDBL_MAX; i >= LDBL_MIN_EXP; --i, x /= 2.0L)
79569444 68 {
0df757b1 69 printf ("2^%d: ", i);
79569444
UD
70
71 r = frexpl (x, &e);
72 if (r != m)
73 {
74 printf ("mantissa incorrect: %.20La\n", r);
75 result = 1;
76 continue;
77 }
0df757b1 78 if (e != i)
79569444
UD
79 {
80 printf ("exponent wrong %d (%.20Lg)\n", e, x);
81 result = 1;
82 continue;
83 }
84 puts ("ok");
85 }
601d2942
UD
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
79569444 108 }
a334319f 109# endif
6d0c4914 110
a334319f 111#if 0
6d0c4914
UD
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 }
a334319f 129#endif
a5fe041c 130#endif
9861985f
UD
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
cc46d0cf 145 {
ddc3ed9d
UD
146 union ieee754_float v1;
147 union ieee754_float v2;
cc46d0cf
UD
148 float f;
149
ddc3ed9d 150 v1.f = f = FLT_MIN;
cc46d0cf
UD
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 }
ddc3ed9d 162 v2.f = f = nextafterf (f, FLT_MIN);
cc46d0cf
UD
163 if (fpclassify (f) != FP_NORMAL)
164 {
244cd531 165 printf ("fpclassify (FLT_MIN-epsilon+epsilon) failed: %d\n",
cc46d0cf
UD
166 fpclassify (f));
167 result = 1;
168 }
169
ddc3ed9d
UD
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;
cc46d0cf
UD
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 }
ddc3ed9d 201 v2.f = f = nextafterf (f, -FLT_MIN);
cc46d0cf
UD
202 if (fpclassify (f) != FP_NORMAL)
203 {
244cd531 204 printf ("fpclassify (-FLT_MIN-epsilon+epsilon) failed: %d\n",
cc46d0cf
UD
205 fpclassify (f));
206 result = 1;
207 }
244cd531 208
ddc3ed9d
UD
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
244cd531
UD
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 }
e3bb40e6
UD
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 }
636ccfc8
UD
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 }
cc46d0cf 409 }
e3bb40e6 410
cc46d0cf 411 {
ddc3ed9d
UD
412 union ieee754_double v1;
413 union ieee754_double v2;
cc46d0cf
UD
414 double d;
415
ddc3ed9d 416 v1.d = d = DBL_MIN;
cc46d0cf
UD
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 }
ddc3ed9d 428 v2.d = d = nextafter (d, DBL_MIN);
cc46d0cf
UD
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
ddc3ed9d
UD
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;
cc46d0cf
UD
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 }
ddc3ed9d 473 v2.d = d = nextafter (d, -DBL_MIN);
cc46d0cf
UD
474 if (fpclassify (d) != FP_NORMAL)
475 {
476 printf ("fpclassify (-DBL_MIN-epsilon+epsilon) failed: %d\n",
477 fpclassify (d));
478 result = 1;
479 }
244cd531 480
ddc3ed9d
UD
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
244cd531
UD
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 }
e3bb40e6
UD
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 }
636ccfc8
UD
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 }
cc46d0cf 723 }
e3bb40e6 724
0df757b1 725#ifndef NO_LONG_DOUBLE
cc46d0cf 726 {
ddc3ed9d
UD
727 union ieee854_long_double v1;
728 union ieee854_long_double v2;
cc46d0cf
UD
729 long double ld;
730
ddc3ed9d 731 v1.d = ld = LDBL_MIN;
cc46d0cf
UD
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 }
ddc3ed9d 744 v2.d = ld = nextafterl (ld, LDBL_MIN);
cc46d0cf
UD
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
ddc3ed9d
UD
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;
cc46d0cf
UD
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 }
ddc3ed9d 790 v2.d = ld = nextafterl (ld, -LDBL_MIN);
cc46d0cf
UD
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 }
244cd531 797
ddc3ed9d
UD
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
244cd531
UD
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 }
e3bb40e6
UD
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 }
636ccfc8
UD
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 }
cc46d0cf 1041 }
0df757b1
UD
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
fd8f4d46
UD
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 }
6d0c4914
UD
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 }
fd8f4d46
UD
1102#endif
1103
b210e4cc
UD
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
9861985f
UD
1146 return result;
1147}