Я хотел бы знать эпсилон числа с плавающей запятой вокруг заданного значения.
std::numeric_limits<floating_point_type>::epsilon()
предусматривает, что только для числа 1,0, в то время как я хотел бы, чтобы функция работала на любое число.
Есть ли стандартное решение библиотеки для этого? Если нет — как мне реализовать эту функцию?
Ну, самое простое решение найти эпсилон сразу над значением (то есть расстояние от этого значения до следующего представимого значения) было бы просто
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 (что, ну, я не знаю, как я к этому отношусь). Во всех остальных случаях результат будет точным.
Других решений пока нет …