fnmatch: fix "[/b" test
[libc-test] / src / math / lrint.c
1 #include <math.h>
2 #include <stdint.h>
3 #include <fenv.h>
4 #include <stdio.h>
5 #include <float.h>
6 #include <string.h>
7 #include "fenvutil.h"
8 #include "test.h"
9
10 static struct {
11         int round;
12         double x;
13         long n;
14         int except;
15 } t[] = {
16 FE_TONEAREST,             0x0p+0,           0, 0,
17 FE_DOWNWARD,              0x0p+0,           0, 0,
18 FE_UPWARD,                0x0p+0,           0, 0,
19 FE_TOWARDZERO,            0x0p+0,           0, 0,
20 FE_TONEAREST,             0x1p-2,           0, FE_INEXACT,
21 FE_DOWNWARD,              0x1p-2,           0, FE_INEXACT,
22 FE_UPWARD,                0x1p-2,           1, FE_INEXACT,
23 FE_TOWARDZERO,            0x1p-2,           0, FE_INEXACT,
24 FE_TONEAREST,            -0x1p-2,           0, FE_INEXACT,
25 FE_DOWNWARD,             -0x1p-2,          -1, FE_INEXACT,
26 FE_UPWARD,               -0x1p-2,           0, FE_INEXACT,
27 FE_TOWARDZERO,           -0x1p-2,           0, FE_INEXACT,
28 FE_TONEAREST,             0x1p-1,           0, FE_INEXACT,
29 FE_DOWNWARD,              0x1p-1,           0, FE_INEXACT,
30 FE_UPWARD,                0x1p-1,           1, FE_INEXACT,
31 FE_TOWARDZERO,            0x1p-1,           0, FE_INEXACT,
32 FE_TONEAREST,            -0x1p-1,           0, FE_INEXACT,
33 FE_DOWNWARD,             -0x1p-1,          -1, FE_INEXACT,
34 FE_UPWARD,               -0x1p-1,           0, FE_INEXACT,
35 FE_TOWARDZERO,           -0x1p-1,           0, FE_INEXACT,
36 FE_TONEAREST,           0x1.8p-1,           1, FE_INEXACT,
37 FE_DOWNWARD,            0x1.8p-1,           0, FE_INEXACT,
38 FE_UPWARD,              0x1.8p-1,           1, FE_INEXACT,
39 FE_TOWARDZERO,          0x1.8p-1,           0, FE_INEXACT,
40 FE_TONEAREST,          -0x1.8p-1,          -1, FE_INEXACT,
41 FE_DOWNWARD,           -0x1.8p-1,          -1, FE_INEXACT,
42 FE_UPWARD,             -0x1.8p-1,           0, FE_INEXACT,
43 FE_TOWARDZERO,         -0x1.8p-1,           0, FE_INEXACT,
44 FE_TONEAREST,             0x1p+0,           1, 0,
45 FE_DOWNWARD,              0x1p+0,           1, 0,
46 FE_UPWARD,                0x1p+0,           1, 0,
47 FE_TOWARDZERO,            0x1p+0,           1, 0,
48 FE_TONEAREST,            -0x1p+0,          -1, 0,
49 FE_DOWNWARD,             -0x1p+0,          -1, 0,
50 FE_UPWARD,               -0x1p+0,          -1, 0,
51 FE_TOWARDZERO,           -0x1p+0,          -1, 0,
52 FE_TONEAREST,           0x1.4p+0,           1, FE_INEXACT,
53 FE_DOWNWARD,            0x1.4p+0,           1, FE_INEXACT,
54 FE_UPWARD,              0x1.4p+0,           2, FE_INEXACT,
55 FE_TOWARDZERO,          0x1.4p+0,           1, FE_INEXACT,
56 FE_TONEAREST,          -0x1.4p+0,          -1, FE_INEXACT,
57 FE_DOWNWARD,           -0x1.4p+0,          -2, FE_INEXACT,
58 FE_UPWARD,             -0x1.4p+0,          -1, FE_INEXACT,
59 FE_TOWARDZERO,         -0x1.4p+0,          -1, FE_INEXACT,
60 FE_TONEAREST,            0x1p+30,  1073741824, 0,
61 FE_DOWNWARD,             0x1p+30,  1073741824, 0,
62 FE_UPWARD,               0x1p+30,  1073741824, 0,
63 FE_TOWARDZERO,           0x1p+30,  1073741824, 0,
64 FE_TONEAREST,           -0x1p+30, -1073741824, 0,
65 FE_DOWNWARD,            -0x1p+30, -1073741824, 0,
66 FE_UPWARD,              -0x1p+30, -1073741824, 0,
67 FE_TOWARDZERO,          -0x1p+30, -1073741824, 0,
68 FE_TONEAREST,   0x1.fffffffcp+30,  2147483647, 0,
69 FE_DOWNWARD,    0x1.fffffffcp+30,  2147483647, 0,
70 FE_UPWARD,      0x1.fffffffcp+30,  2147483647, 0,
71 FE_TOWARDZERO,  0x1.fffffffcp+30,  2147483647, 0,
72 FE_TONEAREST,  -0x1.fffffffcp+30, -2147483647, 0,
73 FE_DOWNWARD,   -0x1.fffffffcp+30, -2147483647, 0,
74 FE_UPWARD,     -0x1.fffffffcp+30, -2147483647, 0,
75 FE_TOWARDZERO, -0x1.fffffffcp+30, -2147483647, 0,
76 FE_TONEAREST,            0x1p+31,           0, FE_INVALID,
77 FE_DOWNWARD,             0x1p+31,           0, FE_INVALID,
78 FE_UPWARD,               0x1p+31,           0, FE_INVALID,
79 FE_TOWARDZERO,           0x1p+31,           0, FE_INVALID,
80 FE_TONEAREST,           -0x1p+31, -2147483648, 0,
81 FE_DOWNWARD,            -0x1p+31, -2147483648, 0,
82 FE_UPWARD,              -0x1p+31, -2147483648, 0,
83 FE_TOWARDZERO,          -0x1p+31, -2147483648, 0,
84 FE_TONEAREST,   0x1.00000002p+31,           0, FE_INVALID,
85 FE_DOWNWARD,    0x1.00000002p+31,           0, FE_INVALID,
86 FE_UPWARD,      0x1.00000002p+31,           0, FE_INVALID,
87 FE_TOWARDZERO,  0x1.00000002p+31,           0, FE_INVALID,
88 FE_TONEAREST,  -0x1.00000002p+31,           0, FE_INVALID,
89 FE_DOWNWARD,   -0x1.00000002p+31,           0, FE_INVALID,
90 FE_UPWARD,     -0x1.00000002p+31,           0, FE_INVALID,
91 FE_TOWARDZERO, -0x1.00000002p+31,           0, FE_INVALID,
92 FE_TONEAREST,   0x1.fffffffep+30,           0, FE_INVALID,
93 FE_DOWNWARD,    0x1.fffffffep+30,  2147483647, FE_INEXACT,
94 FE_UPWARD,      0x1.fffffffep+30,           0, FE_INVALID,
95 FE_TOWARDZERO,  0x1.fffffffep+30,  2147483647, FE_INEXACT,
96 FE_TONEAREST,  -0x1.fffffffep+30, -2147483648, FE_INEXACT,
97 FE_DOWNWARD,   -0x1.fffffffep+30, -2147483648, FE_INEXACT,
98 FE_UPWARD,     -0x1.fffffffep+30, -2147483647, FE_INEXACT,
99 FE_TOWARDZERO, -0x1.fffffffep+30, -2147483647, FE_INEXACT,
100 FE_TONEAREST,   0x1.00000001p+31,           0, FE_INVALID,
101 FE_DOWNWARD,    0x1.00000001p+31,           0, FE_INVALID,
102 FE_UPWARD,      0x1.00000001p+31,           0, FE_INVALID,
103 FE_TOWARDZERO,  0x1.00000001p+31,           0, FE_INVALID,
104 FE_TONEAREST,  -0x1.00000001p+31, -2147483648, FE_INEXACT,
105 FE_DOWNWARD,   -0x1.00000001p+31,           0, FE_INVALID,
106 FE_UPWARD,     -0x1.00000001p+31, -2147483648, FE_INEXACT,
107 FE_TOWARDZERO, -0x1.00000001p+31, -2147483648, FE_INEXACT,
108 FE_TONEAREST,            0x1p+32,           0, FE_INVALID,
109 FE_DOWNWARD,             0x1p+32,           0, FE_INVALID,
110 FE_UPWARD,               0x1p+32,           0, FE_INVALID,
111 FE_TOWARDZERO,           0x1p+32,           0, FE_INVALID,
112 FE_TONEAREST,           -0x1p+32,           0, FE_INVALID,
113 FE_DOWNWARD,            -0x1p+32,           0, FE_INVALID,
114 FE_UPWARD,              -0x1p+32,           0, FE_INVALID,
115 FE_TOWARDZERO,          -0x1p+32,           0, FE_INVALID,
116 FE_TONEAREST,   0x1.ffffffffp+31,           0, FE_INVALID,
117 FE_DOWNWARD,    0x1.ffffffffp+31,           0, FE_INVALID,
118 FE_UPWARD,      0x1.ffffffffp+31,           0, FE_INVALID,
119 FE_TOWARDZERO,  0x1.ffffffffp+31,           0, FE_INVALID,
120 FE_TONEAREST,  -0x1.ffffffffp+31,           0, FE_INVALID,
121 FE_DOWNWARD,   -0x1.ffffffffp+31,           0, FE_INVALID,
122 FE_UPWARD,     -0x1.ffffffffp+31,           0, FE_INVALID,
123 FE_TOWARDZERO, -0x1.ffffffffp+31,           0, FE_INVALID,
124 };
125
126 void test_lrint()
127 {
128         int f, i;
129         long n;
130
131         for (i = 0; i < sizeof t/sizeof *t; i++) {
132                 fesetround(t[i].round);
133                 feclearexcept(FE_ALL_EXCEPT);
134                 n = lrint(t[i].x);
135                 f = fetestexcept(FE_ALL_EXCEPT);
136
137                 if (t[i].except != FE_INVALID && n != t[i].n)
138                         error("round=%s, lrint(%a) want %ld got %ld\n", strround(t[i].round), t[i].x, t[i].n, n);
139                 if (f != t[i].except)
140                         error("round=%s, lrint(%a)==%ld want except=%s, got except=%s\n",
141                                 strround(t[i].round), t[i].x, t[i].n, strdup(strexcept(t[i].except)), strdup(strexcept(f)));
142         }
143 }
144
145 void bench_lrint_simple(int N)
146 {
147         int i;
148         volatile int n;
149
150         for (i = 0; i < N; i++) {
151                 n = lrint(1.25);
152         }
153 }
154
155 void bench_lrint_hard(int N)
156 {
157         int i;
158         volatile int n;
159
160         for (i = 0; i < N; i++) {
161 //              feclearexcept(FE_ALL_EXCEPT);
162 //              n = lrint(1.5);
163 //              n = lrint(0x1p32);
164 //              n = lrint(-0x1p31);
165                 n = lrint(0x1p31+0.5);
166         }
167 }