Cmp double

From EjudgeWiki

Навигация: Главная страница/Система ejudge/Использование/Проверяющие программы/Стандартные проверяющие программы/cmp_double

Проверяющая программа cmp_double сравнивает вещественное значение в файле результата работы тестируемой программы с вещественным значением в файле эталонного ответа. С помощью переменных окружения EPS и ABSOLUTE можно управлять точностью и режимом сравнения чисел.

Файл результата работы программы должен быть текстовым файлом. Вещественное число должно быть единственным элементом ввода в файле, то есть кроме записи вещественного числа в файле могут находиться только пробельные символы. При нарушении этих условий проверяющая программа диагностирует ошибку неправильного формата результата.

Файл эталонного ответа также должен быть текстовым файлом и содержать единственный элемент ввода. При нарушении этих условий проверяющая программа диагностирует внутренюю ошибку проверки.

Вещественное число должно быть записано по правилам записи вещественных чисел. Если это условие не выполняется в файле результата работы программы, проверяющая программа диагностирует ошибку неправильного формата результата. Если это условие не выполняется в файле эталонного ответа, проверяющая программа диагностирует внутренюю ошибку проверки.

Если значение в файле эталонного ответа является специальным вещественным значением NaN, +Inf, -Inf, значение в файле результата работы тестируемой программы должно быть таким же (NaN, +Inf, -Inf соответственно). В противном случае диагностируется неправильный ответ.

Если значение в файле эталонного ответа не является специальным вещественным значением, а значение в файле результата работы программы — является, диагностируется неправильный ответ.

Вещественное значение из файла результата и вещественное значение из файла эталонного ответа считываются в переменные типа double (64-битные вещественные значения двойной точности).

Погрешность сравнения устанавливается переменной окружения EPS. Если такая переменная окружения не установлена, её значение не является вещественным числом, или её значение не меньше 1, проверяющая программа диагностирует внутренюю ошибку проверки. Во всех операциях сравнения, описываемых ниже, используется не значение EPS, а значение EPS1, которое вычисляется как 1.1*EPS.

Для "нормальных" вещественных значений поддерживаются два режима сравнения вещественных чисел:

  • режим абсолютной погрешности
  • режим относительной погрешности

Режим относительной погрешности установлен по умолчанию. В этом режиме сравнение ведется следующим образом:

  • если оба значения по модулю меньше 1, то их разность по модулю должна быть меньше EPS1. В противном случае диагностируется неправильный ответ.
  • если числа имеют разные знаки, диагностируется неправильный ответ.
  • если двоичные порядки чисел отличаются больше чем на 1, диагностируется неправильный ответ.
  • оба числа нормируются, то есть их двоичные порядки уменьшаются на значение меньшего двоичного порядка из двух чисел. В результате получится одно число с двоичным порядком 0, другое число с двоичным порядком 0 или 1. Если разность этих чисел по модулю не меньше EPS1, диагностируется неправильный ответ.

Итак, в режиме относительной погрешности переменная окружения EPS задаёт количество верных десятичных знаков в ответе.

Режим абсолютной погрешности устанавливается, если задана переменная окружения ABSOLUTE. Значение этой переменной может быть произвольным. В режиме абсолютной погрешности модуль разности двух чисел должен быть не больше EPS1. В противном случае диагностируется неправильный ответ.

(С версии 2.3.25) Если установлена переменная окружения EJ_REQUIRE_NL, то вывод тестируемой программы проверяется на наличие символа \n в конце. Если символ \n отсутствует, проверяющая программа завершается с вердиктом ошибка неправильного формата результата.