Arti-Jack
@Arti-Jack

Как избежать неточностей при подсчете различных выражений в Python?

Суть проблемы заключается в том, что при подсчете разных чисел с плавающей точкой есть много неприятных и тонких моментов.

Ну например, есть довольно тривиальная задачка на вероятности:

 В магазине стоят два платёжных терминала. Каждый из них может быть неисправен 
с вероятностью  0,3  независимо  от другого  терминала. Найдите вероятность  того, что 
хотя бы один платежный терминал исправен. 


Правильным ответом здесь является 0.91, т.е P = (0.3 * 0.7) + (0.7 * 0.3) + (0.7 * 0.7)

Но интерпритатор питона выдает не очень корректный результат (0.9099999999999999).

Я знаю, что это происходит из-за специфичной реализации хранения вещественных чисел в памяти.

Но мой вопрос заключается в том, как именно можно обходить подобные проблемы при работе с такими числами в Python?
  • Вопрос задан
  • 1163 просмотра
Решения вопроса 2
@Pentblch
Смотрю в сторону Web, начинающий
Прочитайте про decimal и fractions
Ответ написан
tsarevfs
@tsarevfs
C++ developer
В зависимости от того зачем это вам.
Если хочется иметь адекватный вывод для пользователя -- используйте округление или форматирование с ограничением числа знаков после запятой (что тоже использует округление).
Если хочется делать проверки на ==, <=, >= -- используйте сравнение с погрешностью.
Если из за погрешностей не правильно работают ваши алгоритмы -- попробуйте длинную арифметику.
Если нужно точно вычислить предикат, и длинной арифметики не хватает (слишком долго), например в некоторых задачах вычислительной геометрии, то есть специальные техники. Например neerc.ifmo.ru/wiki/index.php?title=%D0%98%D0%BD%D1... и adaptive precision floating-point arithmetics. Эти подходы нужны в очень узком классе задач и в отличие от предыдущих пунктов не являются обязательным знанием для каждого программиста.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы