Что ж, самое простое решение найти эпсилон сразу над значением (то есть расстояние от этого значения до следующего представимого значения) будет просто
std::nextafter(x, std::numeric_limits<floating_point_type>::infinity()) - x
Аналогично, чтобы найти эпсилон ниже значения, вы можете сделать
x - std::nextafter(x, -std::numeric_limits<floating_point_type>::infinity())
Обратите внимание, что эти два не будут одинаковыми, если x является точной степенью двойки.
Теперь есть одно небольшое предостережение: вычисленный эпсилон выше FLT_MAX
будет бесконечным (возможно, это вид правильного ответа, но он не совсем совпадает Правила округления IEEE-754) и эпсилон выше бесконечности будет NaN (что, ну, я не знаю, как я к этому отношусь). Во всех остальных случаях результат будет точным.