यह वास्तव में एक समस्या नहीं है, यह पाइथन कार्यान्वयन पर फ़्लोटिंग-पॉइंट अंकगणित के बारे में कुछ उत्सुक है।शून्य के पास विभाजन के पास अजगर में अलग-अलग व्यवहार क्यों हैं?
क्या कोई निम्नलिखित व्यवहार को समझा सकता है?
>>> 1/1e-308
1e+308
>>> 1/1e-309
inf
>>> 1/1e-323
inf
>>> 1/1e-324
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: float division by zero
ऐसा लगता है कि 1 शून्य करने के लिए के निकट एक संख्या से विभाजित inf
है और अगर यह एक ZeroDivisionError
के निकट है फेंक दिया है। यह एक अजीब व्यवहार लगता है।
पायथन 2.x/3.x के लिए एक ही आउटपुट।
संपादित: यहाँ मेरा मुख्य सवाल यह है कि क्यों हम कुछ श्रृंखला के लिए inf
हो और कि अजगर संभालने नहीं ZeroDivisionError
विचार करने के लिए के रूप में शून्य 1e-309
यह आईईईई 754 के पायथन (गैर-) कार्यान्वयन से पूरी तरह से संबंधित है। एक सेन प्रोग्रामिंग भाषा विभाजन को होने देगी (प्रोसेसर इसे पाइथन डिजाइनरों के विपरीत सही ढंग से लागू करता है) और उपयुक्त परिणाम उत्पन्न करता है। इसके बजाए, पायथन स्पष्ट रूप से जांच करता है कि क्या विभाजक शून्य है और इस मामले में अलग-अलग व्यवहार करता है। यह अतिरिक्त चक्र लेता है, ओवरफ्लो होने से नहीं रोकता है, और इसका मतलब है कि पायथन आईईईई 754 अनुरूप नहीं है (क्योंकि आईईईई 754 1.0/0.0 उत्पादन + inf) में है। –
@ पास्कल क्यूओक: तकनीकी रूप से, यह पूरी तरह से सच नहीं है, क्योंकि आपको आईईईई 754 अंकगणितीय * के साथ अपवाद मिलेगा यदि आपके पास जाल सक्षम है *। चूंकि यह डिफ़ॉल्ट व्यवहार से बहुत दूर है, हालांकि, आपका बिंदु मान्य, स्वीकार और उल्लेखनीय है। हालांकि, दो व्यवहारों के बीच का अंतर ओवरफ्लो को उत्पादित करने की अनुमति देने वाले denormals के उलटा द्वारा समझाया गया है, इसलिए मुझे नहीं लगता कि उत्तर को सुधारने की जरूरत है। – Dolda2000