Разрешение с плавающей точкой при заданном числе - PullRequest
0 голосов
/ 13 сентября 2018

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

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

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

1 Ответ

0 голосов
/ 13 сентября 2018

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

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

...