Страницы

Поиск по вопросам

воскресенье, 2 июня 2019 г.

Точность вычислений в языке python

Столкнулся с некой странностью с действительными числами в python.
Например, print(0.3+0.3+0.3) вместо вполне ожидаемых 0.9 выведет 0.8999999999999999.
Знаю про точность вычислений, про хранение в компьютере вещественных чисел, но почему, print(0.3*3 == 0.9) выдает false?
UPD Можно обойти это, сравнивая вот так print('%.2f'%(0.3*3) == '%.2f'%(0.9)) Но есть ли какой-нибудь другой способ?


Ответ

Потому что 0.3 - это не ровно 0.3, а, как вы сами предположили, немного меньше. Что и дает требуемую погрешность при умножении.
Представьте, что по каким-то причинам компьютер сохраняет числа в формате 0.01 + 0.02k. В этом случае 0.3 будет преобразован в 0.299, а 0.9 - в 0.899. Теперь же, если умножить 0.3 на 3, будет получен результат 0.897, а не 0.899.
Вышеописанный пример не имеет никакого отношения к реальности, но, надеюсь, показывает, как при умножении минимальная погрешность становится достаточно большой, чтобы результирующее число было округлено в нужную сторону.
0.3 + 0.3 + 0.3 же будет равно 0.3 * 3, хотя гарантировать постоянное соблюдение этого равенства я не берусь.

Комментариев нет:

Отправить комментарий