76e0db4a6f72f8e6f759775c5b275e1c6af6267f
[libc-test] / src / math / nextafter.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 static struct {
11         double x;
12         double y;
13         double z;
14         int except;
15 } t[] = {
16          0,         0,                        0, 0,
17          0,      -0.0,                     -0.0, 0,
18       -0.0,         0,                        0, 0,
19          0,         1,                0x1p-1074, FE_INEXACT|FE_UNDERFLOW,
20          0,        -1,               -0x1p-1074, FE_INEXACT|FE_UNDERFLOW,
21       -0.0,         1,                0x1p-1074, FE_INEXACT|FE_UNDERFLOW,
22       -0.0,        -1,               -0x1p-1074, FE_INEXACT|FE_UNDERFLOW,
23  0x1p-1074,  INFINITY,                0x1p-1073, FE_INEXACT|FE_UNDERFLOW,
24  0x1p-1074, -INFINITY,                        0, FE_INEXACT|FE_UNDERFLOW,
25 -0x1p-1074,  INFINITY,                     -0.0, FE_INEXACT|FE_UNDERFLOW,
26 -0x1p-1074, -INFINITY,               -0x1p-1073, FE_INEXACT|FE_UNDERFLOW,
27    DBL_MIN,         0,  0x0.fffffffffffffp-1022, FE_INEXACT|FE_UNDERFLOW,
28   -DBL_MIN,         0, -0x0.fffffffffffffp-1022, FE_INEXACT|FE_UNDERFLOW,
29          1,         2,     0x1.0000000000001p+0, 0,
30          1,        -2,     0x1.fffffffffffffp-1, 0,
31          1,       0.5,     0x1.fffffffffffffp-1, 0,
32   0x1p1023,  0x1p1000,  0x1.fffffffffffffp+1022, 0,
33   0x1p1023,  INFINITY,  0x1.0000000000001p+1023, 0,
34       -1.5,      -2.5,    -0x1.8000000000001p+0, 0,
35       -1.5,       2.5,    -0x1.7ffffffffffffp+0, 0,
36        1.5,      -2.5,     0x1.7ffffffffffffp+0, 0,
37    DBL_MAX,  INFINITY,                 INFINITY, FE_INEXACT|FE_OVERFLOW,
38   INFINITY,  INFINITY,                 INFINITY, 0,
39   -DBL_MAX, -INFINITY,                -INFINITY, FE_INEXACT|FE_OVERFLOW,
40  -INFINITY, -INFINITY,                -INFINITY, 0,
41        NAN,         1,                      NAN, 0,
42          1,       NAN,                      NAN, 0,
43 };
44
45 void test_nextafter()
46 {
47         int f, i;
48         double z;
49
50         for (i = 0; i < sizeof t/sizeof *t; i++) {
51                 feclearexcept(FE_ALL_EXCEPT);
52                 z = nextafter(t[i].x, t[i].y);
53                 f = fetestexcept(FE_INVALID|FE_DIVBYZERO|FE_OVERFLOW|FE_UNDERFLOW|FE_INEXACT);
54
55                 if (z != t[i].z && !(isnan(z) && isnan(t[i].z)))
56                         error("nextafter(%a, %a) want %a got %a\n", t[i].x, t[i].y, t[i].z, z);
57                 if (f != t[i].except)
58                         error("nextafter(%a, %a)==%a want except=%s got except=%s\n",
59                                 t[i].x, t[i].y, t[i].z, strdup(strexcept(t[i].except)), strdup(strexcept(f)));
60         }
61 }
62
63 void bench_nextafter_normal(int N)
64 {
65         int i;
66         volatile double z;
67
68         for (i = 0; i < N; i++) {
69                 z = nextafter(1.25, 4);
70         }
71 }
72
73 void bench_nextafter_subnormal(int N)
74 {
75         int i;
76         volatile double z;
77
78         for (i = 0; i < N; i++) {
79                 z = nextafter(0x1p-1070, -0x1p-1071);
80         }
81 }
82
83 void bench_nextafter_zero(int N)
84 {
85         int i;
86         volatile double z;
87
88         for (i = 0; i < N; i++) {
89                 z = nextafter(0, -0x1p-1071);
90         }
91 }