Введение
В этом лабораторном занятии (LabEx) вы научитесь проверять, близко ли одно число к другому на Python, решив проблемы сравнения чисел с плавающей запятой. Сначала вы познакомитесь с концепцией числовой близости и ее важностью, учитывая то, как компьютеры представляют числа с плавающей запятой, что может привести к неожиданным результатам при сравнении их на равенство. Python-скрипт проиллюстрирует эту концепцию, вычислив 0.1 + 0.2 и сравнив результат с 0.3, показывая возможность неравенства из-за представления чисел с плавающей запятой.
Затем в рамках лабораторной работы (LabEx) вы научитесь вычислять абсолютную разность между двумя числами как один из подходов к определению близости. Наконец, вы узнаете, как использовать функцию math.isclose() для более надежного сравнения чисел с плавающей запятой, учитывая как относительную, так и абсолютную погрешность.
Понять числовую близость
На этом этапе мы рассмотрим концепцию числовой близости и ее важность в программировании, особенно при работе с числами с плавающей запятой. Из-за того, как компьютеры представляют числа с плавающей запятой, они часто являются приближениями действительных чисел. Это может привести к неожиданным результатам при сравнении их на равенство.
Числовая близость помогает нам определить, достаточно ли "близки" два числа, чтобы считать их равными, даже если они не совпадают точно. Это особенно полезно при выполнении вычислений, которые включают арифметические операции с числами с плавающей запятой.
Начнем с создания Python-скрипта для иллюстрации этой концепции.
Откройте редактор VS Code в среде LabEx.
Создайте новый файл с именем
proximity.pyв директории~/project.~/project/proximity.pyДобавьте следующий код в файл
proximity.py:## proximity.py num1 = 0.1 + 0.2 num2 = 0.3 print(f"num1 is: {num1}") print(f"num2 is: {num2}") if num1 == num2: print("num1 and num2 are equal") else: print("num1 and num2 are not equal")Этот скрипт вычисляет
0.1 + 0.2и сравнивает результат с0.3.Сохраните файл и запустите его, используя следующую команду в терминале:
python ~/project/proximity.pyВы должны увидеть вывод, похожий на следующий:
num1 is: 0.30000000000000004 num2 is: 0.3 num1 and num2 are not equalКак вы можете видеть,
num1иnum2не совпадают точно из-за представления чисел с плавающей запятой, хотя математически они должны быть равны. Именно здесь концепция числовой близости становится важной. В следующих шагах мы рассмотрим способы обработки такой ситуации.
Вычислить абсолютную разность
На этом этапе мы научимся вычислять абсолютную разность между двумя числами. Абсолютная разность представляет собой величину разности между двумя числами, независимо от их порядка. Другими словами, это положительная разность между двумя числами.
В Python мы можем использовать функцию abs() для вычисления абсолютной разности. Функция abs() возвращает абсолютное значение числа.
Давайте модифицируем скрипт proximity.py из предыдущего шага, чтобы вычислить абсолютную разность между num1 и num2.
Откройте файл
proximity.pyв директории~/projectс помощью редактора VS Code.Измените код для вычисления абсолютной разности:
## proximity.py num1 = 0.1 + 0.2 num2 = 0.3 print(f"num1 is: {num1}") print(f"num2 is: {num2}") absolute_difference = abs(num1 - num2) print(f"The absolute difference between num1 and num2 is: {absolute_difference}") if absolute_difference < 0.00001: ## Using a small tolerance print("num1 and num2 are approximately equal") else: print("num1 and num2 are not approximately equal")В этом коде мы вычисляем абсолютную разность между
num1иnum2с помощью функцииabs(). Затем мы сравниваем абсолютную разность с небольшим значением допуска (в данном случае 0.00001). Если абсолютная разность меньше допуска, мы считаем числа приблизительно равными.Сохраните файл и запустите его, используя следующую команду в терминале:
python ~/project/proximity.pyВы должны увидеть вывод, похожий на следующий:
num1 is: 0.30000000000000004 num2 is: 0.3 The absolute difference between num1 and num2 is: 4.440892098500626e-17 num1 and num2 are approximately equalТеперь скрипт правильно определяет, что
num1иnum2приблизительно равны, учитывая абсолютную разность и значение допуска. Этот подход более надежен, чем прямое сравнение чисел с плавающей запятой на равенство.
Использовать math.isclose() для чисел с плавающей точкой
На этом этапе мы научимся использовать функцию math.isclose() для сравнения чисел с плавающей запятой на приблизительное равенство. Функция math.isclose() является более надежным и рекомендуемым способом сравнения чисел с плавающей запятой, чем использование фиксированного допуска.
Функция math.isclose() принимает два числа в качестве входных параметров и возвращает True, если они близки друг к другу в пределах заданного допуска, и False в противном случае. Она имеет два параметра допуска: rel_tol (относительный допуск) и abs_tol (абсолютный допуск).
Давайте модифицируем скрипт proximity.py из предыдущего шага, чтобы использовать функцию math.isclose().
Откройте файл
proximity.pyв директории~/projectс помощью редактора VS Code.Измените код для использования
math.isclose():## proximity.py import math num1 = 0.1 + 0.2 num2 = 0.3 print(f"num1 is: {num1}") print(f"num2 is: {num2}") if math.isclose(num1, num2): print("num1 and num2 are approximately equal") else: print("num1 and num2 are not approximately equal")В этом коде мы импортируем модуль
mathи используем функциюmath.isclose()для сравненияnum1иnum2. Мы используем значения по умолчанию дляrel_tolиabs_tol, которые подходят для большинства случаев.Сохраните файл и запустите его, используя следующую команду в терминале:
python ~/project/proximity.pyВы должны увидеть вывод, похожий на следующий:
num1 is: 0.30000000000000004 num2 is: 0.3 num1 and num2 are approximately equalТеперь скрипт правильно определяет, что
num1иnum2приблизительно равны, используя функциюmath.isclose(). Это рекомендуемый способ сравнения чисел с плавающей запятой на приблизительное равенство в Python.
Резюме
В этом практическом занятии (лабораторной работе) мы начали с исследования концепции числовой близости и ее важности при сравнении чисел с плавающей запятой в Python. Из-за того, как компьютеры представляют эти числа, прямые сравнения на равенство могут быть ненадежными. Мы создали скрипт proximity.py, чтобы продемонстрировать эту проблему, где сравнивали 0.1 + 0.2 с 0.3 и выяснили, что они не точно равны из-за представления чисел с плавающей запятой.
Затем в рамках практического занятия была показана необходимость альтернативных методов для определения того, являются ли два числа "достаточно близкими", чтобы считать их равными. Это послужило основой для изучения таких методов, как вычисление абсолютной разности на последующих этапах (содержание обрезано).



