Модуль math: функции и примеры применения
Основные возможности модуля math
Модуль math в Python предоставляет доступ к математическим функциям и константам, определённым на уровне C. Для начала работы его необходимо импортировать:
import mathкоманды math python (команды модуля math в python)
После импорта становятся доступны такие константы, как math.pi (число π) и math.e (основание натурального логарифма). Основные функции включают арифметические, тригонометрические, логарифмические и специальные операции.
print(math.pi) # 3.141592653589793
print(math.e) # 2.718281828459045
print(math.sqrt(16)) # 4.0
print(math.sin(math.pi/2)) # 1.0Aiogram python (создание бота на aiogram (асинхронный telegram бот))
Такой подход является наиболее прямым и эффективным для стандартных математических вычислений.
Как округлить число вниз или вверх?
Для округления вниз применяется math.floor(x), а вверх - math.ceil(x). Встроенная функция round(x, n) выполняет банковское округление до n знаков после запятой.
import math
x = 3.7
print(math.floor(x)) # 3
print(math.ceil(x)) # 4
print(round(x, 0)) # 4.0 (но зависит от версии Python)библиотека имен python (библиотека имен в python)
Выбор метода зависит от требований к округлению: floor и ceil всегда округляют в строгую сторону, round может давать неожиданные результаты для чисел, заканчивающихся на .5.
Типичная ошибка: попытка передать в math.floor строку или список. Функции модуля math ожидают числовые аргументы (int или float). Решение - предварительно преобразовать данные с помощью float() или int().
# Ошибка: math.floor('3.7') -> TypeError
# Корректно:
value = float('3.7')
print(math.floor(value)) # 3Python pandas типы данных (типы данных pandas в python)
Как вычислить квадратный корень и степень?
Квадратный корень - math.sqrt(x). Возведение в степень - math.pow(x, y) или оператор ** x**y. Функция pow может быть удобнее для работы с модулем.
print(math.sqrt(25)) # 5.0
print(math.pow(2, 10)) # 1024.0
print(2**10) # 1024
print(math.pow(16, 0.5)) # 4.0 (квадратный корень через степень)
Для вычисления гипотенузы по двум катетам используется math.hypot(x, y).
Ошибка: math.sqrt(-1) вызывает ValueError: math domain error. Для работы с комплексными числами необходим модуль cmath.
import cmath
print(cmath.sqrt(-1)) # 1j
Как использовать тригонометрические функции?
Все тригонометрические функции модуля math принимают и возвращают значения в радианах. Для преобразования между градусами и радианами служат math.radians(deg) и math.degrees(rad).
angle_deg = 45
angle_rad = math.radians(angle_deg)
print(math.sin(angle_rad)) # ~0.7071067811865475
print(math.cos(angle_rad)) # ~0.7071067811865476
print(math.tan(angle_rad)) # ~1.0
Доступны также обратные функции: math.asin, math.acos, math.atan и math.atan2(y, x).
Как вычислить логарифм и экспоненту?
Натуральный логарифм - math.log(x), логарифм по основанию b - math.log(x, b). Десятичный логарифм - math.log10(x), двоичный - math.log2(x). Экспонента - math.exp(x) (e^x).
print(math.log(10)) # 2.302585092994046
print(math.log(100, 10)) # 2.0
print(math.log10(100)) # 2.0
print(math.exp(2)) # 7.38905609893065
Ошибка: math.log(0) вызывает ValueError: math domain error. Аргумент должен быть положительным. Для x=0 результат стремится к минус бесконечности, но модуль math не умеет возвращать -inf? На самом деле math.log(0) даёт ValueError. Используйте float('-inf') при необходимости.
Как получить факториал и число сочетаний?
Факториал целого неотрицательного числа - math.factorial(n). Число сочетаний (биномиальный коэффициент) - math.comb(n, k) (доступно с Python 3.8).
print(math.factorial(5)) # 120
print(math.comb(10, 3)) # 120
Для перестановок используется math.perm(n, k).
Проблема: передача отрицательного числа в math.factorial приводит к ValueError. Только неотрицательные целые.
Расширенные примеры использования модуля math
Расчёт площади круга через разные константы
import math
radius = 5
area = math.pi * math.pow(radius, 2)
print(f"Площадь круга радиусом {radius} равна {area:.2f}")
Площадь круга радиусом 5 равна 78.54
Моделирование синусоидального сигнала
import math
def sine_wave(amplitude, frequency, phase, duration, sample_rate=100):
samples = []
for i in range(int(duration * sample_rate)):
t = i / sample_rate
value = amplitude * math.sin(2 * math.pi * frequency * t + phase)
samples.append(round(value, 3))
return samples
signal = sine_wave(1, 5, 0, 0.2)
print(signal[:10])
[0.0, 0.309, 0.588, 0.809, 0.951, 1.0, 0.951, 0.809, 0.588, 0.309]
Нахождение корней квадратного уравнения с проверкой дискриминанта
import math
def quadratic_roots(a, b, c):
d = b*b - 4*a*c
if d < 0:
return None, None # комплексные корни не рассматриваем
sqrt_d = math.sqrt(d)
x1 = (-b + sqrt_d) / (2*a)
x2 = (-b - sqrt_d) / (2*a)
return x1, x2
print(quadratic_roots(1, -3, 2)) # (2.0, 1.0)
(2.0, 1.0)
Использование гиперболических функций для описания цепной линии
import math
# Координаты точки на цепной линии: y = a * cosh(x/a)
a = 2
x = 1.5
y = a * math.cosh(x / a)
print(f"При a={a}, x={x} -> y={y:.4f}")
При a=2, x=1.5 -> y=2.3249
Работа с бесконечностью и NaN
import math
# Проверка на бесконечность
print(math.isinf(float('inf'))) # True
print(math.isinf(1e300)) # False
# Проверка на NaN
nan_value = float('nan')
print(math.isnan(nan_value)) # True
# Константы бесконечности (но лучше использовать float)
print(math.inf) # inf
print(math.nan) # nan
True False True inf nan
Вычисление факториала больших чисел и сравнение с рекурсией
import math
import time
# Используем math.factorial
start = time.time()
result = math.factorial(100)
print(f"math.factorial: {time.time()-start:.6f} сек, длина результата {len(str(result))} цифр")
# Рекурсивный факториал (для сравнения)
def rec_fact(n):
if n == 0:
return 1
return n * rec_fact(n-1)
start = time.time()
result2 = rec_fact(100)
print(f"Рекурсивный: {time.time()-start:.6f} сек, длина {len(str(result2))} цифр")
math.factorial: 0.000010 сек, длина результата 158 цифр Рекурсивный: 0.000555 сек, длина 158 цифр
Вычисление НОД и НОК с помощью math.gcd и math.lcm
import math
a, b = 48, 18
print("НОД:", math.gcd(a, b)) # 6
print("НОК:", math.lcm(a, b)) # 144 (доступно с Python 3.9)
НОД: 6 НОК: 144