Обработка точности чисел с плавающей запятой
На этом этапе мы обсудим, как обрабатывать точность чисел с плавающей запятой при сравнении их с нулем. Из-за способа представления чисел с плавающей запятой в компьютерах они часто подвержены небольшим ошибкам округления. Это может привести к непредвиденным результатам при прямом сравнении их с нулем.
Например, вычисление, которое теоретически должно дать ноль, на практике может дать очень маленькое ненулевое число, например 1e-16
(0.0000000000000001). Прямое сравнение этого числа с нулем с использованием ==
вернет False
, что может быть нежелательным результатом.
Для обработки этой проблемы обычно используется значение допуска (также известное как эпсилон) для проверки, находится ли число с плавающей запятой "достаточно близко" к нулю.
Создадим Python-скрипт, чтобы продемонстрировать это.
-
Откройте редактор VS Code в среде LabEx.
-
Создайте новый файл с именем float_precision.py
в директории ~/project
.
~/project/float_precision.py
-
Добавьте следующий код в файл float_precision.py
:
## Import the math module
import math
## Define a tolerance value (epsilon)
tolerance = 1e-9 ## A small value like 0.000000001
## A floating-point number that is very close to zero due to calculation
number = 1e-10
## Direct comparison with zero (may fail)
if number == 0:
print("Direct comparison: number is zero")
else:
print("Direct comparison: number is not zero")
## Using tolerance to compare with zero
if math.isclose(number, 0, abs_tol=tolerance):
print("Comparison with tolerance: number is close to zero")
else:
print("Comparison with tolerance: number is not close to zero")
## Another example with a slightly larger number
number = 1e-7
## Direct comparison with zero (will fail)
if number == 0:
print("Direct comparison: number is zero")
else:
print("Direct comparison: number is not zero")
## Using tolerance to compare with zero
if math.isclose(number, 0, abs_tol=tolerance):
print("Comparison with tolerance: number is close to zero")
else:
print("Comparison with tolerance: number is not close to zero")
Этот скрипт демонстрирует, как использовать функцию math.isclose()
с значением допуска для сравнения чисел с плавающей запятой с нулем.
-
Сохраните файл.
-
Запустите скрипт с помощью команды python
в терминале:
python float_precision.py
Вы должны увидеть следующий вывод:
Direct comparison: number is not zero
Comparison with tolerance: number is close to zero
Direct comparison: number is not zero
Comparison with tolerance: number is not close to zero
Как вы можете видеть, прямое сравнение не дает правильного результата, так как число не является точно равным нулю. Однако при использовании значения допуска с функцией math.isclose()
сравнение правильно определяет, что число близко к нулю.
Функция math.isclose()
проверяет, находятся ли два числа с плавающей запятой близко друг к другу в пределах заданного допуска. Аргумент abs_tol
задает абсолютный допуск. Если абсолютная разность между двумя числами меньше или равна допуску, функция возвращает True
.
Используя значение допуска, вы можете избежать проблем, связанных с точностью чисел с плавающей запятой, и обеспечить точность и надежность сравнений с нулем.