خطای overflow در پایتون

در این مقاله با خطای overflow آشنا خواهید شد و دلیل بروز این خطا را در پایتون خواهید دید. همچنین میبینید که چطور میتوان خطای overflow را مدیریت کرد. خطای overflow زمانی اتفاق میفتد که یک مقدار از محدودیت های نوع داده یا منابع سیستم خود فراتر رود. در اینجا نحوه شناسایی، جلوگیری و رسیدگی به خطای overflow در پایتون توضیح داده شده است.
# خطای Overflow در پایتون
خطای Overflow که به خطای سرریز مشهور است، زمانی اتفاق میفتد که یک عملیات، مقداری خارج از محدوده یک نوع داده ایجاد میکند یا آن مقدار خارج از ظرفیت سخت افزاری سیستم باشد. پایتون با تبدیل خودکار اعداد صحیح بزرگ میتواند از خطای overflow جلوگیری کند اما در حالت هایی ممکن است با خطای سرریز مواجه شوید.
مثلا پایتون از IEEE 754
برای اعداد اعشاری استفاده میکند که گستره محدودی دارد یا در زمان کار با پکیج های خارجی مانند numpy که از نوع داده با مقدار ثابت استفاده میکنند یا در زمان انجام عملیات هایی که به سخت افزار مربوط هستند مانند کار با افزونه های زبان C ممکن است با خطای Overflow مواجه شوید.
دوره پیشنهادی: دوره آموزش numpy پایتون
# چند مثال از خطای Overflow در پایتون
در این بخش چند مثال از زبان پایتون را خواهید دید که باعث ایجاد خطای Overflow میشوند. در کد پایین مقدار اعشاری به قدری بزرگ میشود که باعث ایجاد inf میشود که خطای overflow تولید میکند:
>>> import math
>>> large_value = math.exp(1000) # Causes OverflowError
در پکیجی مانند numpy که نوع داده مشخص است و نمیتوان بیشتر از حد مجاز آنها مقدار ذخیره کرد:
>>> import numpy as np
>>> arr = np.array([2**31 - 1], dtype=np.int32)
>>> result = arr + 1 # Wraps around to a negative value
انجام تابع بازگشتی به تعداد بالا میتواند از محدوده حافظه stack فراتر رود و باعث ایجاد خطا گردد:
>>> def factorial(n):
return 1 if n == 0 else n * factorial(n - 1) factorial(10000)
# RecursionError: maximum recursion depth exceeded
ویدیو پیشنهادی: مدیریت حافظه و ماژول gc در پایتون
# شناسایی و حل خطای Overflow در پایتون
برای حل مشکل overflow در پایتون میتوانید به کارهای مختلفی انجام دهید. معمولا حل خطای overflow کار سختی نیست و با کمی دقت و شناخت انواع داده میتوانید آن را حل کرد. در اینجا چند روش برای حل خطای overflow پیشنهاد شده است.
ماژول math پایتون برای داده های خیلی بزرگ خطای overflow را نمایش خواهد داد که برای حل آن میتوانید، خطا را گرفته و پیغام مناسب نمایش دهید:
>>> import math
>>> try:
>>> result = math.exp(1000)
>>> except OverflowError:
>>> result = float('inf') # Assign infinity print(result)
# Outputs: inf
و یا میتوانید از ماژول decimal پایتون برای دقت بیشتر استفاده کنید:
>>> from decimal import Decimal, Overflow
>>> try:
>>> result = Decimal('1e1000') ** 2
>>> except Overflow:
>>> result = Decimal('Infinity')
>>> print(result) # Outputs: Infinity
در پکیج numpy میتوانید نوع داده بزرگتری انتخاب کنید تا از خطای overflow جلوگیری کنید:
>>> import numpy as np
>>> arr = np.array([2**31 - 1], dtype=np.int64) # Use int64 for larger integers result = arr + 1
# Correctly handled print(result)
برای توابع بازگشتی میتوانید محدودیت سیستم خود را افزایش دهید اما مراقب باشید:
>>> import sys
>>> sys.setrecursionlimit(2000) # Increase limit
یا از حالت iterative استفاده کنید:
>>> def factorial(n):
>>> result = 1
>>> for i in range(1, n + 1):
>>> result *= i
>>> return result
>>> print(factorial(10000))
خطای OverflowError یک استثنای داخلی پایتون است و زمانی رخ میدهد که نتیجه یک عملیات ریاضی برای نمایش در محدوده نوع عددی موجود، بسیار بزرگ باشد. معمولا پایتون با تبدیل اعداد صحیح به نوع داده بزرگتر مانع از خطای overflow میشود اما زمان کار با اعداد اعشاری احتمال برخورد با Overflow وجود دارد.