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