Задать вопрос
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?
  • Вопрос задан
  • 1209 просмотров
Подписаться 2 Оценить Комментировать
Помогут разобраться в теме Все курсы
  • Нетология
    Python-разработчик: расширенный курс + нейросети
    12 месяцев
    Далее
  • Академия Эдюсон
    Python-разработчик
    9 месяцев
    Далее
  • ProductStar × РБК
    Профессия: Python-разработчик + ИИ
    8 месяцев
    Далее
Решения вопроса 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. Эти подходы нужны в очень узком классе задач и в отличие от предыдущих пунктов не являются обязательным знанием для каждого программиста.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы
ITK academy Краснодар
от 220 000 до 300 000 ₽
ITK academy Краснодар
от 75 000 ₽
DimaTech Ltd Краснодар
от 140 000 до 140 000 ₽