Чтобы прямо ответить на ваш вопрос, вы хотите использовать термин epsilon
. Точнее, это machine epsilon
обычное использование, которое отбрасывает «машину» и просто использует epsilon
.
Глядя в мою локальную копию float.h
я вижу:
#define DBL_EPSILON 2.2204460492503131e-016 /* smallest such that 1.0+DBL_EPSILON != 1.0 */
#define FLT_EPSILON 1.192092896e-07F /* smallest such that 1.0+FLT_EPSILON != 1.0 */
#define LDBL_EPSILON DBL_EPSILON /* smallest such that 1.0+LDBL_EPSILON != 1.0 */
И соответствующие комментарии ясно дают понять, что эпсилон - это термин, на который вы ссылаетесь.
Но мы также можем полагаться на некоторые другие внешние ссылки, чтобы проверить, что epsilon
это правильный термин. Смотрите здесь , здесь , здесь , и, наконец, эту комбинацию SO запросов тегов . Я не смог найти прямую ссылку на стандарт IEEE 754 для цитирования.
Вы не спрашивали, но я нашел эту ссылку, которая очень подходит к приведенному вами примеру, чтобы прояснить ваш вопрос.
Посмотрите на эту статью в блоге Брюса Доусона из Valve о сравнении значений с плавающей запятой, чтобы понять, почему вы не хотите использовать предложенное сравнение.
В эту статью упаковано довольно много информации, но это самый важный фрагмент:
Если сравнивать поплавки на равенство - плохая идея, то как насчет проверки, находится ли их различие в пределах границ ошибки или значения epsilon, например:
bool isEqual = fabs(f1 – f2) <= epsilon;
С помощью этого расчета мы можем выразить концепцию двух поплавков, находящихся достаточно близко, чтобы мы хотели считать их равными. Но какое значение мы должны использовать для эпсилон?
Учитывая наши эксперименты, приведенные выше, у нас может возникнуть соблазн использовать ошибку в нашей сумме, которая составляла около 1,19e-7f. Фактически, в float.h есть даже определение с этим точным значением, и оно называется FLT_EPSILON.
Понятно, что это так. Боги заголовочного файла говорили, и FLT_EPSILON - единственный настоящий эпсилон!
За исключением того, что это мусор. Для чисел от 1.0 до 2.0 FLT_EPSILON представляет разницу между соседними числами. Для чисел меньше 1,0 эпсилон FLT_EPSILON быстро становится слишком большим, а при достаточно малых числах FLT_EPSILON может быть больше, чем сравниваемые вами числа!
Доусон приводит несколько других соображений о тонкостях, связанных с сравнением чисел с плавающей запятой и с такими очень маленькими значениями, поэтому я бы посоветовал вам прочесть остальную часть его поста.