السلام عليكم ورحمة الله وبركاته
خطأ عند تنفيذ سكربت بسيط كتبنه باليايثون
نص الخطأ:
------------------------------------------------------------------------------------------------
السلام عليكم ورحمة الله وبركاته
خطأ عند تنفيذ سكربت بسيط كتبنه باليايثون
نص الخطأ:
------------------------------------------------------------------------------------------------
حول الكل ل float وريح دماغك
(map share people)
فضلا لاتقم بمراسلتي من أجل أسئلة لها أقسامها في المنتدى حتى تعم الفائدة على الجميع وللحصول على إجابات أفضل من أعضاء أكثر خبرة.
Weblog
@bitbucket
@xmonader
شكراً لك فعلاً ضبط البرنامج بعد ماحولت المتغير إلى float لكن المشكلة أني معتمد في البرنامج على أن يكون المتغير int و عندما وضعت المتغير float صار لا بد أغير هذا السطر if c == int c إلى float و إلا بيعطي المفسر خطأ , و أنا معتمد على هذا السطر في البرنامج
تم تعديل هذه المشاركة بواسطة مبتدى بايثون في 8 أكتوبر 2013 في 07:53
تستطيع في النهاية التحويل ل int .. مالمشكلة!؟
(map share people)
فضلا لاتقم بمراسلتي من أجل أسئلة لها أقسامها في المنتدى حتى تعم الفائدة على الجميع وللحصول على إجابات أفضل من أعضاء أكثر خبرة.
Weblog
@bitbucket
@xmonader
نص الخطأ :
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
يا شباب في حل لهذه المشكلة ؟
الكود بسيط جداً
a=int (input()) b=int (input()) c=a/b if (c) == int (c): print (c)
ضع 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):
أنا فعلاً أستخدم عدد كبير جداً , كيف أستخدم المكتبه التي ذكرتها , وهل لو كتبت مثل هذا الكود بـ C++ هل تنحل المشكلة , أنا ملاحظ أن البايثون بطئية في تنفيذ قليلا مقارنة مع C++
السلام عليكم
اذا كان هدفك هو ان تعرف ان كان ناتج القسمة بدون فاصلة ، فيمكنك استعمال mod
if a%b==0 : print(a/b)
abdou001 كتب:
السلام عليكم
اذا كان هدفك هو ان تعرف ان كان ناتج القسمة بدون فاصلة ، فيمكنك استعمال mod
if a%b==0 : print(a/b)
جزاك الله خير ضبط البرنامج
شكراً لكم جميعاً