پایتون برای اجرای عملیات ریاضی پایه، عملگرها و توابع درونی مختلفی مانند تابع sum دارد. با این حال، وقتی به عملیات ریاضی پیشرفتهتر و پیادهسازی فرمولهای محاسباتی نیاز دارید، این قابلیتهای پایه کافی نیستند و ماژول استاندارد math به کمک شما میآید.
تسلط بر ماژولهای استانداردی مانند math، یکی از گامهای کاربردی در مسیر آموزش پایتون برای حل مسائل محاسباتی و مهندسی است. در این راهنما، نحوه فراخوانی این ماژول، ثابتهای ریاضی و کاربرد توابع مختلف آن را همراه با مثال بررسی میکنیم.
ماژول math در پایتون چیست و چه کاربردی دارد؟
ماژول math بخشی از کتابخانه استاندارد پایتون است و با آن به توابع و ثابتهای ریاضی رایج در این زبان دسترسی دارید.
بیشتر توابع این ماژول، پوششهایی (wrappers) برای توابع کتابخانه ریاضی استاندارد زبان C در پلتفرم هستند. این پوششها امکان استفاده از توابع ریاضی تعریفشده در استاندارد C را در آموزش برنامهنویسی پایتون فراهم میکنند. مقدار بازگشتی یا خروجی همه توابع این ماژول از نوع عدد اعشاری (float) است، مگر در مواردی که بهطور مشخص استثنا شدهاند.
نحوه فراخوانی ماژول math
math از ماژولهای کتابخانه استاندارد پایتون است؛ بنابراین برای دسترسی به آن نیازی به اجرای دستورات نصب ماژول ندارید. برای افزودن این کتابخانه به برنامه و استفاده از توابع ریاضی آن، کافی است دستور import در پایتون را در ابتدای کد خود بنویسید:
import math
پس از اجرای این خط، با نوشتن پیشوند math. به توابع و ثابتهای ریاضی ماژول دسترسی خواهید داشت.
محدودیت کار با اعداد مختلط و تفاوت با cmath
توابع ماژول math از اعداد مختلط (Complex Numbers) پشتیبانی نمیکنند. این تفکیک به این دلیل است که بیشتر کاربران به محاسبات اعداد مختلط نیازی ندارند. بنابراین، اگر ناخواسته یک عدد مختلط را بهعنوان ورودی به توابع math بدهید، برنامه به جای تولید خروجی مختلط، خطا (Exception) برمیگرداند. این رفتار کمک میکند برنامهنویس سریعتر مشکل را تشخیص دهد و بررسی کند که این مقدار ناخواسته چگونه و چرا در کد ایجاد شده است.

اگر در پروژه خود به محاسبات روی اعداد مختلط نیاز دارید، میتوانید از ماژول استاندارد cmath استفاده کنید. این ماژول توابعی همنام با توابع math دارد که از اعداد مختلط پشتیبانی میکنند.
ثابتهای ریاضی در ماژول math
ماژول math چند مقدار ثابت پرکاربرد دارد تا در محاسبات و آموزش ریاضی با کد، نیازی به حفظ کردن و نوشتن دستی اعداد اعشاری طولانی، مانند عدد پی در پایتون، نداشته باشید.
ثابتهای این ماژول و مقدار تقریبی آنها در جدول زیر آمدهاند:
| نام ثابت | مقدار تقریبی | توضیح |
|---|---|---|
| math.pi | 3.141592… | ثابت ریاضی پی ( [فرمول] ) |
| math.e | 2.718281… | عدد نپر یا پایه لگاریتم طبیعی ( [فرمول] ) |
| math.tau | 6.283185… | ثابت تاو ( [فرمول] ) که برابر با [فرمول] (نسبت محیط دایره به شعاع آن) است |
| math.inf | inf | مقدار اعشاری بینهایت مثبت (Positive infinity) |
| math.nan | nan | مقدار اعشاری «عدد نیست» یا نامعتبر (Not a Number) |
این مقادیر تابع نیستند و هنگام استفاده به پرانتز نیاز ندارند. قطعه کد زیر نحوه دسترسی به آنها و چاپ هر مقدار را نشان میدهد:
import math
print(math.pi) # 3.141592...
print(math.e) # 2.718281...
print(math.tau) # 6.283185...
print(math.inf) # inf
print(math.nan) # nan
توابع گرد کردن و محاسبات پایه اعشاری
ماژول math برای آموزش محاسبات عددی ممیز شناور و کار با بخش اعشاری اعداد، مجموعهای از توابع دارد. با این توابع میتوانید اعداد اعشاری را به سمت بالا، پایین یا صفر گرد کنید. همچنین میتوانید بخش صحیح و اعشاری را از هم جدا کنید و باقیمانده تقسیم اعداد اعشاری را با دقت بالا به دست آورید.
گرد کردن اعداد با ceil، floor و trunc
ماژول math سه تابع برای حذف اعشار و تبدیل عدد به مقدار صحیح دارد. تفاوت این توابع در جهت گرد کردن عدد است:

- math.ceil(x) (سقف): کوچکترین عدد صحیح بزرگتر یا مساوی x را برمیگرداند؛ یعنی عدد را رو به بالا گرد میکند.
- math.floor(x) (کف): بزرگترین عدد صحیح کوچکتر یا مساوی x را برمیگرداند؛ یعنی عدد را رو به پایین گرد میکند.
- math.trunc(x) (برش): بخش اعشاری را حذف میکند و فقط قسمت صحیح را نگه میدارد. این تابع عدد را به سمت صفر گرد میکند؛ بنابراین عملکرد آن برای اعداد مثبت معادل floor() و برای اعداد منفی معادل ceil() است.
هنگام کار با اعداد منفی، تفاوت عملکرد این سه تابع مشخص میشود:
import math
# گرد کردن اعداد مثبت
print(math.ceil(4.7)) # خروجی: 5
print(math.floor(4.7)) # خروجی: 4
print(math.trunc(4.7)) # خروجی: 4
# گرد کردن اعداد منفی
print(math.ceil(-4.7)) # خروجی: -4
print(math.floor(-4.7)) # خروجی: -5
print(math.trunc(-4.7)) # خروجی: -4
قدر مطلق، بیشینه، کمینه و تفکیک بخش صحیح و اعشاری
برای کار دقیقتر با اعداد اعشاری (float)، میتوانید از توابع زیر در ماژول math استفاده کنید:
- تابع fabs(x): قدر مطلق عدد x را محاسبه میکند و خروجی را بهصورت اعشاری برمیگرداند.
- تابع modf(x): بخش اعشاری و صحیح عدد x را جدا میکند و بهصورت یک جفت مقدار برمیگرداند. هر دو مقدار از نوع float هستند و علامت x را دارند.
- توابع fmax(x, y) و fmin(x, y): بهترتیب بزرگترین و کوچکترین مقدار را بین دو عدد اعشاری برمیگردانند. این دو تابع که در پایتون ۳.۱۵ اضافه شدهاند، مقادیر NaN را داده ناموجود در نظر میگیرند. اگر هر دو ورودی NaN باشند، خروجی آنها nan است.
- تابع fma(x, y, z): عبارت [فرمول] را تنها با یک بار گرد کردن در انتها محاسبه میکند. این روش اغلب دقت بیشتری نسبت به نوشتن مستقیم عبارت دارد. این تابع از پایتون ۳.۱۳ در دسترس قرار گرفته است.
import math
print(math.fabs(-12.5)) # 12.5
print(math.modf(-12.5)) # (-0.5, -12.0)
print(math.fma(2.0, 3.0, 4.0)) # 10.0 (در پایتون 3.13 به بالا)
محاسبه باقیمانده؛ تفاوت fmod و remainder با عملگر %
عملگر درونی % و توابع ماژول math در محاسبه باقیمانده تقسیم دو عدد، رفتار متفاوتی دارند. تابع math.fmod(x, y) باقیمانده تقسیم را بر اساس استاندارد و ویژگیهای آموزش زبان برنامهنویسی C محاسبه میکند. علامت خروجی این تابع با علامت مقسوم (x) یکسان است. در مقابل، عبارت x % y در پایتون نتیجهای با علامت مقسومعلیه (y) برمیگرداند.

تفاوت دیگر، حفظ دقت هنگام کار با اعداد اعشاری بسیار کوچک یا بزرگ است. برای مثال، خروجی math.fmod(-1e-۱۰۰, 1e100) برابر با -1e-۱۰۰ است؛ اما عبارت -1e-۱۰۰ % 1e100 در پایتون، به دلیل محدودیت نمایش دقیق اعشار، پس از گرد کردن عدد دور از انتظار 1e100 را برمیگرداند. به همین دلیل، برای اعداد صحیح (int) استفاده از عملگر % و برای اعداد اعشاری (float) استفاده از تابع fmod ترجیح دارد.
تابع math.remainder(x, y) نیز از نسخه ۳.۷ پایتون بر اساس استاندارد IEEE ۷۵۴ ارائه شده است. این تابع مقدار [فرمول] را طوری محاسبه میکند که [فرمول] نزدیکترین عدد صحیح به خارجقسمت دقیق تقسیم [فرمول] باشد. در حالت وسط، عدد صحیح زوج انتخاب میشود. روی پلتفرمهای مبتنی بر IEEE ۷۵۴ نیز نتیجه این تابع خطای گرد کردن ندارد.
import math
print(math.fmod(-1e-100, 1e100)) # -1e-100
print(-1e-100 % 1e100) # 1e+100
توابع توان، رادیکال و لگاریتم در پایتون
برای پیادهسازی فرمولهای جبری در کد، به ابزارهایی فراتر از عملگرهای پایه نیاز دارید. ماژول math توابع آمادهای دارد که با خروجی اعشاری (float)، توان در پایتون، رادیکال در پایتون، عبارات نمایی و لگاریتم در پایههای مختلف را مستقیم محاسبه میکنند.
محاسبه توان و ریشه (pow، sqrt و cbrt)
تابع math.pow(x, y) هر دو آرگومان خود را به نوع float تبدیل میکند، عدد x را به توان y میرساند و نتیجه را بهصورت اعشاری برمیگرداند.
برای ریشهگیری مستقیم، این ماژول دو تابع جداگانه دارد:
- math.sqrt(x): ریشه دوم (جذر) عدد x را محاسبه میکند.
- math.cbrt(x): ریشه سوم عدد x را برمیگرداند.
import math
# محاسبه 150 به توان 4
print(math.pow(150, 4)) # 506250000.0
# محاسبه ریشه دوم (جذر) و ریشه سوم
print(math.sqrt(25)) # 5.0
print(math.cbrt(27)) # 3.0
توابع نمایی و لگاریتمی (exp و خانواده log)
ماژول math برای محاسبات نمایی سه تابع دارد:
- exp(x): عدد نپر ( [فرمول] ) را به توان x میرساند ( [فرمول] ).
- exp2(x): عدد ۲ را به توان x میرساند ( [فرمول] ).
- expm1(x): مقدار [فرمول] را محاسبه میکند.
برای محاسبات لگاریتمی نیز میتوانید از توابع زیر استفاده کنید:
- log(x, base): لگاریتم x را در پایه مشخصشده (base) برمیگرداند. اگر پایه را وارد نکنید، تابع بهصورت پیشفرض لگاریتم طبیعی را بر پایه [فرمول] محاسبه میکند.
- log1p(x): لگاریتم طبیعیِ عبارت [فرمول] را بر پایه [فرمول] حساب میکند.
- log2(x) و log10(x): بهترتیب لگاریتم x را در مبنای ۲ و مبنای ۱۰ برمیگردانند.
import math
# توابع نمایی
print(math.exp(2))
print(math.exp2(3)) # 8.0
print(math.expm1(1e-5)) # 1.0000050000166668e-05
# توابع لگاریتمی
print(math.log(math.e)) # 1.0 (پایه پیشفرض e)
print(math.log(8, 2)) # 3.0 (لگاریتم ۸ در پایه ۲)
print(math.log1p(1e-5))
print(math.log2(8)) # 3.0
print(math.log10(100)) # 2.0
توابع مثلثاتی و تبدیل زاویه در ماژول math
ماژول math توابع استاندارد محاسبات مثلثاتی و معکوس آنها را دارد. هنگام کار با این توابع، باید به واحد اندازهگیری زاویه توجه کنید؛ زیرا آنها زاویه را برحسب رادیان دریافت میکنند و برمیگردانند.
تبدیل درجه به رادیان و برعکس (radians و degrees)
ورودی توابع مثلثاتی این ماژول برحسب رادیان است. بنابراین، اگر زاویه مورد نظر شما برحسب درجه باشد، باید پیش از ارسال آن به توابع مثلثاتی، واحد زاویه را تبدیل کنید.
ماژول math برای تبدیل واحدهای زاویه به یکدیگر دو تابع دارد:
- تابع math.radians(x): زاویه x را از درجه به رادیان تبدیل میکند.
- تابع math.degrees(x): زاویه x را از رادیان به درجه برمیگرداند.
import math
# تبدیل ۶۰ درجه به رادیان
rad = math.radians(60)
print(rad)
# تبدیل عدد پی (رادیان) به درجه
deg = math.degrees(math.pi)
print(deg) # 180.0
محاسبه سینوس، کسینوس، تانژانت و معکوس آنها
توابع sin(x)، cos(x) و tan(x) در این ماژول بهترتیب سینوس، کسینوس و تانژانت زاویه x (برحسب رادیان) را برمیگردانند و برای محاسبه نسبتهای اصلی مثلثاتی به کار میروند. برای مثال، تانژانت ۶۰ رادیان و همچنین سینوس و کسینوس زاویه ۶۰ درجه را به شکل زیر محاسبه میکنیم:

import math
# محاسبه تانژانت 60 رادیان
print(math.tan(60))
# محاسبه سینوس و کسینوس (با تبدیل 60 درجه به رادیان)
angle_rad = math.radians(60)
print(math.sin(angle_rad))
print(math.cos(angle_rad))
توابع معکوس مثلثاتی نیز برای یافتن زاویه برحسب رادیان، از روی نسبت مثلثاتی، به صورت زیر تعریف شدهاند:
- asin(x): محاسبه آرکسینوس x
- acos(x): محاسبه آرککسینوس x
- atan(x): محاسبه آرکتانژانت x
- atan2(y, x): محاسبه atan(y / x) برحسب رادیان، با در نظر گرفتن علامت هر دو ورودی برای تعیین ربع صحیح زاویه
import math
print(math.asin(0.5))
print(math.acos(0.5))
print(math.atan(1))
print(math.atan2(1, 1))
توابع جمع، ضرب و محاسبه فاصله
برای انجام عملیات جمع، ضرب و محاسبات هندسی روی مجموعههای تکرارپذیر (Iterables)، میتوانید از این توابع ماژول math استفاده کنید:

- fsum(iterable): مجموع مقادیر اعشاری موجود در مجموعه ورودی را با دقت بالا محاسبه میکند.
- prod(iterable, *, start=۱): حاصلضرب تمام عناصر مجموعه ورودی را با احتساب مقدار شروع پیشفرض ۱ (start) برمیگرداند.
- sumprod(p, q): مجموع حاصلضرب مقادیر متناظر از دو مجموعه تکرارپذیر p و q را محاسبه میکند.
- dist(p, q): فاصله اقلیدسی بین دو نقطه p و q را برمیگرداند. مختصات این نقطهها بهصورت دنباله یا مجموعه تکرارپذیر داده شده است.
- hypot(*coordinates): نرم اقلیدسی، یا طول وتر در حالت دوبعدی، را برای مختصات ورودی محاسبه میکند.
توابعی مانند fsum و prod برای مجموعههای تکرارپذیر معمولی کاربرد دارند. قطعه کد زیر نحوه کار با این توابع را نشان میدهد:
import math
numbers = [0.1, 0.2, 0.3]
print(math.fsum(numbers)) # خروجی: 0.6
print(math.prod([2, 3, 4])) # خروجی: 24
print(math.sumprod([1, 2], [3, 4])) # خروجی: 11
# محاسبه فاصله اقلیدسی و وتر
print(math.dist([0, 0], [3, 4])) # خروجی: 5.0
print(math.hypot(3, 4)) # خروجی: 5.0
بررسی وضعیت و مقایسه دقیق اعداد اعشاری
اعداد اعشاری (float) در پایتون معمولاً حداکثر ۵۳ بیت دقت دارند و گاهی هنگام نمایش دقیق مقادیر، خطای گرد کردن رخ میدهد. در محاسبات ریاضی نیز ممکن است با مقادیری مانند بینهایت یا NaN روبهرو شوید. ماژول math برای مقایسه دقیق اعداد و بررسی وضعیت این مقادیر، توابع ویژهای دارد.
مقایسه دو عدد اعشاری با isclose
تابع math.isclose(a, b, *, rel_tol=1e-۰۹, abs_tol=۰.۰) برای بررسی برابری تقریبی دو مقدار در پایتون ۳.۵ و نسخههای بعد از آن معرفی شده است. این تابع نزدیک بودن دو مقدار a و b را بررسی میکند و خروجی True یا False برمیگرداند.

معیار نزدیک بودن دو عدد، رابطه abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol) است که دو پارامتر زیر را دارد:
- rel_tol (تلورانس نسبی): حداکثر اختلاف مجاز بین a و b نسبت به عددی است که قدر مطلق بزرگتری دارد. مقدار پیشفرض این پارامتر 1e-۰۹ است و یکسان بودن دو مقدار را تا حدود ۹ رقم دهدهی تضمین میکند. مثلاً برای تلورانس ۵ درصدی، مقدار ۰.۰۵ را وارد میکنیم. این پارامتر باید غیرمنفی و کوچکتر از ۱.۰ باشد.
- abs_tol (تلورانس مطلق): مقدار پیشفرض آن ۰.۰ است و باید غیرمنفی باشد. هنگام مقایسه یک عدد با ۰.۰، فرمول با تلورانس پیشفرض برای هر عدد غیرصفری خروجی False میدهد. بنابراین، برای مقایسه با صفر باید یک مقدار مثبت مناسب برای abs_tol تعیین کنید.
import math
# مقایسه با تلورانس نسبی پیشفرض (۹ رقم دهدهی)
print(math.isclose(1.000000001, 1.0)) # True
# مقایسه با 0.0 نیازمند تعیین abs_tol است
print(math.isclose(1e-10, 0.0)) # False
print(math.isclose(1e-10, 0.0, abs_tol=1e-09)) # True
تابع isclose مقدار NaN را به هیچ عددی، حتی خودش، نزدیک در نظر نمیگیرد. مقادیر inf و -inf نیز فقط به خودشان نزدیک هستند.
بررسی بینهایت، NaN و دستکاری اعداد اعشاری
توابع زیر در ماژول math وضعیت اعداد اعشاری را بررسی میکنند و خروجی بولین (True یا False) برمیگردانند:
- isfinite(x): بررسی میکند که آیا x یک عدد متناهی است؛ یعنی نه بینهایت است و نه NaN. عدد ۰.۰ نیز متناهی است.
- isinf(x): اگر x بینهایت مثبت یا منفی باشد، مقدار True برمیگرداند.
- isnan(x): مشخص میکند که آیا مقدار ورودی NaN (نامعتبر) است یا خیر.
- signbit(x): منفی بودن علامت x را بررسی میکند و در صورت منفی بودن، True برمیگرداند.
- isnormal(x) و issubnormal(x): بهترتیب برای بررسی نرمال یا غیرنرمال (Subnormal) بودن یک عدد متناهی غیرصفر کاربرد دارند. این دو تابع در پایتون ۳.۱۵ اضافه شدهاند.
برای دستکاری مستقیم ساختار داخلی اعداد ممیز شناور نیز توابع زیر ارائه شدهاند:
- copysign(x, y): قدر مطلق عدد x را با علامت عدد y بهصورت float برمیگرداند.
- frexp(x): مانتیس و توان x را به شکل یک جفت مقدار (m, e) برمیگرداند. اگر x عددی متناهی و غیرصفر باشد، رابطه دقیق [فرمول] با [فرمول] برقرار است؛ در غیر این صورت، تابع (x, ۰) را برمیگرداند.
- ldexp(x, i): در اساس معکوس تابع frexp است و مقدار [فرمول] را محاسبه میکند.
- nextafter(x, y, steps=۱): مقدار ممیز شناور به اندازه steps گام بعد از عدد x به سمت عدد y را برمیگرداند.
- ulp(x): ارزش کماهمیتترین بیت (Least Significant Bit) عدد اعشاری x را برمیگرداند.
نگاهی به توابع هذلولوی و توابع خاص
ماژول math برای کاربردهای آماری و آموزش ریاضی مهندسی، توابع هذلولوی (Hyperbolic) و توابع خاص دارد. این توابع آماده، برنامهنویس را از پیادهسازی دستی الگوریتمها با حلقه یا تابع بازگشتی در پایتون بینیاز میکنند.
| دستهبندی | نام تابع | کاربرد |
|---|---|---|
| توابع هذلولوی | sinh(x)، cosh(x)، tanh(x) | محاسبه سینوس، کسینوس و تانژانت هذلولوی x |
| معکوس هذلولوی | asinh(x)، acosh(x)، atanh(x) | محاسبه معکوس سینوس، کسینوس و تانژانت هذلولوی x |
| توابع خاص | erf(x) | محاسبه تابع خطا (Error function) در نقطه x |
| توابع خاص | erfc(x) | محاسبه تابع مکمل خطا در نقطه x |
| توابع خاص | gamma(x) | محاسبه تابع گاما در نقطه x |
| توابع خاص | lgamma(x) | لگاریتم طبیعی قدر مطلق تابع گاما در نقطه x |
مثال کاربردی؛ محاسبه مساحت چندضلعی منتظم با ماژول math
برای پیادهسازی فرمول ریاضی [فرمول] با مقادیر N = ۶ و L = ۲۰، میتوانیم توابع math.pow و math.tan را همراه با ثابت math.pi به شکل زیر به کار ببریم:

import math
N = 6
L = 20
# جایگذاری مقادیر در فرمول
area = (N * math.pow(L, 2)) / (4 * math.tan(math.pi / N))
print(area)
مقدار بازگشتی توابع math.pow و math.tan از نوع عدد اعشاری (float) است؛ بنابراین نتیجه نهایی این عبارت نیز یک عدد اعشاری خواهد بود.