Python math: вычислительные возможности библиотеки
Основные возможности модуля math
Модуль math предоставляет эффективные реализации математических функций и констант, написанные на C. Для работы достаточно импортировать его:
import mathбиблиотека math python (библиотека math для python)
После этого доступны все функции. Этот способ является наиболее производительным для операций с числами с плавающей точкой (float) и охватывает тригонометрию, логарифмы, степени, округление, комбинаторику и другое.import math
x = math.pi
y = math.sin(math.radians(30))
print(y) # 0.5Как вычислить синус угла, заданного в градусах?
Используется сочетание math.sin и math.radians (перевод градусов в радианы). Прямой передачи градусов нет – функция sin ожидает радианы.
import math
angle_deg = 45
rad = math.radians(angle_deg)
result = math.sin(rad)
print(result) # ≈ 0.7071Как округлить число вниз, вверх или отбросить дробную часть?
Для округления вниз (floor), вверх (ceil) и отбрасывания дробной части (trunc) используются одноимённые функции. Встроенная функция round выполняет банковское округление.
import math
x = 3.14159
print(math.floor(x)) # 3
print(math.ceil(x)) # 4
print(math.trunc(x)) # 3
print(round(x, 2)) # 3.14Как вычислить факториал числа без рекурсии?
Готовая функция math.factorial работает быстро и безопасно для целых чисел (до переполнения памяти). Альтернатива – написать цикл, но это медленнее и менее надёжно.
import math
n = 10
print(math.factorial(n)) # 3628800Как найти наибольший общий делитель (НОД) двух чисел?
Используйте math.gcd. Для третьего числа можно применить math.gcd рекурсивно или math.lcm (Python 3.9+) для наименьшего общего кратного.
import math
a, b = 48, 18
print(math.gcd(a, b)) # 6
print(math.lcm(a, b)) # 144Как вычислить квадратный корень, избежав ошибки для отрицательных чисел?
math.sqrt выбрасывает ValueError при отрицательном аргументе. Для комплексных чисел используйте cmath.sqrt. Можно предварительно проверять знак.
import math
try:
result = math.sqrt(-4)
except ValueError:
result = None
print("Ошибка: отрицательный аргумент")
# Для комплексных:
import cmath
print(cmath.sqrt(-4)) # 2jТипичные ошибки:
- DomainError при math.sqrt от отрицательного числа – следует использовать cmath или проверку.
- Переполнение памяти при вычислении факториала очень большого числа (например, 106) – используйте приближённые методы или модуль decimal.
- Неточность при сравнении чисел с плавающей точкой – применяйте math.isclose.
- Путаница между радианами и градусами – всегда конвертируйте через math.radians/math.degrees.
Продвинутые примеры использования модуля math
Дополнительные функции, которые пригодятся в специфических задачах.
1. Сравнение чисел с плавающей точкой - math.isclose учитывает погрешности:
import math
a = 0.1 + 0.2
b = 0.3
print(a == b) # False
print(math.isclose(a, b)) # TrueFalse True
2. Расстояние между точками - math.hypot (евклидова норма) и math.dist (Python 3.8+):
import math
p1 = (3, 4)
p2 = (0, 0)
print(math.hypot(*p1)) # 5.0
print(math.dist(p1, p2)) # 5.05.0 5.0
3. Комбинаторика - math.comb (число сочетаний) и math.perm (число размещений):
import math
n, k = 5, 2
print(math.comb(n, k)) # 10
print(math.perm(n, k)) # 2010 20
4. Произведение элементов - math.prod (аналог sum для умножения):
import math
nums = [2, 3, 5]
print(math.prod(nums)) # 3030
5. Остаток от деления по модулю IEEE 754 - math.remainder (не путать с %):
import math
x = 7.0; y = 3.0
print(math.remainder(x, y)) # 1.0 (остаток симметричный)
print(7 % 3) # 1 (тоже)1.0 1
6. Гамма-функция и функция ошибок - math.gamma и math.erf:
import math
print(math.gamma(5)) # 24.0 (факториал(4))
print(math.erf(1)) # ≈ 0.842724.0 0.8427007929497151
7. Битовое представление чисел - math.frexp (мантисса и экспонента) и math.ldexp (обратная операция):
import math
x = 12.5
m, e = math.frexp(x) # 0.78125, 4
print(m, e)
print(math.ldexp(m, e)) # 12.50.78125 4 12.5
8. Работа со знаком - math.copysign копирует знак второго числа:
import math
print(math.copysign(5, -3)) # -5.0-5.0
9. Проверка специальных значений - math.isfinite, math.isinf, math.isnan:
import math
inf = float('inf')
nan = float('nan')
print(math.isfinite(inf)) # False
print(math.isinf(nan)) # False
print(math.isnan(nan)) # TrueFalse False True