В КУРСЕ?

Разбираемся в теме

Числа на экране одинаковы, сравнение ложно: где скрывается округление

Программа показывает два одинаковых числа, но проверка равенства сообщает, что они различаются. Это не обязательно ошибка оператора сравнения. На экран часто выводится сокращённое представление, тогда как внутри используются более подробные значения. Кроме того, многие десятичные дроби нельзя точно представить конечной двоичной дробью. Разберём эти два источника путаницы отдельно, используя оригинальные учебные числа и бумажную проверку без установки среды программирования.

Вывод может скрывать существенные цифры

Возьмём значения 1,231 и 1,234. При обычном выводе с двумя знаками после десятичного разделителя оба выглядят как 1,23. Однако исходные значения различаются на 0,003. Совпадение сокращённых надписей не означает равенства чисел, из которых они получены. Форматирование представления само по себе не изменяет исходную переменную. Поэтому при отладке полезно различать вопрос что показано пользователю и вопрос что именно сравнивает программа. Ответ на первый не всегда позволяет восстановить второй.

Двоичное представление добавляет другой уровень

Числа с плавающей точкой обычно хранятся как двоичные приближения. Некоторые десятичные значения представимы точно, а многие требуют приближения. Поэтому математически ожидаемый результат арифметического выражения и конкретное машинное значение могут немного различаться. Например, в обычной арифметике Python с типом float результат вычитания 1,0 из 1,2 не равен в точности сохранённому значению 0,2. Это отдельный вопрос от сокращения вывода: даже подробное отображение лишь помогает увидеть приближение, но не устраняет его природу.

Равенство и достаточная близость различаются

Иногда задаче действительно нужно точное равенство, а иногда допустимо небольшое отклонение. Во втором случае критерий следует сформулировать явно. Абсолютный допуск задаёт допустимую разность в единицах величины. Относительный связывает разность с масштабом сравниваемых значений. В Python функция math.isclose учитывает такие допуски, но их наличие не отменяет выбора подходящего смысла сравнения. Универсальный случайный порог может скрыть настоящую ошибку. Например, для двух учебных значений разность 0,003 укладывается в абсолютный допуск 0,01, но не в допуск 0,001.

Исправление должно соответствовать задаче

Увеличить число знаков при выводе полезно для диагностики, но это не равнозначно исправлению вычислений. Округлять все промежуточные результаты также не является универсальным решением: так можно потерять нужную точность. Следует определить, какие значения хранятся, какие операции выполняются и какое отклонение допустимо по условиям задачи. Для требований к точным десятичным расчётам существуют другие представления чисел, однако их выбор зависит от предметной области. Этот разбор не задаёт правила финансового или инженерного расчёта; он показывает, почему видимое совпадение и математическое требование нужно обсуждать отдельно.

Попробуйте на практике

Разберите отображение и близость двух учебных чисел на бумаге.

  1. Запишите 1,231 и 1,234 полностью. Рядом округлите каждое для отображения до двух знаков после разделителя и сравните полученные надписи.
  2. Найдите разность исходных чисел. Отметьте, почему сравнение полных значений не обязано совпасть со сравнением сокращённых надписей.
  3. Проверьте два независимых условия: абсолютная разность не больше 0,01 и абсолютная разность не больше 0,001. Для каждого запишите отдельный ответ.
  4. Сформулируйте три разных результата: надписи совпали, исходные числа различаются, близость зависит от заданного допуска. Не заменяйте один результат другим.

Как проверить результат. Оба отображения равны 1,23, разность исходных чисел составляет 0,003. Допуск 0,01 выполняется, допуск 0,001 нет. Из совпадения отображений не сделан вывод о точном равенстве сохранённых значений.

Частые вопросы

Нужно всегда заменять точное сравнение проверкой близости?

Нет. Выбор зависит от смысла задачи и представления данных. Проверка близости полезна там, где допускается отклонение, но не должна произвольно размывать требование точного совпадения.

Больше цифр в печати делает вычисления точнее?

Нет. Это меняет вид представления и помогает исследовать результат. Точность исходных вычислений зависит от хранения чисел, операций и выбранного алгоритма, а не только от количества напечатанных знаков.

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

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

Зарегистрироваться
← К списку материалов