Cmp double seq

From EjudgeWiki

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

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

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

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

Такие же требования предъявляются к файлу эталонного ответа. Если какое-либо требование нарушено, проверяющая программа диагностирует внутренюю ошибку проверки.

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

Каждое число из файла результата работы тестируемой программы сравнивается с соответствующим числом из файла эталонного ответа по следующим правилам (правила совпадают с правилами сравнения вещественных чисел в проверяющей программа cmp_double).

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

Если значение в файле эталонного ответа является специальным вещественным значением 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 отсутствует, проверяющая программа завершается с вердиктом ошибка неправильного формата результата.