کتابخانه 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-likesum معمولی ممکن است به دلیل خطاهای شناوری دقت کامل نداشته باشد. 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 **) کمک میکند کدهای دقیقتر و کارآمدتری بنویسید.
آیا این مطلب برای شما مفید بود ؟




