Разрешение с плавающей точкой при заданном числе

Я хотел бы знать эпсилон числа с плавающей запятой вокруг заданного значения.

std::numeric_limits<floating_point_type>::epsilon() предусматривает, что только для числа 1,0, в то время как я хотел бы, чтобы функция работала на любое число.

Есть ли стандартное решение библиотеки для этого? Если нет — как мне реализовать эту функцию?

1

Решение

Ну, самое простое решение найти эпсилон сразу над значением (то есть расстояние от этого значения до следующего представимого значения) было бы просто

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 (что, ну, я не знаю, как я к этому отношусь). Во всех остальных случаях результат будет точным.

5

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector