Математический модуль Python: полное руководство по работе с math

Раздел: Библиотеки -> Работа с библиотеками для данных

Библиотека math: решение математических задач в Python

Модуль math входит в стандартную библиотеку Python и предоставляет широкий набор математических функций и констант. Он реализован на C, поэтому работает быстро. Основное применение - численные вычисления с плавающей точкой, тригонометрия, логарифмы, комбинаторика и работа с константами. Ниже рассмотрено эффективное использование модуля и альтернативные подходы для типичных задач.

Основное решение - импортировать модуль math и вызывать нужные функции. Это наиболее эффективно, так как код написан на низком уровне и оптимизирован. Пример - вычисление длины окружности через число Пи:

import math

radius = 5
length = 2 * math.pi * radius
print(length)  # 31.41592653589793

библиотеки для работы с таблицами python (библиотеки для работы с таблицами в python)

Использование math.pi (16 знаков после запятой) даёт достаточную точность для большинства инженерных и научных задач. Встроенные константы math.e, math.tau тоже доступны.

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

Самый прямой путь - math.sqrt(x). Альтернативы: math.pow(x, 0.5) или оператор x ** 0.5. Все они возвращают значение с плавающей точкой.

import math

a = 16
print(math.sqrt(a))   # 4.0
print(a ** 0.5)       # 4.0
print(math.pow(a, 0.5))  # 4.0

математическая библиотека python (математическая библиотека в python)

Ошибки и тонкости: Если x отрицательное, math.sqrt возбудит ValueError, а оператор ** вернёт complex (тип complex). Для работы с комплексными числами нужно импортировать модуль cmath. Также math.pow преобразует результат в float, даже если оба аргумента целые.

Как округлить число: floor, ceil или round?

Округление вниз - math.floor(x) (всегда к меньшему целому). Округление вверх - math.ceil(x). Арифметическое округление - встроенная функция round(x, ndigits) (банковское округление к чётному). Отличаются поведением для отрицательных чисел.

import math

x = -1.6
print(math.floor(x))  # -2 (меньшее)
print(math.ceil(x))   # -1 (большее)
print(round(x))       # -2 (банковское округление)

Типичная ошибка: Путаница между floor и trunc (отбрасывание дробной части). math.trunc(x) то же, что int(x): для -1.6 вернёт -1. Для положительных чисел разницы нет.

Как получить число Пи и экспоненту с разной точностью?

В модуле math определены константы math.pi и math.e. Они имеют тип float (около 15 десятичных цифр). Для произвольной точности используйте модуль decimal с контекстом.

import math
from decimal import Decimal, getcontext

print(math.pi)      # 3.141592653589793
getcontext().prec = 50
pi_big = Decimal('3.14159265358979323846264338327950288419716939937510')
print(pi_big)

Важно: Константы math.pi не являются символическими, это приближённые значения. При сравнении с результатами ручных вычислений могут возникать расхождения из-за двоичного представления float.

Как вычислить синус угла в градусах?

Тригонометрические функции модуля math работают с радианами. Для перевода используйте math.radians(deg). Обратный перевод - math.degrees(rad).

import math

deg = 30
rad = math.radians(deg)
sin_val = math.sin(rad)
print(sin_val)  # 0.49999999999999994

Проблема точности: Из-за округления sin(30°) не равен ровно 0.5. Для критической точности следует использовать math.sin(math.pi/6) или округлить результат.

Как вычислить факториал больших чисел?

math.factorial(n) принимает только целые неотрицательные числа. Для больших n (например, 1000) результат - огромное целое число. Альтернативы: рекурсия или цикл - но встроенная функция быстрее.

import math

print(math.factorial(5))  # 120
# для 1000 функция отработает, но вывод занимает много места

Ошибки: Передача отрицательного числа или float (5.0) вызовет ValueError. Также math.factorial не принимает аргументы с плавающей точкой, даже равные целому.

Как посчитать комбинации и перестановки?

С Python 3.8+ в модуле math есть функции math.comb(n, k) (количество сочетаний) и math.perm(n, k) (количество размещений). Раньше приходилось вычислять через факториал.

import math

# число способов выбрать 2 из 5
print(math.comb(5, 2))  # 10
# число перестановок из 5 по 2
print(math.perm(5, 2))  # 20

Ограничения: Аргументы должны быть целыми числами, k не может превышать n. При выходе за диапазон возбуждается ValueError. Для больших n результат может стать очень большим, но Python поддерживает длинные целые.

Продвинутые примеры использования модуля math

В этом разделе приведены менее очевидные, но полезные функции и приёмы.

Вычисление гипотенузы через math.hypot

Функция math.hypot(x, y) вычисляет длину гипотенузы как sqrt(x*x + y*y), но без риска переполнения при больших x и y. Она принимает любое количество аргументов (начиная с Python 3.8+).

Пример
import math

# расстояние между точками (0,0) и (3,4)
print(math.hypot(3, 4))  # 5.0
# в трёхмерном пространстве
print(math.hypot(1, 2, 2))  # 3.0

Результат:

5.0
3.0

Сравнение чисел с плавающей точкой через math.isclose

Из-за ошибок округления два вычисления одного и того же значения могут дать слегка разные float. math.isclose(a, b, rel_tol, abs_tol) проверяет близость с заданными относительным и абсолютным допусками.

Пример
import math

# сравнение 0.1 + 0.2 == 0.3
print(0.1 + 0.2 == 0.3)  # False
print(math.isclose(0.1 + 0.2, 0.3))  # True
False
True

Пояснение: По умолчанию rel_tol=1e-09 и abs_tol=0.0. Настраивайте под требования.

Нахождение наибольшего общего делителя (НОД) и наименьшего общего кратного (НОК)

math.gcd(a, b) возвращает НОД. С Python 3.9+ появился math.lcm(a, b) для НОК. Для нескольких чисел используйте functools.reduce.

Пример
import math

print(math.gcd(48, 18))  # 6
print(math.lcm(48, 18))  # 144
6
144

Работа с бесконечностью и NaN

Функции math.isinf(x), math.isnan(x), math.isfinite(x) помогают проверять специальные значения.

Пример
import math

inf = float('inf')
nan = float('nan')
print(math.isinf(inf))   # True
print(math.isnan(nan))   # True
print(math.isfinite(1.0)) # True
True
True
True

Манипуляции с плавающей точкой: nextafter и fma

math.nextafter(x, y) возвращает следующее представимое число от x по направлению к y (аналог nextafter в C). Полезно для анализа границ точности. math.fma(x, y, z) (Python 3.13+) выполняет x*y + z с одной операцией с плавающей точкой (без промежуточного округления).

Пример
import math

# ближайшее число после 1.0
print(math.nextafter(1.0, 2.0))  # 1.0000000000000002
# машинное эпсилон
eps = math.nextafter(1.0, 2.0) - 1.0
print(eps)  # 2.220446049250313e-16
1.0000000000000002
2.220446049250313e-16

Специальные функции: гамма-функция и функция ошибок

math.gamma(x) вычисляет гамма-функцию (обобщение факториала для действительных чисел). math.lgamma(x) - натуральный логарифм модуля гаммы (избегает переполнения). math.erf(x) - функция ошибок, math.erfc(x) - дополнительная функция ошибок. Используются в статистике и физике.

Пример
import math

print(math.gamma(5))   # 24.0 (факториал 4)
print(math.lgamma(100)) # логарифм гаммы(100)
print(math.erf(1.0))   # 0.8427007929497149
24.0
359.1342053695754
0.8427007929497149

Произведение последовательности с math.prod

Начиная с Python 3.8, math.prod(iterable, start=1) возвращает произведение элементов. Аналог functools.reduce(operator.mul, ...).

Пример
import math

print(math.prod([1, 2, 3, 4]))  # 24
# с начальным значением
print(math.prod([1, 2, 3], start=10))  # 60
24
60

Комбинаторные вычисления с биномиальными коэффициентами

math.comb(100, 50) вычисляет огромное число (около 1029) точно, без округлений. Используйте для расчётов вероятностей.

Пример
import math

# количество способов выбрать 50 из 100
c = math.comb(100, 50)
print(c)
print(len(str(c)))  # длина числа в десятичной записи
100891344545564193334812497256
29

Математическая библиотека в Python - comments

En
математическая библиотека python (python)