Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Math: floating, point, precision

Как учитывать погрешность вычислений при сравнении чисел с плавающей точкой?

Вопрос проверяет понимание особенностей работы чисел с плавающей точкой и правильных способов их сравнения.

Короткий ответ

Числа с плавающей точкой нельзя сравнивать напрямую из-за погрешностей представления. Вместо этого сравнивают разницу между числами с заданной точностью. Обычно используют значение допуска, например epsilon. В Python для этого есть функция math.isclose().

Длинный ответ

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

Пример проблемы:

0.1 + 0.2 == 0.3   # False

Фактический результат отличается на очень маленькую величину.

1. Сравнение через допуск

Определение:
Допуск (tolerance) — это максимально допустимая разница между числами, при которой они считаются равными.

Пример:

abs(a - b) < 1e-9

Такой способ работает в большинстве задач.

2. Использование math.isclose

Стандартный способ в Python:

import math

math.isclose(a, b, rel_tol=1e-9, abs_tol=1e-12)

Параметры:

  1. rel_tol — относительная погрешность

  2. abs_tol — абсолютная погрешность

Это удобно, когда числа могут иметь разный масштаб.

3. Почему возникает погрешность

Основные причины:

  1. Двоичное представление дробей

  2. Округления при операциях

  3. Накопление ошибок при множественных вычислениях

Например, в циклах ошибка может постепенно увеличиваться.

4. Как выбирать точность

Рекомендуется:

  1. Выбирать допуск исходя из задачи

  2. Не использовать слишком маленький epsilon без необходимости

  3. Учитывать масштаб данных

Если числа порядка 1e6, то допуск должен быть больше, чем для чисел порядка 1.

5. Тестирование с учетом погрешности

В PyTest часто используют:

import pytest

def test_value():
    assert pytest.approx(0.3, rel=1e-6) == 0.1 + 0.2

Это более надежный способ тестирования числовых функций.

Вывод

Числа с плавающей точкой нельзя сравнивать напрямую. Надежный подход — использовать допуск или специализированные функции вроде math.isclose или pytest.approx.

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    5

  • Сложность:

    6

Навыки

  • Math

    Math

Ключевые слова

#floating

#point

#precision

Подпишись на Python Developer в телеграм

  • Аватар

    Python Guru

    Sergey Filichkin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.