31 #ifndef ETL_SCALED_ROUNDING_INCLUDED
32 #define ETL_SCALED_ROUNDING_INCLUDED
34 #include "static_assert.h"
67 template <const
size_t SCALING,
typename T>
71 typedef typename scaled_rounding_t<T>::type scale_t;
75 return T((value + scale_t(SCALING)) / scale_t(SCALING));
79 return T(value / scale_t(SCALING));
88 template <const
size_t SCALING,
typename T>
91 typedef typename scaled_rounding_t<T>::type scale_t;
93 return round_ceiling_unscaled<SCALING>(value) * scale_t(SCALING);
101 template <const
size_t SCALING,
typename T>
105 typedef typename scaled_rounding_t<T>::type scale_t;
109 return T(value / scale_t(SCALING));
113 return T((value - scale_t(SCALING)) / scale_t(SCALING));
122 template <const
size_t SCALING,
typename T>
125 typedef typename scaled_rounding_t<T>::type scale_t;
127 return T(round_floor_unscaled<SCALING>(value) * scale_t(SCALING));
136 template <const
size_t SCALING,
typename T>
140 ETL_STATIC_ASSERT((((SCALING / 2U) * 2U) == SCALING),
"Scaling must be divisible by 2");
141 typedef typename scaled_rounding_t<T>::type scale_t;
145 return T((value + scale_t(SCALING / 2U)) / scale_t(SCALING));
149 return T((value - scale_t(SCALING / 2U)) / scale_t(SCALING));
159 template <const
size_t SCALING,
typename T>
162 typedef typename scaled_rounding_t<T>::type scale_t;
164 return T(round_half_up_unscaled<SCALING>(value) * scale_t(SCALING));
173 template <const
size_t SCALING,
typename T>
177 ETL_STATIC_ASSERT((((SCALING / 2U) * 2U) == SCALING),
"Scaling must be divisible by 2");
178 typedef typename scaled_rounding_t<T>::type scale_t;
182 return T((value + scale_t((SCALING / 2U) - 1U)) / scale_t(SCALING));
186 return T((value - scale_t((SCALING / 2U) - 1U)) / scale_t(SCALING));
196 template <const
size_t SCALING,
typename T>
199 typedef typename scaled_rounding_t<T>::type scale_t;
201 return T(round_half_down_unscaled<SCALING>(value) * scale_t(SCALING));
209 template <const
size_t SCALING,
typename T>
213 typedef typename scaled_rounding_t<T>::type scale_t;
215 return T(value / scale_t(SCALING));
223 template <const
size_t SCALING,
typename T>
226 typedef typename scaled_rounding_t<T>::type scale_t;
228 return T(round_zero_unscaled<SCALING>(value) * scale_t(SCALING));
236 template <const
size_t SCALING,
typename T>
240 typedef typename scaled_rounding_t<T>::type scale_t;
244 return T((value + scale_t(SCALING)) / scale_t(SCALING));
248 return T((value - scale_t(SCALING)) / scale_t(SCALING));
257 template <const
size_t SCALING,
typename T>
260 typedef typename scaled_rounding_t<T>::type scale_t;
262 return T(round_infinity_unscaled<SCALING>(value) * scale_t(SCALING));
271 template <const
size_t SCALING,
typename T>
275 typedef typename scaled_rounding_t<T>::type scale_t;
278 if ((etl::absolute(value) % scale_t(SCALING)) == scale_t(SCALING / 2U))
281 if ((value / scale_t(SCALING)) & 1U)
283 return T(round_half_up_unscaled<SCALING>(value));
287 return T(round_half_down_unscaled<SCALING>(value));
292 return T(round_half_up_unscaled<SCALING>(value));
302 template <const
size_t SCALING,
typename T>
305 typedef typename scaled_rounding_t<T>::type scale_t;
307 return T(round_half_even_unscaled<SCALING>(value) * scale_t(SCALING));
316 template <const
size_t SCALING,
typename T>
320 typedef typename scaled_rounding_t<T>::type scale_t;
323 if ((etl::absolute(value) % scale_t(SCALING)) == scale_t(SCALING / 2U))
326 if ((value / scale_t(SCALING)) & 1U)
328 return T(round_half_down_unscaled<SCALING>(value));
332 return T(round_half_up_unscaled<SCALING>(value));
337 return T(round_half_up_unscaled<SCALING>(value));
347 template <const
size_t SCALING,
typename T>
350 typedef typename scaled_rounding_t<T>::type scale_t;
352 return T(round_half_odd_unscaled<SCALING>(value) * scale_t(SCALING));
conditional
Definition: type_traits_generator.h:1202
is_integral
Definition: type_traits_generator.h:941
Definition: absolute.h:37
T round_half_even_unscaled(T value)
Definition: scaled_rounding.h:272
T round_ceiling_scaled(T value)
Definition: scaled_rounding.h:89
T round_infinity_unscaled(T value)
Definition: scaled_rounding.h:237
T round_half_down_scaled(T value)
Definition: scaled_rounding.h:197
T round_half_even_scaled(T value)
Definition: scaled_rounding.h:303
T round_half_odd_scaled(T value)
Definition: scaled_rounding.h:348
T round_half_up_scaled(T value)
Definition: scaled_rounding.h:160
T round_infinity_scaled(T value)
Definition: scaled_rounding.h:258
T round_floor_scaled(T value)
Definition: scaled_rounding.h:123
T round_zero_unscaled(T value)
Definition: scaled_rounding.h:210
T round_ceiling_unscaled(T value)
Definition: scaled_rounding.h:68
T round_half_up_unscaled(T value)
Definition: scaled_rounding.h:137
T round_floor_unscaled(T value)
Definition: scaled_rounding.h:102
T round_half_odd_unscaled(T value)
Definition: scaled_rounding.h:317
T round_zero_scaled(T value)
Definition: scaled_rounding.h:224
T round_half_down_unscaled(T value)
Definition: scaled_rounding.h:174
Definition: scaled_rounding.h:43