31#ifndef ETL_SCALED_ROUNDING_INCLUDED
32#define ETL_SCALED_ROUNDING_INCLUDED
34#include "static_assert.h"
66 template <u
int32_t SCALING,
typename T>
70 typedef typename scaled_rounding_t<T>::type scale_t;
74 return T((value + scale_t(SCALING)) / scale_t(SCALING));
78 return T(value / scale_t(SCALING));
87 template <u
int32_t SCALING,
typename T>
90 typedef typename scaled_rounding_t<T>::type scale_t;
92 return round_ceiling_unscaled<SCALING>(value) * scale_t(SCALING);
100 template <u
int32_t SCALING,
typename T>
104 typedef typename scaled_rounding_t<T>::type scale_t;
108 return T(value / scale_t(SCALING));
112 return T((value - scale_t(SCALING)) / scale_t(SCALING));
121 template <u
int32_t SCALING,
typename T>
124 typedef typename scaled_rounding_t<T>::type scale_t;
126 return T(round_floor_unscaled<SCALING>(value) * scale_t(SCALING));
135 template <u
int32_t SCALING,
typename T>
139 ETL_STATIC_ASSERT((((SCALING / 2U) * 2U) == SCALING),
"Scaling must be divisible by 2");
140 typedef typename scaled_rounding_t<T>::type scale_t;
144 return T((value + scale_t(SCALING / 2U)) / scale_t(SCALING));
148 return T((value - scale_t(SCALING / 2U)) / scale_t(SCALING));
158 template <u
int32_t SCALING,
typename T>
161 typedef typename scaled_rounding_t<T>::type scale_t;
163 return T(round_half_up_unscaled<SCALING>(value) * scale_t(SCALING));
172 template <u
int32_t SCALING,
typename T>
176 ETL_STATIC_ASSERT((((SCALING / 2U) * 2U) == SCALING),
"Scaling must be divisible by 2");
177 typedef typename scaled_rounding_t<T>::type scale_t;
181 return T((value + scale_t((SCALING / 2U) - 1U)) / scale_t(SCALING));
185 return T((value - scale_t((SCALING / 2U) - 1U)) / scale_t(SCALING));
195 template <u
int32_t SCALING,
typename T>
198 typedef typename scaled_rounding_t<T>::type scale_t;
200 return T(round_half_down_unscaled<SCALING>(value) * scale_t(SCALING));
208 template <u
int32_t SCALING,
typename T>
212 typedef typename scaled_rounding_t<T>::type scale_t;
214 return T(value / scale_t(SCALING));
222 template <u
int32_t SCALING,
typename T>
225 typedef typename scaled_rounding_t<T>::type scale_t;
227 return T(round_zero_unscaled<SCALING>(value) * scale_t(SCALING));
235 template <u
int32_t SCALING,
typename T>
239 typedef typename scaled_rounding_t<T>::type scale_t;
243 return T((value + scale_t(SCALING)) / scale_t(SCALING));
247 return T((value - scale_t(SCALING)) / scale_t(SCALING));
256 template <u
int32_t SCALING,
typename T>
259 typedef typename scaled_rounding_t<T>::type scale_t;
261 return T(round_infinity_unscaled<SCALING>(value) * scale_t(SCALING));
270 template <u
int32_t SCALING,
typename T>
274 typedef typename scaled_rounding_t<T>::type scale_t;
277 if ((etl::absolute(value) % scale_t(SCALING)) == scale_t(SCALING / 2U))
280 if ((value / scale_t(SCALING)) & 1U)
282 return T(round_half_up_unscaled<SCALING>(value));
286 return T(round_half_down_unscaled<SCALING>(value));
291 return T(round_half_up_unscaled<SCALING>(value));
301 template <u
int32_t SCALING,
typename T>
304 typedef typename scaled_rounding_t<T>::type scale_t;
306 return T(round_half_even_unscaled<SCALING>(value) * scale_t(SCALING));
315 template <u
int32_t SCALING,
typename T>
319 typedef typename scaled_rounding_t<T>::type scale_t;
322 if ((etl::absolute(value) % scale_t(SCALING)) == scale_t(SCALING / 2U))
325 if ((value / scale_t(SCALING)) & 1U)
327 return T(round_half_down_unscaled<SCALING>(value));
331 return T(round_half_up_unscaled<SCALING>(value));
336 return T(round_half_up_unscaled<SCALING>(value));
346 template <u
int32_t SCALING,
typename T>
349 typedef typename scaled_rounding_t<T>::type scale_t;
351 return T(round_half_odd_unscaled<SCALING>(value) * scale_t(SCALING));
conditional
Definition: type_traits_generator.h:1160
is_integral
Definition: type_traits_generator.h:1001
bitset_ext
Definition: absolute.h:38
T round_half_even_unscaled(T value)
Definition: scaled_rounding.h:271
T round_ceiling_scaled(T value)
Definition: scaled_rounding.h:88
T round_infinity_unscaled(T value)
Definition: scaled_rounding.h:236
T round_half_down_scaled(T value)
Definition: scaled_rounding.h:196
T round_half_even_scaled(T value)
Definition: scaled_rounding.h:302
T round_half_odd_scaled(T value)
Definition: scaled_rounding.h:347
T round_half_up_scaled(T value)
Definition: scaled_rounding.h:159
T round_infinity_scaled(T value)
Definition: scaled_rounding.h:257
T round_floor_scaled(T value)
Definition: scaled_rounding.h:122
T round_zero_unscaled(T value)
Definition: scaled_rounding.h:209
T round_ceiling_unscaled(T value)
Definition: scaled_rounding.h:67
T round_half_up_unscaled(T value)
Definition: scaled_rounding.h:136
T round_floor_unscaled(T value)
Definition: scaled_rounding.h:101
T round_half_odd_unscaled(T value)
Definition: scaled_rounding.h:316
T round_zero_scaled(T value)
Definition: scaled_rounding.h:223
T round_half_down_unscaled(T value)
Definition: scaled_rounding.h:173
Definition: scaled_rounding.h:42