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?
  • Вопрос задан
  • 1117 просмотров
Решения вопроса 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. Эти подходы нужны в очень узком классе задач и в отличие от предыдущих пунктов не являются обязательным знанием для каждого программиста.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
04 мая 2024, в 06:10
4000 руб./за проект
04 мая 2024, в 05:49
10000 руб./за проект
04 мая 2024, в 03:57
10000 руб./за проект