Ошибка представления Python: В этой статье объясняется, почему арифметика с плавающей точкой может привести к вам с пути в Python. Арифметика с плавающей точкой не может точно представлять некоторые числа. Хотя многие люди думают, что это ошибка, это на самом деле нет.
Посмотрите на следующий фрагмент кода:
print((0.1 + 0.2) == 0.3) # False
В фрагменте кода вы предположили, что число 0.1 фактически представляет собой десятичное значение 0,1 или 1/10. (Дайте мне знать, если вы этого не …;)) Это естественно, но неверное предположение. Значение 0.1 не существует на вашем компьютере. Вместо этого ваш компьютер хранит каждый номер как двоичный, состоящий только из нулей и них.
Используйте онлайн-преобразователь для преобразования десятичного значения 0.1 в двоичное значение, и вы поймете, что вы получите следующий номер: 0,0001100110011001100110011001100110011001100110011001101 …
Представление с плавающей точкой 0,1 в двоичном количестве имеет бесконечное количество цифр. Таким образом, ваш компьютер делает единственное, что он может сделать в данный момент: ограничение количества цифр.
Это имеет следующий эффект. Десятичное число 0,1 представлено ближайшим плавающим
Теперь легко понять, почему 0,1 + 0,2,3. Плавающее
Обратите внимание, что это распространенная проблема для всех основных языков программирования. Это происходит из-за вариантов дизайна оборудования, а не из-за дизайнеров языка программирования.
Q & A.
Гухан, один из читателей моей серии электронной почты «Coffee Break Python» (Подписаться!), Указал следующий вопрос:
Но почему это происходит только с 0,1 + 0,2? Если вы добавите любое другое десятичное число, например 0,3 или 0,4, вы все еще получаете то, что ожидаете:
>>> print(0.1 + 0.2) 0.30000000000000004 >>> print(0.1 + 0.3) 0.4 >>> print(0.1 + 0.4) 0.5 >>> print(0.1 + 0.5) 0.6 >>> print(0.1 + 0.6) 0.7
Причина следующая: Python не может представлять некоторые Числа точно используют только арифметику с плавающей точкой (из-за причин выше). Однако это не означает, что Python не может представлять Все Числа именно.
x = 0.1 for i in range(10): print(x) x += 0.1 """ OUTPUT (Python 3.7.2): 0.1 0.2 0.30000000000000004 0.4 0.5 0.6 0.7 0.7999999999999999 0.8999999999999999 0.9999999999999999 """
Фрагмент кода показывает, что некоторые числа представляются правильно, другие нет. Обратите внимание, что значение 0,4 основано на неправильно представленном значении 0,3, добавив 0,1 к нему. Причина в том, что математический результат 0,3000000000004 + 0,1 округляется до поплавка 0,4, что является ближайшим числом с плавающей точкой к результату.
Таким образом, имеют ли плавающиеся скруглением или не зависит от их присущей способности быть представленными как двоичные числа, используя арифметику с плавающей точкой.
- Некоторые из них могут быть правильно представлены поплавкам,
- другие не могут.
Это не ошибка, ни большая проблема. Это просто жизнь в дискретизированном мире компьютеров.
Куда пойти отсюда?
Если вы хотите глубоко погружаться в эту тему, вы можете прочитать больше о
Также проверьте мою новую книгу программирования: “Кофе-брейк Python Workbook” Отказ Это легко, весело читать и полно 127 головоломков Python для высокоэффективной подготовки.
Узнайте больше на странице книги в моем блоге: «Кофе-брейк Python Workbook: 127 головоломки Python, чтобы оттолкнуть вас от нуля до героя в вашим перерывам на кофе»
Работая в качестве исследователя в распределенных системах, доктор Кристиан Майер нашел свою любовь к учению студентов компьютерных наук.
Чтобы помочь студентам достичь более высоких уровней успеха Python, он основал сайт программирования образования Finxter.com Отказ Он автор популярной книги программирования Python One-listers (Nostarch 2020), Coauthor of Кофе-брейк Python Серия самооставленных книг, энтузиаста компьютерных наук, Фрилансера и владелец одного из лучших 10 крупнейших Питон блоги по всему миру.
Его страсти пишут, чтение и кодирование. Но его величайшая страсть состоит в том, чтобы служить стремлению кодер через Finxter и помогать им повысить свои навыки. Вы можете присоединиться к его бесплатной академии электронной почты здесь.