ویژگی تصویر

معرفی کتابخانه math در پایتون

  /  پایتون   /  کتابخانه math در پایتون
بنر تبلیغاتی الف

کتابخانه math یکی از کتابخانه‌های استاندارد پایتون برای انجام محاسبات ریاضی پایه و پیشرفته است. این ماژول توابعی پرسرعت و مبتنی بر پیاده‌سازی C را برای عملیات عددی، هندسی و آماری ارائه می‌کند. در عمل برای محاسبات اسکالر (تک‌مقداری) بسیار مناسب است و در مقایسه با کتابخانه‌های برداری مانند NumPy برای داده‌های جداگانه سریع‌تر و سبک‌تر عمل می‌کند.

ویژگی‌های کلیدی

  • توابع مثلثاتی و هیپربولیک: sin, cos, tan, sinh, cosh …
  • توابع نمایی و لگاریتمی: exp, log, log2, log10
  • اعداد صحیح و ترکیبیات: factorial, comb, perm
  • توابع کمّی و کمّی-دقیق: fsum برای جمع دقیق‌تر اعداد اعشاری
  • توابع کمّی-پایداری عددی: hypot، frexp، ldexp، modf
  • ثابت‌های آماده: pi, e, tau, inf, nan

فهرست مختصر توابع پرکاربرد

گروهتوابع نمونه
مثلثاتیsin, cos, tan, asin, acos, atan, radians, degrees
نمایی/لگاریتمیexp, log, log2, log10
جمع/ضرب/تجزیهfsum, prod, hypot, frexp, ldexp, modf
اعداد صحیحfactorial, comb, perm
تشخیص مقادیر خاصisfinite, isinf, isnan, isclose

نمونه‌های عملی و نکات فنی

مثال 1: استفاده پایه‌ای از توابع متداول

import math

x = 2.5
print(math.sqrt(x))
print(math.sin(math.radians(30)))
print(math.log(100, 10))  # پایهٔ 10

در این مثال، sqrt برای جذر، radians جهت تبدیل درجه به رادیان و log با مشخص کردن پایه استفاده شده‌اند. توجه کنید math.log(x, base) معادل log(x)/log(base) است اما برای پایه‌های استاندارد توابع جداگانه مثل log2 و log10 وجود دارد.

مثال 2: جمع دقیق اعداد اعشاری (fsum)

import math

vals = [0.1] * 1000
print(sum(vals))       # ممکن است خطا داشته باشد
print(math.fsum(vals)) # جمع دقیق‌تر با الگوریتم Kahan-like

sum معمولی ممکن است به دلیل خطاهای شناوری دقت کامل نداشته باشد. math.fsum از الگوریتم‌هایی استفاده می‌کند که دقت جمع اعداد اعشاری را افزایش می‌دهد و برای جمع مقادیر زیادی از اعداد شناور توصیه می‌شود.

بهینه‌سازی عددی: چرا hypot بهتر است؟

import math

x, y = 1e154, 1e154
# محاسبهٔ فاصلهٔ اقلیدسی
print(math.sqrt(x*x + y*y))  # ممکن است overflow رخ دهد
print(math.hypot(x, y))      # امن‌تر و دقیق‌تر

محاسبهٔ مستقیم sqrt(x*x + y*y) ممکن است باعث سرریز (overflow) شود یا دقت از دست برود. math.hypot به‌صورت عددی پایدارتر و امن‌تر این مقدار را محاسبه می‌کند و برای محاسبهٔ طول بردار در فضای دکارتی توصیه می‌شود.

مثال 3: ترکیبیات و فاکتوریل

import math

n, k = 50, 5
print(math.factorial(n))
print(math.comb(n, k))
print(math.perm(n, k))  # Python 3.8+

math.factorial خروجی را به‌صورت عدد صحیح دقیق (big int) محاسبه می‌کند، بنابراین برای n بزرگ نیز جواب دقیق خواهید داشت. از math.comb و math.perm برای محاسبهٔ ترکیب و جایگشت با کارایی بالا استفاده کنید — سریع‌تر و خواناتر از پیاده‌سازی دستی.

مقایسه با کتابخانه‌های دیگر

وقتی با بردارها یا آرایه‌های بزرگ کار می‌کنید، NumPy سرعت بهتری ارائه می‌دهد و توابع برداری را فراهم می‌کند. اما برای مقادیر منفرد (scalars) یا توابع خاص ریاضی، math معمولاً سریع‌تر و کم‌حجم‌تر است. برای اعداد مختلط از ماژول cmath استفاده کنید. اگر دقت ده‌دهی مهم است (محاسبات مالی)، ماژول decimal یا fractions مناسب‌تر است.

تفاوت‌های مهم

  • math: توابع اسکالر سریع و بر پایهٔ IEEE 754
  • cmath: توابع برای اعداد مختلط
  • numpy: عملیات برداری و آرایه‌ای بر روی داده‌های بزرگ
  • decimal/fractions: دقت ده‌دهی یا نسبت صحیح به جای اعشاری شناور

نکات ایمنی و خطاها

  • توابعی مثل sqrt برای مقادیر منفی ValueError می‌دهند (برای اعداد مختلط از cmath استفاده کنید).
  • math.pow همیشه عددی شناور برمی‌گرداند؛ برای توان صحیح از عملگر ** استفاده کنید یا pow با سه آرگومان مد نظر قرار دهید.
  • برای مقایسهٔ اعداد شناور از math.isclose استفاده کنید و به پارامترهای rel_tol و abs_tol توجه کنید.
  • برخی توابع ممکن است OverflowError یا ValueError برگردانند؛ از math.isfinite پیش از عملیات حساس استفاده کنید.

مثال: استفادهٔ هوشمندانه از isclose

import math

a = 0.1 + 0.2
b = 0.3
print(a == b)                    # False به دلیل خطای شناوری
print(math.isclose(a, b, rel_tol=1e-9))

برای مقایسهٔ دقیق‌تر اعداد شناور، از math.isclose استفاده کنید که به شما امکان تعیین تلرانس نسبی و مطلق می‌دهد.

نکات پیشرفته و راهنمایی‌های عملکردی

  • اگر تابعی را در حلقهٔ سنگین فراخوانی می‌کنید، اشاره‌گر تابع را به متغیر محلی اختصاص دهید تا هزینهٔ جستجوی نام کاهش یابد: fn = math.sin; سپس fn(x).
  • از توابع عددی پایدار مثل hypot و fsum برای جلوگیری از خطاهای عددی استفاده کنید.
  • برای محاسبات برداری، تبدیل به NumPy ارجح است؛ اما برای محاسبات اسکالر math سبک‌تر است.
  • آگاه باشید که برخی توابع نسخه‌های جدید پایتون را می‌خواهند (مثلاً math.prod، math.comb، math.perm در نسخه‌های اخیر اضافه شده‌اند).

خلاصه و بهترین کاربردها

کتابخانه math مناسب برای:

  • محاسبات ریاضی پایه و توابع علمی در کدهای کلی
  • پردازش اسکالر با نیاز به عملکرد بالا
  • حالاتی که دقت جمع یا محاسبات عددی اهمیت دارد (با fsum و hypot)

برای آرایه‌ها و محاسبات برداری از NumPy و برای اعداد مختلط از cmath استفاده کنید. در نهایت، شناخت توابع کمّی-پایدار و تفاوت‌های رفتاری (مثل math.pow vs **) کمک می‌کند کدهای دقیق‌تر و کارآمدتری بنویسید.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: