68#include <boost/rational.hpp>
73 using Rat = boost::rational<int64_t>;
74 using boost::rational_cast;
82 return ilog2(abs(a))+1
125 f128 const ROUND_ULP = 1 + 1/(
f128(std::numeric_limits<int64_t>::max()) * 2);
129 int64_t res = d*u + int64_t(frac*u * ROUND_ULP);
130 ENSURE (abs (
f128(res)/u - rational_cast<f128>(
Rat{num,den})) <= 1.0/abs(u)
131 ,
"Requantisation error exceeded num=%li / den=%li -> res=%li / quant=%li"
152 return Rat{
reQuant (src.numerator(), src.denominator(), u), u};
Inclusion for common place integral types and constants.
unsigned long long int ullong
constexpr int ilog2(I num)
Integral binary logarithm (disregarding fractional part)
IDiv< I > iDiv(I num, I den)
boost::rational< int64_t > Rat
bool can_represent_Product(int64_t a, int64_t b)
int64_t reQuant(int64_t num, int64_t den, int64_t u)
Re-Quantise a number into a new grid, truncating to the next lower grid point.
bool can_represent_Sum(Rat a, Rat b)
Utilities for quantisation (grid alignment) and comparisons.