8#include "gtest/gtest.h"
15constexpr int pow(
int base,
int exp)
noexcept {
18 for(
int i = 0; i < exp; ++i) {
26constexpr double min() {
27 static_assert(W >=
P);
28 static_assert(
P >= 0);
33constexpr double max () {
34 static_assert(W >=
P);
35 static_assert(
P >= 0);
36 return static_cast<double>(
pow(2, W-1)-1)/
static_cast<double>(
pow(2,
P));
39TEST (ap_fixedTester, minmax) {
43 EXPECT_EQ(-16, min_v);
44 EXPECT_EQ(15.96875, max_v);
47TEST(ap_fixedTester, stablity) {
50 constexpr int width{10};
51 constexpr int prec{5};
52 double delta =
pow(2, -prec-1);
60 while (cval <= max_val) {
63 double d0 =
static_cast<double>(ap_gs0);
65 double d1 =
static_cast<double>(ap_gs1);
67 double d2 =
static_cast<double>(ap_gs2);
70 EXPECT_EQ (ap_gs0.m_value, ap_gs2.m_value);
71 EXPECT_LT (std::abs(d0 -cval), 1./(2*2*2*2*2));
74 cval = -val + ((++i) * delta);
78TEST(ap_fixedTester, specialValue) {
82 EXPECT_EQ (-0.3125,
static_cast<double>(apf));
84 ss << std::hex << apf.m_value;
85 EXPECT_EQ (
"fff6",
ss.str());
90TEST(ap_fixedTester, overflow_h) {
91 constexpr int width{10};
92 constexpr int prec{5};
99 EXPECT_THROW ((ap(outOfRange)), std::out_of_range);
102TEST(ap_fixedTester, overflow_l) {
103 constexpr int width{10};
104 constexpr int prec{5};
110 EXPECT_THROW ((ap(outOfRange)), std::out_of_range);
114TEST(ap_fixedTester, addition) {
116 constexpr int width{10};
117 constexpr int prec{5};
118 const double eps {std::pow(2.0, -prec)};
121 ap ap_sum = ap(1) + ap(2);
122 auto val =
static_cast<double>(ap_sum);
123 auto diff = std::abs(val - 3);
126 EXPECT_LT (
diff, eps);
128 ap_sum = ap(1.5) + ap(2.5);
129 val =
static_cast<double>(ap_sum);
130 diff = std::abs(val - 4);
133 EXPECT_LT (
diff, eps);
136TEST(ap_fixedTester, addition1) {
138 constexpr int width{10};
139 constexpr int prec{5};
140 const double eps {std::pow(2.0, -prec)};
143 ap ap_sum = ap(2) += 1;
144 auto val =
static_cast<double>(ap_sum);
145 auto diff = std::abs(val - 3);
148 EXPECT_LT (
diff, eps);
150 ap_sum = ap(1.5) += 2.5;
151 val =
static_cast<double>(ap_sum);
152 diff = std::abs(val - 4);
155 EXPECT_LT (
diff, eps);
159TEST(ap_fixedTester, subtraction) {
161 constexpr int width{10};
162 constexpr int prec{5};
163 const double eps {std::pow(2.0, -prec)};
166 ap ap_diff = ap(1) - ap(2);
167 auto val =
static_cast<double>(ap_diff);
168 auto diff = std::abs(val + 1);
171 EXPECT_LT (
diff, eps);
173 ap_diff = ap(1.5) - ap(2.5);
174 val =
static_cast<double>(ap_diff);
175 diff = std::abs(val + 1);
178 EXPECT_LT (
diff, eps);
181TEST(ap_fixedTester, subtraction1) {
183 constexpr int width{10};
184 constexpr int prec{5};
185 const double eps {std::pow(2.0, -prec)};
188 ap ap_diff = ap(1) -= 2;
189 auto val =
static_cast<double>(ap_diff);
190 auto diff = std::abs(val + 1);
193 EXPECT_LT (
diff, eps);
195 ap_diff = ap(1.5) -= 2.5;
196 val =
static_cast<double>(ap_diff);
197 diff = std::abs(val + 1);
200 EXPECT_LT (
diff, eps);
205TEST(ap_fixedTester, multiplication) {
207 constexpr int width{10};
208 constexpr int prec{5};
209 const double eps {std::pow(2.0, -prec)};
212 ap ap_prod = ap(1) * ap(2);
213 auto val =
static_cast<double>(ap_prod);
214 auto diff = std::abs(val - 2);
217 EXPECT_LT (
diff, eps);
219 ap_prod = ap(-1.5)*ap(2);
220 val =
static_cast<double>(ap_prod);
221 diff = std::abs(val +3);
224 EXPECT_LT (
diff, eps);
227TEST(ap_fixedTester, multiplication1) {
228 constexpr int width{10};
229 constexpr int prec{5};
230 const double eps {std::pow(2.0, -prec)};
233 ap ap_prod = ap(1) *= ap(2);
234 auto val =
static_cast<double>(ap_prod);
235 auto diff = std::abs(val - 2);
238 EXPECT_LT (
diff, eps);
240 ap_prod = ap(-1.5) *= ap(2.);
241 val =
static_cast<double>(ap_prod);
242 diff = std::abs(val +3);
245 EXPECT_LT (
diff, eps);
249TEST(ap_fixedTester, division) {
251 constexpr int width{10};
252 constexpr int prec{5};
253 const double eps {std::pow(2.0, -prec)};
256 ap ap_div = ap(1)/ap(2);
257 auto val =
static_cast<double>(ap_div);
258 auto diff = std::abs(val - 0.5);
260 EXPECT_EQ (0.5, val);
261 EXPECT_LT (
diff, eps);
263 ap_div = ap(-1.5)/ap(2);
264 val =
static_cast<double>(ap_div);
265 diff = std::abs(val + 0.75);
267 EXPECT_EQ (-0.75, val);
268 EXPECT_LT (
diff, eps);
272TEST(ap_fixedTester, division1) {
274 constexpr int width{10};
275 constexpr int prec{5};
276 const double eps {std::pow(2.0, -prec)};
279 ap ap_div = ap(1)/=ap(2);
280 auto val =
static_cast<double>(ap_div);
281 auto diff = std::abs(val - 0.5);
283 EXPECT_EQ (0.5, val);
284 EXPECT_LT (
diff, eps);
286 ap_div = ap(-1.5)/ap(2);
287 val =
static_cast<double>(ap_div);
288 diff = std::abs(val + 0.75);
290 EXPECT_EQ (-0.75, val);
291 EXPECT_LT (
diff, eps);
295TEST(ap_fixedTester, negation) {
297 constexpr int width{10};
298 constexpr int prec{5};
306 auto val_p =
static_cast<double>(ap_p);
307 auto val_n =
static_cast<double>(ap_n);
308 auto val_pp =
static_cast<double>(ap_pp);
310 EXPECT_EQ (val_p, -val_n);
311 EXPECT_EQ (val_p, val_pp);
314TEST(ap_fixedTester, doubleMult) {
316 constexpr int width{10};
317 constexpr int prec{5};
320 ap ap_mul = 9.99 * ap(1);
322 EXPECT_EQ (10,
static_cast<double>(ap_mul));
void diff(const Jet &rJet1, const Jet &rJet2, std::map< std::string, double > varDiff)
Difference between jets - Non-Class function required by trigger.
constexpr int pow(int base, int exp) noexcept
TEST(ap_fixedTester, minmax)
Define macros for attributes used to control the static checker.
#define ATLAS_NO_CHECK_FILE_THREAD_SAFETY