Libchecker:checker eq FPTYPE

From EjudgeWiki

Навигация: Главная страница/Система ejudge/Проверяющие программы/libchecker/Функции/Сравнение вещественных значений/Сравнение вещественных чисел с заданной относительной погрешностью

Данные функции позволяют сравнивать два вещественных числа на равенство с заданной относительной погрешностью.

int checker_eq_float(float v1, float v2, float eps);
int checker_eq_double(double v1, double v2, double eps);
int checker_eq_long_double(long double v1, long double v2, long double eps);

Параметр eps задаёт относительную погрешность и должен лежать в интервале (0, 1). Как правило, указывается значение eps, равное 10^{-n}. Параметры v1 и v2 задают значения для сравнения.

Сравнение ведется по следующим правилам в порядке их применения:

  • если оба числа равны NaN, они считаются равными;
  • если только одно число равно NaN, числа считаются различными;
  • если оба числа равны Inf и имеют один знак, они считаются равными;
  • если оба числа равны Inf, но имеют разный знак, либо только одно число равно Inf, числа считаются различными;
  • если модули обоих чисел не превышают 1, и модуль разности между ними |v1 - v2| меньше значния 1.125*eps, числа считаются равными;
  • если модули обоих чисел не превышают 1, и модуль разности между ними |v1 - v2| больше или равен значния 1.125*eps, числа считаются различными;
  • если числа имеют разный знак, они считаются различными;
  • если двоичные порядки чисел отличаются более чем на 1, числа считаются различными;
  • из порядков обоих чисел вычитается минимальный порядок, таким образом, порядки чисел приводятся к значениям 0 или 1, если после этого модуль разности между ними |v1 - v2| меньше значния 1.125*eps, числа считаются равными;
  • в противном случае числа считаются различными.

Таким образом, значение eps задаёт, сколько совпадающих десятичных знаков должны иметь два числа. Константа 1.125 (9/8) выбрана потому, что она незначительно больше 1 и точно представима в двоичной системе счисления.

Функции возвращают 1, если два числа равны, и 0, если числа не равны.