1//===-- Utility class to test fmod special numbers ------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLVM_LIBC_TEST_SRC_MATH_FMODTEST_H
10#define LLVM_LIBC_TEST_SRC_MATH_FMODTEST_H
11
12#include "src/__support/FPUtil/FEnvImpl.h"
13#include "src/__support/libc_errno.h"
14#include "test/UnitTest/FEnvSafeTest.h"
15#include "test/UnitTest/FPMatcher.h"
16#include "test/UnitTest/Test.h"
17
18#include "hdr/fenv_macros.h"
19
20#define TEST_SPECIAL(x, y, expected, dom_err, expected_exception) \
21 LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT); \
22 EXPECT_FP_EQ(expected, f(x, y)); \
23 EXPECT_MATH_ERRNO((dom_err) ? EDOM : 0); \
24 EXPECT_FP_EXCEPTION(expected_exception); \
25 LIBC_NAMESPACE::fputil::clear_except(FE_ALL_EXCEPT)
26
27#define TEST_REGULAR(x, y, expected) TEST_SPECIAL(x, y, expected, false, 0)
28
29template <typename T>
30class FmodTest : public LIBC_NAMESPACE::testing::FEnvSafeTest {
31
32 DECLARE_SPECIAL_CONSTANTS(T)
33
34public:
35 typedef T (*FModFunc)(T, T);
36
37 void testSpecialNumbers(FModFunc f) {
38 // fmod (+0, y) == +0 for y != 0.
39 TEST_SPECIAL(zero, T(3.0), zero, false, 0);
40 TEST_SPECIAL(zero, min_denormal, zero, false, 0);
41 TEST_SPECIAL(zero, -min_denormal, zero, false, 0);
42 TEST_SPECIAL(zero, min_normal, zero, false, 0);
43 TEST_SPECIAL(zero, -min_normal, zero, false, 0);
44 TEST_SPECIAL(zero, max_normal, zero, false, 0);
45 TEST_SPECIAL(zero, -max_normal, zero, false, 0);
46
47 // fmod (-0, y) == -0 for y != 0.
48 TEST_SPECIAL(neg_zero, T(3.0), neg_zero, false, 0);
49 TEST_SPECIAL(neg_zero, min_denormal, neg_zero, false, 0);
50 TEST_SPECIAL(neg_zero, -min_denormal, neg_zero, false, 0);
51 TEST_SPECIAL(neg_zero, min_normal, neg_zero, false, 0);
52 TEST_SPECIAL(neg_zero, -min_normal, neg_zero, false, 0);
53 TEST_SPECIAL(neg_zero, max_normal, neg_zero, false, 0);
54 TEST_SPECIAL(neg_zero, -max_normal, neg_zero, false, 0);
55
56 // fmod (+inf, y) == aNaN plus invalid exception.
57 TEST_SPECIAL(inf, T(3.0), aNaN, true, FE_INVALID);
58 TEST_SPECIAL(inf, T(-1.1), aNaN, true, FE_INVALID);
59 TEST_SPECIAL(inf, zero, aNaN, true, FE_INVALID);
60 TEST_SPECIAL(inf, neg_zero, aNaN, true, FE_INVALID);
61 TEST_SPECIAL(inf, min_denormal, aNaN, true, FE_INVALID);
62 TEST_SPECIAL(inf, min_normal, aNaN, true, FE_INVALID);
63 TEST_SPECIAL(inf, max_normal, aNaN, true, FE_INVALID);
64 TEST_SPECIAL(inf, inf, aNaN, true, FE_INVALID);
65 TEST_SPECIAL(inf, neg_inf, aNaN, true, FE_INVALID);
66
67 // fmod (-inf, y) == aNaN plus invalid exception.
68 TEST_SPECIAL(neg_inf, T(3.0), aNaN, true, FE_INVALID);
69 TEST_SPECIAL(neg_inf, T(-1.1), aNaN, true, FE_INVALID);
70 TEST_SPECIAL(neg_inf, zero, aNaN, true, FE_INVALID);
71 TEST_SPECIAL(neg_inf, neg_zero, aNaN, true, FE_INVALID);
72 TEST_SPECIAL(neg_inf, min_denormal, aNaN, true, FE_INVALID);
73 TEST_SPECIAL(neg_inf, min_normal, aNaN, true, FE_INVALID);
74 TEST_SPECIAL(neg_inf, max_normal, aNaN, true, FE_INVALID);
75 TEST_SPECIAL(neg_inf, inf, aNaN, true, FE_INVALID);
76 TEST_SPECIAL(neg_inf, neg_inf, aNaN, true, FE_INVALID);
77
78 // fmod (x, +0) == aNaN plus invalid exception.
79 TEST_SPECIAL(T(3.0), zero, aNaN, true, FE_INVALID);
80 TEST_SPECIAL(T(-1.1), zero, aNaN, true, FE_INVALID);
81 TEST_SPECIAL(zero, zero, aNaN, true, FE_INVALID);
82 TEST_SPECIAL(neg_zero, zero, aNaN, true, FE_INVALID);
83 TEST_SPECIAL(min_denormal, zero, aNaN, true, FE_INVALID);
84 TEST_SPECIAL(min_normal, zero, aNaN, true, FE_INVALID);
85 TEST_SPECIAL(max_normal, zero, aNaN, true, FE_INVALID);
86
87 // fmod (x, -0) == aNaN plus invalid exception.
88 TEST_SPECIAL(T(3.0), neg_zero, aNaN, true, FE_INVALID);
89 TEST_SPECIAL(T(-1.1), neg_zero, aNaN, true, FE_INVALID);
90 TEST_SPECIAL(zero, neg_zero, aNaN, true, FE_INVALID);
91 TEST_SPECIAL(neg_zero, neg_zero, aNaN, true, FE_INVALID);
92 TEST_SPECIAL(min_denormal, neg_zero, aNaN, true, FE_INVALID);
93 TEST_SPECIAL(min_normal, neg_zero, aNaN, true, FE_INVALID);
94 TEST_SPECIAL(max_normal, neg_zero, aNaN, true, FE_INVALID);
95
96 // fmod (x, +inf) == x for x not infinite.
97 TEST_SPECIAL(zero, inf, zero, false, 0);
98 TEST_SPECIAL(neg_zero, inf, neg_zero, false, 0);
99 TEST_SPECIAL(min_denormal, inf, min_denormal, false, 0);
100 TEST_SPECIAL(min_normal, inf, min_normal, false, 0);
101 TEST_SPECIAL(max_normal, inf, max_normal, false, 0);
102 TEST_SPECIAL(T(3.0), inf, T(3.0), false, 0);
103 // fmod (x, -inf) == x for x not infinite.
104 TEST_SPECIAL(zero, neg_inf, zero, false, 0);
105 TEST_SPECIAL(neg_zero, neg_inf, neg_zero, false, 0);
106 TEST_SPECIAL(min_denormal, neg_inf, min_denormal, false, 0);
107 TEST_SPECIAL(min_normal, neg_inf, min_normal, false, 0);
108 TEST_SPECIAL(max_normal, neg_inf, max_normal, false, 0);
109 TEST_SPECIAL(T(3.0), neg_inf, T(3.0), false, 0);
110
111 TEST_SPECIAL(zero, aNaN, aNaN, false, 0);
112 TEST_SPECIAL(zero, neg_aNaN, aNaN, false, 0);
113 TEST_SPECIAL(neg_zero, aNaN, aNaN, false, 0);
114 TEST_SPECIAL(neg_zero, neg_aNaN, aNaN, false, 0);
115 TEST_SPECIAL(T(1.0), aNaN, aNaN, false, 0);
116 TEST_SPECIAL(T(1.0), neg_aNaN, aNaN, false, 0);
117 TEST_SPECIAL(inf, aNaN, aNaN, false, 0);
118 TEST_SPECIAL(inf, neg_aNaN, aNaN, false, 0);
119 TEST_SPECIAL(neg_inf, aNaN, aNaN, false, 0);
120 TEST_SPECIAL(neg_inf, neg_aNaN, aNaN, false, 0);
121 TEST_SPECIAL(zero, sNaN, aNaN, false, FE_INVALID);
122 TEST_SPECIAL(zero, neg_sNaN, aNaN, false, FE_INVALID);
123 TEST_SPECIAL(neg_zero, sNaN, aNaN, false, FE_INVALID);
124 TEST_SPECIAL(neg_zero, neg_sNaN, aNaN, false, FE_INVALID);
125 TEST_SPECIAL(T(1.0), sNaN, aNaN, false, FE_INVALID);
126 TEST_SPECIAL(T(1.0), neg_sNaN, aNaN, false, FE_INVALID);
127 TEST_SPECIAL(inf, sNaN, aNaN, false, FE_INVALID);
128 TEST_SPECIAL(inf, neg_sNaN, aNaN, false, FE_INVALID);
129 TEST_SPECIAL(neg_inf, sNaN, aNaN, false, FE_INVALID);
130 TEST_SPECIAL(neg_inf, neg_sNaN, aNaN, false, FE_INVALID);
131 TEST_SPECIAL(aNaN, zero, aNaN, false, 0);
132 TEST_SPECIAL(neg_aNaN, zero, aNaN, false, 0);
133 TEST_SPECIAL(aNaN, neg_zero, aNaN, false, 0);
134 TEST_SPECIAL(neg_aNaN, neg_zero, aNaN, false, 0);
135 TEST_SPECIAL(aNaN, T(1.0), aNaN, false, 0);
136 TEST_SPECIAL(neg_aNaN, T(1.0), aNaN, false, 0);
137 TEST_SPECIAL(aNaN, inf, aNaN, false, 0);
138 TEST_SPECIAL(neg_aNaN, inf, aNaN, false, 0);
139 TEST_SPECIAL(aNaN, neg_inf, aNaN, false, 0);
140 TEST_SPECIAL(neg_aNaN, neg_inf, aNaN, false, 0);
141 TEST_SPECIAL(sNaN, zero, aNaN, false, FE_INVALID);
142 TEST_SPECIAL(neg_sNaN, zero, aNaN, false, FE_INVALID);
143 TEST_SPECIAL(sNaN, neg_zero, aNaN, false, FE_INVALID);
144 TEST_SPECIAL(neg_sNaN, neg_zero, aNaN, false, FE_INVALID);
145 TEST_SPECIAL(sNaN, T(1.0), aNaN, false, FE_INVALID);
146 TEST_SPECIAL(neg_sNaN, T(1.0), aNaN, false, FE_INVALID);
147 TEST_SPECIAL(sNaN, inf, aNaN, false, FE_INVALID);
148 TEST_SPECIAL(neg_sNaN, inf, aNaN, false, FE_INVALID);
149 TEST_SPECIAL(sNaN, neg_inf, aNaN, false, FE_INVALID);
150 TEST_SPECIAL(neg_sNaN, neg_inf, aNaN, false, FE_INVALID);
151 TEST_SPECIAL(aNaN, aNaN, aNaN, false, 0);
152 TEST_SPECIAL(aNaN, neg_aNaN, aNaN, false, 0);
153 TEST_SPECIAL(neg_aNaN, aNaN, aNaN, false, 0);
154 TEST_SPECIAL(neg_aNaN, neg_aNaN, aNaN, false, 0);
155 TEST_SPECIAL(aNaN, sNaN, aNaN, false, FE_INVALID);
156 TEST_SPECIAL(aNaN, neg_sNaN, aNaN, false, FE_INVALID);
157 TEST_SPECIAL(neg_aNaN, sNaN, aNaN, false, FE_INVALID);
158 TEST_SPECIAL(neg_aNaN, neg_sNaN, aNaN, false, FE_INVALID);
159 TEST_SPECIAL(sNaN, aNaN, aNaN, false, FE_INVALID);
160 TEST_SPECIAL(sNaN, neg_aNaN, aNaN, false, FE_INVALID);
161 TEST_SPECIAL(neg_sNaN, aNaN, aNaN, false, FE_INVALID);
162 TEST_SPECIAL(neg_sNaN, neg_aNaN, aNaN, false, FE_INVALID);
163 TEST_SPECIAL(sNaN, sNaN, aNaN, false, FE_INVALID);
164 TEST_SPECIAL(sNaN, neg_sNaN, aNaN, false, FE_INVALID);
165 TEST_SPECIAL(neg_sNaN, sNaN, aNaN, false, FE_INVALID);
166 TEST_SPECIAL(neg_sNaN, neg_sNaN, aNaN, false, FE_INVALID);
167
168 TEST_SPECIAL(T(6.5), T(2.25), T(2.0), false, 0);
169 TEST_SPECIAL(T(-6.5), T(2.25), T(-2.0), false, 0);
170 TEST_SPECIAL(T(6.5), T(-2.25), T(2.0), false, 0);
171 TEST_SPECIAL(T(-6.5), T(-2.25), T(-2.0), false, 0);
172
173 TEST_SPECIAL(max_normal, max_normal, zero, false, 0);
174 TEST_SPECIAL(max_normal, -max_normal, zero, false, 0);
175 TEST_SPECIAL(max_normal, min_normal, zero, false, 0);
176 TEST_SPECIAL(max_normal, -min_normal, zero, false, 0);
177 TEST_SPECIAL(max_normal, min_denormal, zero, false, 0);
178 TEST_SPECIAL(max_normal, -min_denormal, zero, false, 0);
179 TEST_SPECIAL(-max_normal, max_normal, neg_zero, false, 0);
180 TEST_SPECIAL(-max_normal, -max_normal, neg_zero, false, 0);
181 TEST_SPECIAL(-max_normal, min_normal, neg_zero, false, 0);
182 TEST_SPECIAL(-max_normal, -min_normal, neg_zero, false, 0);
183 TEST_SPECIAL(-max_normal, min_denormal, neg_zero, false, 0);
184 TEST_SPECIAL(-max_normal, -min_denormal, neg_zero, false, 0);
185
186 TEST_SPECIAL(min_normal, max_normal, min_normal, false, 0);
187 TEST_SPECIAL(min_normal, -max_normal, min_normal, false, 0);
188 TEST_SPECIAL(min_normal, min_normal, zero, false, 0);
189 TEST_SPECIAL(min_normal, -min_normal, zero, false, 0);
190 TEST_SPECIAL(min_normal, min_denormal, zero, false, 0);
191 TEST_SPECIAL(min_normal, -min_denormal, zero, false, 0);
192 TEST_SPECIAL(-min_normal, max_normal, -min_normal, false, 0);
193 TEST_SPECIAL(-min_normal, -max_normal, -min_normal, false, 0);
194 TEST_SPECIAL(-min_normal, min_normal, neg_zero, false, 0);
195 TEST_SPECIAL(-min_normal, -min_normal, neg_zero, false, 0);
196 TEST_SPECIAL(-min_normal, min_denormal, neg_zero, false, 0);
197 TEST_SPECIAL(-min_normal, -min_denormal, neg_zero, false, 0);
198
199 TEST_SPECIAL(min_denormal, max_normal, min_denormal, false, 0);
200 TEST_SPECIAL(min_denormal, -max_normal, min_denormal, false, 0);
201 TEST_SPECIAL(min_denormal, min_normal, min_denormal, false, 0);
202 TEST_SPECIAL(min_denormal, -min_normal, min_denormal, false, 0);
203 TEST_SPECIAL(min_denormal, min_denormal, zero, false, 0);
204 TEST_SPECIAL(min_denormal, -min_denormal, zero, false, 0);
205 TEST_SPECIAL(-min_denormal, max_normal, -min_denormal, false, 0);
206 TEST_SPECIAL(-min_denormal, -max_normal, -min_denormal, false, 0);
207 TEST_SPECIAL(-min_denormal, min_normal, -min_denormal, false, 0);
208 TEST_SPECIAL(-min_denormal, -min_normal, -min_denormal, false, 0);
209 TEST_SPECIAL(-min_denormal, min_denormal, neg_zero, false, 0);
210 TEST_SPECIAL(-min_denormal, -min_denormal, neg_zero, false, 0);
211 }
212
213 void testRegularExtreme(FModFunc f) {
214 if constexpr (sizeof(T) < sizeof(float))
215 return;
216 TEST_REGULAR(T(0x1p127), T(0x3p-149), T(0x1p-149));
217 TEST_REGULAR(T(0x1p127), T(-0x3p-149), T(0x1p-149));
218 TEST_REGULAR(T(0x1p127), T(0x3p-148), T(0x1p-147));
219 TEST_REGULAR(T(0x1p127), T(-0x3p-148), T(0x1p-147));
220 TEST_REGULAR(T(0x1p127), T(0x3p-126), T(0x1p-125));
221 TEST_REGULAR(T(0x1p127), T(-0x3p-126), T(0x1p-125));
222 TEST_REGULAR(T(-0x1p127), T(0x3p-149), T(-0x1p-149));
223 TEST_REGULAR(T(-0x1p127), T(-0x3p-149), T(-0x1p-149));
224 TEST_REGULAR(T(-0x1p127), T(0x3p-148), T(-0x1p-147));
225 TEST_REGULAR(T(-0x1p127), T(-0x3p-148), T(-0x1p-147));
226 TEST_REGULAR(T(-0x1p127), T(0x3p-126), T(-0x1p-125));
227 TEST_REGULAR(T(-0x1p127), T(-0x3p-126), T(-0x1p-125));
228
229 if constexpr (sizeof(T) < sizeof(double))
230 return;
231 TEST_REGULAR(T(0x1p1023), T(0x3p-1074), T(0x1p-1073));
232 TEST_REGULAR(T(0x1p1023), T(-0x3p-1074), T(0x1p-1073));
233 TEST_REGULAR(T(0x1p1023), T(0x3p-1073), T(0x1p-1073));
234 TEST_REGULAR(T(0x1p1023), T(-0x3p-1073), T(0x1p-1073));
235 TEST_REGULAR(T(0x1p1023), T(0x3p-1022), T(0x1p-1021));
236 TEST_REGULAR(T(0x1p1023), T(-0x3p-1022), T(0x1p-1021));
237 TEST_REGULAR(T(-0x1p1023), T(0x3p-1074), T(-0x1p-1073));
238 TEST_REGULAR(T(-0x1p1023), T(-0x3p-1074), T(-0x1p-1073));
239 TEST_REGULAR(T(-0x1p1023), T(0x3p-1073), T(-0x1p-1073));
240 TEST_REGULAR(T(-0x1p1023), T(-0x3p-1073), T(-0x1p-1073));
241 TEST_REGULAR(T(-0x1p1023), T(0x3p-1022), T(-0x1p-1021));
242 TEST_REGULAR(T(-0x1p1023), T(-0x3p-1022), T(-0x1p-1021));
243 }
244};
245
246#define LIST_FMOD_TESTS(T, func) \
247 using LlvmLibcFmodTest = FmodTest<T>; \
248 TEST_F(LlvmLibcFmodTest, SpecialNumbers) { testSpecialNumbers(&func); } \
249 TEST_F(LlvmLibcFmodTest, RegularExtreme) { testRegularExtreme(&func); }
250
251#endif // LLVM_LIBC_TEST_SRC_MATH_FMODTEST_H
252

Provided by KDAB

Privacy Policy
Improve your Profiling and Debugging skills
Find out more

source code of libc/test/src/math/smoke/FModTest.h