#include <cmath>template <typename T>T absmax(T a, T b){ return std::abs(a) > std::abs(b) ? a : b;}template <typename T>T round_ties_towards_zero(T x){ return absmax(std::round(std::nextafter(x, T(0))), std::trunc(x));}
For sufficiently small numbers you don't need absmax(..., trunc(x))
. Without it, I start getting wrong answers for double
s at around 1e16
and larger.