الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

خطأ غريب في بايثون

بدأه مبتدى بايثون في 8 أكتوبر 2013 · 12 رد · 661 مشاهدة · في لغة Python
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته 

 

خطأ عند تنفيذ سكربت بسيط كتبنه باليايثون 

 

نص الخطأ:

------------------------------------------------------------------------------------------------

<line 6 , in <module
c=a/b
overflowerror:integer division result too large a float
-----------------------------------------------------------------------------------------------
 
الترجمة : خطأ بسبب قسمة عدد صحيح كبير جداً
 
السؤال: هل يوجد حل أو دالة أستخدمها لحل هذه المشكلة 
#2

حول الكل ل float وريح دماغك

(map share people)

فضلا لاتقم بمراسلتي من أجل أسئلة لها أقسامها في المنتدى حتى تعم الفائدة على الجميع وللحصول على إجابات أفضل من أعضاء أكثر خبرة.
Weblog
@bitbucket
@xmonader

#3

شكراً لك فعلاً ضبط البرنامج بعد ماحولت المتغير إلى float لكن المشكلة أني معتمد في البرنامج على أن يكون المتغير int و عندما وضعت المتغير float صار لا بد أغير هذا السطر if  c == int c إلى  float  و إلا بيعطي المفسر خطأ , و أنا معتمد على هذا السطر في البرنامج

تم تعديل هذه المشاركة بواسطة مبتدى بايثون في 8 أكتوبر 2013 في 07:53

#4

تستطيع في النهاية التحويل  ل int .. مالمشكلة!؟

(map share people)

فضلا لاتقم بمراسلتي من أجل أسئلة لها أقسامها في المنتدى حتى تعم الفائدة على الجميع وللحصول على إجابات أفضل من أعضاء أكثر خبرة.
Weblog
@bitbucket
@xmonader

#5

نص الخطأ :

Tracback (most recent call last):
file "c\users\DELL\Desktop\Project.py" , line 7, in (module)
      if (c) == int (c):
overflowerror: cannot convert float infinity to integer

تم تعديل هذه المشاركة بواسطة مبتدى بايثون في 8 أكتوبر 2013 في 10:01

#6

يا شباب في حل لهذه المشكلة ؟

#7

أكتب الكود هنا للتحليل وسأعطيك نماذج مشابهة له وانت اصلح الخطأ

Untitled-18.jpg

#8

الكود بسيط جداً 

a=int (input())
b=int (input())
c=a/b
if (c) == int (c):
 print (c)
#9

ضع test case بمثال على الأرقام التي تظهر فيها الخطأ بدل int (input()).

 

عموماً إذا كنت تحاول استخدام ارقام كبيرة فهناك حدود للأرقام لايستطيع المعالج أو المفسر تعديها، مثلاً لدي الرقم  1.7976931348623157e+308 (أقصى رقم يمكن التعامل معه في كمبيوتري) لو ضربته في 2 سيعطي لانهاية:

>>> sys.float_info.max
1.7976931348623157e+308
>>> sys.float_info.max * 2
inf
>>> int(sys.float_info.max * 2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OverflowError: cannot convert float infinity to integer
>>>

الرقم الناتج ليس لانهاية حقيقية لكنه كبير حتى تتعامل معه. في مثل هذه الحالات عند التعامل مع أرقام الفاصلة العائمة الكبيرة أو الصغيرة جداً لابد من استخدام طريقة أخرى مثل مكتبة decimal.Decimal أو مكتبة خارجية مخصصة للأرقام الكبيرة:

>>> import decimal
>>>
>>> decimal.Decimal('1.7976931348623157e+308') * 2
Decimal('3.5953862697246314E+308')
>>>
>>> int(decimal.Decimal('1.7976931348623157e+308') * 2)
3595386269724631400000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000L
>>>
>>> print(decimal.Decimal('1.7976931348623157e+308') * 2)
3.5953862697246314E+308
>>>

الشيء الآخر المقارنات مع أرقام الفاصالة العائمة ضربة حظ والأخطاء فيها وراده:

 

>>> 0.3 == (0.2 + 0.1)
False
>>> 0.3
0.3
>>> 0.2 + 0.1
0.30000000000000004
>>>

 

حسابياً قيمة 0.2 + 0.1 تساوي 0.3 الا أن المعالج يعطينا خطأ بسبب طريقة تخزينه للناتج 0.2 + 0.1.  هذه المقارنة قد تنجح وقد لاتنجح لو كانت حسابياً صحيحة (ولاحاجها لها أساساً طالما أنك تتعامل مع نفس المتغير):

if (c) == int (c):
1
#10

أنا فعلاً أستخدم عدد كبير جداً  , كيف أستخدم المكتبه التي ذكرتها , وهل لو كتبت مثل هذا الكود بـ C++ هل تنحل المشكلة , أنا ملاحظ أن البايثون بطئية في تنفيذ قليلا مقارنة مع C++

#11

السلام عليكم

اذا كان هدفك هو ان تعرف ان كان ناتج القسمة بدون فاصلة ، فيمكنك استعمال mod

if a%b==0 :	print(a/b)
2
#12

لا أدري ماذا تريد بالظبط ولكن ان كنت تريد حاصل القسمة يحمل النتيجة كامل للعملية القسمة يمكنك استخدام float 

a=float (input())
b=float (input())
c=a/b
if (c) == float (c):
 print (c)

وفي متغير a و b يمكنك ان تضع ارقام عشرية او عادية

أنظر للموضوع التالي هنا

1

Untitled-18.jpg

#13
abdou001 كتب:

 

السلام عليكم

اذا كان هدفك هو ان تعرف ان كان ناتج القسمة بدون فاصلة ، فيمكنك استعمال mod

if a%b==0 :	print(a/b)

جزاك الله خير  ضبط البرنامج 

 

شكراً لكم جميعاً

مواضيع مشابهة