Исследование представления чисел с плавающей запятой
На этом этапе вы узнаете, как числа с плавающей запятой представлены в Python и как это представление может повлиять на числовые сравнения. Числа с плавающей запятой используются для представления вещественных чисел (чисел с десятичной точкой) в компьютерах. Однако из-за способа их хранения в памяти они часто являются приближениями реальных чисел. Это может привести к неожиданным результатам при выполнении сравнений.
Начнем с создания файла Python с именем float_representation.py
в каталоге ~/project
с помощью редактора VS Code.
## Create a floating-point number
x = 0.1 + 0.2
## Print the value of x
print(x)
Сохраните файл и запустите его с помощью следующей команды в терминале:
python float_representation.py
Вы, возможно, ожидаете, что вывод будет 0.3
, но, скорее всего, увидите что-то вроде этого:
0.30000000000000004
Это происходит потому, что 0.1
и 0.2
не могут быть представлены точно как числа с плавающей запятой. Результат сложения - это число, очень близкое к 0.3
, но не точно равное ему.
Теперь давайте посмотрим, как эта неточность может повлиять на сравнения. Добавьте следующий код в файл float_representation.py
:
## Create a floating-point number
x = 0.1 + 0.2
## Check if x is equal to 0.3
if x == 0.3:
print("x is equal to 0.3")
else:
print("x is not equal to 0.3")
Сохраните файл и запустите его снова:
python float_representation.py
Скорее всего, вы увидите следующий вывод:
x is not equal to 0.3
Это происходит потому, что x
не точно равно 0.3
из-за проблемы с представлением чисел с плавающей запятой.
Для точного сравнения чисел с плавающей запятой вы должны использовать значение допуска (tolerance). Вместо проверки на точное равенство проверяйте, является ли абсолютная разность между двумя числами меньше небольшого значения допуска.
Измените файл float_representation.py
, чтобы включить значение допуска:
## Create a floating-point number
x = 0.1 + 0.2
## Define a tolerance value
tolerance = 1e-9 ## A small value like 0.000000001
## Check if x is approximately equal to 0.3
if abs(x - 0.3) < tolerance:
print("x is approximately equal to 0.3")
else:
print("x is not approximately equal to 0.3")
Сохраните файл и запустите его еще раз:
python float_representation.py
Теперь вы должны увидеть следующий вывод:
x is approximately equal to 0.3
Используя значение допуска, вы можете точно сравнивать числа с плавающей запятой, несмотря на неисправность, присущую их представлению. Это важное понятие, которое необходимо понять при работе с числами с плавающей запятой в Python и других языках программирования.