9aa9421844ae7b27f6b6425c7bc1dcc04cd9286a
[libc-test] / src / math / nextafterl.c
1 #include <math.h>
2 #include <stdint.h>
3 #include <fenv.h>
4 #include <stdio.h>
5 #include <float.h>
6 #include <stdlib.h>
7 #include "fenvutil.h"
8 #include "test.h"
9
10 /* ld80 only */
11
12 static struct {
13         long double x;
14         long double y;
15         long double z;
16         int except;
17 } t[] = {
18            0,         0,                            0, 0,
19            0,      -0.0,                         -0.0, 0,
20         -0.0,         0,                            0, 0,
21            0,         1,                  0x1p-16445L, FE_INEXACT|FE_UNDERFLOW,
22            0,        -1,                 -0x1p-16445L, FE_INEXACT|FE_UNDERFLOW,
23         -0.0,         1,                  0x1p-16445L, FE_INEXACT|FE_UNDERFLOW,
24         -0.0,        -1,                 -0x1p-16445L, FE_INEXACT|FE_UNDERFLOW,
25  0x1p-16445L,  INFINITY,                  0x1p-16444L, FE_INEXACT|FE_UNDERFLOW,
26  0x1p-16445L, -INFINITY,                            0, FE_INEXACT|FE_UNDERFLOW,
27 -0x1p-16445L,  INFINITY,                         -0.0, FE_INEXACT|FE_UNDERFLOW,
28 -0x1p-16445L, -INFINITY,                 -0x1p-16444L, FE_INEXACT|FE_UNDERFLOW,
29  0x1p-16440L, -0x1p-16444L,             0x1.fp-16441L, FE_INEXACT|FE_UNDERFLOW,
30  0x1p-16440L,  0x1p-16444L,             0x1.fp-16441L, FE_INEXACT|FE_UNDERFLOW,
31  0x1p-16440L,  0x1p-16430L,            0x1.08p-16440L, FE_INEXACT|FE_UNDERFLOW,
32     LDBL_MIN,         0, 0x1.fffffffffffffffcp-16383L, FE_INEXACT|FE_UNDERFLOW,
33    -LDBL_MIN,         0,-0x1.fffffffffffffffcp-16383L, FE_INEXACT|FE_UNDERFLOW,
34  0x1.fffffffffffffffcp-16383L,  1,           LDBL_MIN, 0,
35 -0x1.fffffffffffffffcp-16383L, -1,          -LDBL_MIN, 0,
36            1,         2,     0x1.0000000000000002p+0L, 0,
37            1,        -2,     0x1.fffffffffffffffep-1L, 0,
38            1,       0.5,     0x1.fffffffffffffffep-1L, 0,
39     0x1p1023,  0x1p1000,  0x1.fffffffffffffffep+1022L, 0,
40     0x1p1023,  INFINITY,  0x1.0000000000000002p+1023L, 0,
41         -1.5,      -2.5,    -0x1.8000000000000002p+0L, 0,
42         -1.5,       2.5,    -0x1.7ffffffffffffffep+0L, 0,
43          1.5,      -2.5,     0x1.7ffffffffffffffep+0L, 0,
44     LDBL_MAX,  INFINITY,                     INFINITY, FE_INEXACT|FE_OVERFLOW,
45     INFINITY,  INFINITY,                     INFINITY, 0,
46    -LDBL_MAX, -INFINITY,                    -INFINITY, FE_INEXACT|FE_OVERFLOW,
47    -INFINITY, -INFINITY,                    -INFINITY, 0,
48          NAN,         1,                          NAN, 0,
49            1,       NAN,                          NAN, 0,
50 };
51
52 void test_nextafterl()
53 {
54         int f, i;
55         long double z;
56
57         for (i = 0; i < sizeof t/sizeof *t; i++) {
58                 feclearexcept(FE_ALL_EXCEPT);
59                 z = nextafterl(t[i].x, t[i].y);
60                 f = fetestexcept(FE_INVALID|FE_DIVBYZERO|FE_OVERFLOW|FE_UNDERFLOW|FE_INEXACT);
61
62                 if (z != t[i].z && !(isnan(z) && isnan(t[i].z)))
63                         error("%d nextafterl(%La, %La) want %La got %La\n", i, t[i].x, t[i].y, t[i].z, z);
64                 if (f != t[i].except)
65                         error("%d nextafterl(%La, %La)==%La want except=%s got except=%s\n",
66                                 i, t[i].x, t[i].y, t[i].z, strdup(strexcept(t[i].except)), strdup(strexcept(f)));
67         }
68 }
69
70 void bench_nextafterl_normal(int N)
71 {
72         int i;
73         volatile long double z;
74
75         for (i = 0; i < N; i++) {
76                 z = nextafterl(1.25, 4);
77         }
78 }
79
80 void bench_nextafterl_subnormal(int N)
81 {
82         int i;
83         volatile long double z;
84
85         for (i = 0; i < N; i++) {
86                 z = nextafterl(0x1p-16440L, -0x1p-16444L);
87         }
88 }