पायथन इन्फिनिटी - कोई चेतावनी?


179

इसलिए पायथन में सकारात्मक और नकारात्मक अनंतता है:

float("inf"), float("-inf")

यह सिर्फ उस सुविधा के प्रकार जैसा लगता है जिसमें कुछ कैविएट होना आवश्यक है। क्या मुझे कुछ पता होना चाहिए?


25
ध्यान दें कि निरंतर के 1e309रूप में व्याख्या की जाएगी +infऔर -1e309इसकी व्याख्या की जाएगी -inf
क्रिस टेलर

जवाबों:


97

आप अभी भी साधारण अंकगणित से नंबर (NaN) मान प्राप्त नहीं कर सकते हैं inf:

>>> 0 * float("inf")
nan

ध्यान दें कि आपको सामान्य अंकगणितीय गणनाओं के माध्यम से सामान्य रूप से मान नहीं मिलेगा inf:

>>> 2.0**2
4.0
>>> _**2
16.0
>>> _**2
256.0
>>> _**2
65536.0
>>> _**2
4294967296.0
>>> _**2
1.8446744073709552e+19
>>> _**2
3.4028236692093846e+38
>>> _**2
1.157920892373162e+77
>>> _**2
1.3407807929942597e+154
>>> _**2
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
OverflowError: (34, 'Numerical result out of range')

infमूल्य असामान्य अर्थ विज्ञान के साथ एक बहुत ही खास मूल्य माना जाता है, इसलिए यह एक के बारे में पता करने के लिए बेहतर है OverflowErrorसीधे एक अपवाद के माध्यम से दूर, बल्कि एक की तुलना में infचुपचाप अपनी गणना में इंजेक्शन मूल्य।


8
एक साधारण फ्लोट जोड़, गुणा, आदि ख़ुशी से inf का उत्पादन करेगा हालांकि: f = 1.3407807929942597 + + 154; f * f => inf। यह एक अतिप्रवाह के रूप में बढ़ाने के बजाय ** का अपवाद लगता है।
ेरेगॉन

@eregon, वास्तव में, **एक बालक छोटी गाड़ी लगता है। जब यह वास्तविक संख्याओं से अधिक हो जाता है, तो यह एक त्रुटि फेंकता है, लेकिन जब इसका कोई ऑपरेंड infया होता है -inf, तो यह 0.0या तो वापस आ जाता है inf। तो यह सही ढंग से काम करता है जब इनपुट निष्क्रिय होता है, लेकिन तब नहीं जब परिणाम अनंत होना चाहिए।
हाबिल

2
@ सबब कि छोटी गाड़ी नहीं है। अतिप्रवाह का मतलब संख्या बहुत बड़ी है। इसका प्रतिनिधित्व करने के लिए बहुत बड़ा है, लेकिन अभी भी अनंत की तुलना में बहुत छोटा है। ऐसी जगह में अनन्तता रखना आपके विशेष एप्लिकेशन लॉजिक के अपवाद हैंडलर के लिए उपयोगी हो सकता है, लेकिन सामान्य रूप से पायथन के लिए गलत होगा।
लुत्ज प्रेचल

6
@ लुट्ज़ अगर यह गुणा के रूप में आता है, तो यह अभी भी असंगत व्यवहार है। निश्चित रूप से बड़ा * बड़ा अनंत नहीं है।
रिचर्ड रास्ट

100

पायथन का कार्यान्वयन IEEE-754 मानक का अच्छी तरह से अनुसरण करता है , जिसे आप एक मार्गदर्शन के रूप में उपयोग कर सकते हैं, लेकिन यह अंतर्निहित प्रणाली पर निर्भर करता है जिस पर इसे संकलित किया गया था, इसलिए प्लेटफ़ॉर्म अंतर हो सकता है। हाल ही में, एक फिक्स लागू किया गया है जो "अनन्तता" के साथ-साथ "inf" की अनुमति देता है , लेकिन यहां मामूली महत्व है।

निम्नलिखित अनुभाग समान रूप से किसी भी भाषा पर लागू होते हैं जो IEEE फ़्लोटिंग पॉइंट अंकगणित को सही ढंग से लागू करता है, यह केवल पायथन के लिए विशिष्ट नहीं है।

असमानता के लिए तुलना

अनन्तता और अधिक से अधिक >या कम से कम <ऑपरेटरों के साथ काम करते समय , निम्नलिखित मायने रखता है:

  • सहित कोई भी संख्या +inf से अधिक है-inf
  • सहित किसी भी संख्या -infसे कम है+inf
  • +infकी तुलना में न तो अधिक है और न ही कम है+inf
  • -inf की तुलना में न तो अधिक है और न ही कम है -inf
  • किसी भी तरह की तुलना NaNझूठी है ( infन तो अधिक है, न ही इससे कम है NaN)

समानता के लिए तुलना

जब समानता के लिए तुलना की जाती है, +infऔर +infसमान होते हैं, जैसे हैं -infऔर -inf। यह एक बहुत ही विवादित मुद्दा है और यह आपको विवादास्पद लग सकता है, लेकिन यह IEEE मानक में है और पायथन ऐसा ही व्यवहार करता है।

निस्संदेह, +infअपने आप में -infऔर सब कुछ, जिसमें NaNस्वयं भी शामिल है, असमान है NaN

अनंत के साथ गणना

अनन्तता के साथ अधिकांश गणनाएँ अनन्तता प्राप्त करेंगी, जब तक कि दोनों ऑपरेंड अनंत नहीं होते हैं, जब ऑपरेशन डिवीजन या मोडुलो, या शून्य के साथ गुणा करते हैं, तो ध्यान में रखने के लिए कुछ विशेष नियम हैं:

  • जब शून्य से गुणा किया जाता है, जिसके लिए परिणाम अपरिभाषित होता है, तो इसकी पैदावार होती है NaN
  • अनंत द्वारा किसी भी संख्या (अनंत को छोड़कर) को विभाजित करते समय, जो पैदावार 0.0या ( -0.0
  • जब विभाजन (मोडुलो सहित) सकारात्मक या नकारात्मक अनंत द्वारा सकारात्मक या नकारात्मक अनंत, परिणाम अपरिभाषित होता है, इसलिए NaN
  • घटाते समय, परिणाम आश्चर्यजनक हो सकते हैं, लेकिन सामान्य गणित की समझ का पालन करें :
    • जब कर रहा है inf - inf, परिणाम अपरिभाषित है:NaN :;
    • जब कर रहा है inf - -inf, परिणाम हैinf ;
    • जब कर रहा है -inf - inf, परिणाम है-inf ;
    • जब कर रहा है -inf - -inf, परिणाम अपरिभाषित है NaN:।
  • जब जोड़ते हैं, तो यह भी आश्चर्यजनक रूप से हो सकता है:
    • जब कर रहा है inf + inf, परिणाम हैinf ;
    • जब कर रहा है inf + -inf, परिणाम अपरिभाषित है:NaN :;
    • जब कर रहा है -inf + inf, परिणाम अपरिभाषित है:NaN :;
    • जब कर रहा है -inf + -inf, परिणाम है -inf
  • उपयोग करना math.pow, powया **मुश्किल है, क्योंकि यह व्यवहार नहीं करना चाहिए जैसा कि इसे करना चाहिए। यह एक अतिप्रवाह अपवाद फेंकता है जब दो वास्तविक संख्याओं के साथ परिणाम एक डबल सटीक फ़्लोट (यह अनंतता लौटना चाहिए) फिट करने के लिए बहुत अधिक है, लेकिन जब इनपुट है infया -inf, यह सही ढंग से व्यवहार करता है या infया तो वापस आ जाता है 0.0। जब दूसरा तर्क होता है NaN, तो वह NaNतब तक लौटता है , जब तक कि पहला तर्क न हो 1.0। अधिक मुद्दे हैं, सभी डॉक्स में शामिल नहीं हैं ।
  • math.expके रूप में एक ही मुद्दों से ग्रस्त है math.pow। अतिप्रवाह के लिए इसे ठीक करने का एक उपाय इसके समान कोड का उपयोग करना है:

    try:
        res = math.exp(420000)
    except OverflowError:
        res = float('inf')

टिप्पणियाँ

नोट 1: एक अतिरिक्त चेतावनी के रूप में, जैसा कि IEEE मानक द्वारा परिभाषित किया गया है, यदि आपकी गणना परिणाम के तहत या ओवरफ्लो होती है, तो परिणाम अंडर या ओवरफ्लो त्रुटि नहीं होगी, लेकिन सकारात्मक या नकारात्मक अनंत: 1e308 * 10.0पैदावारinf

नोट 2: क्योंकि NaNरिटर्न के साथ किसी भी गणना NaNऔर किसी भी तरह की तुलना NaN, NaNअपने आप में false, आपको यह math.isnanनिर्धारित करने के लिए फ़ंक्शन का उपयोग करना चाहिए कि क्या कोई संख्या वास्तव में है NaN

नोट 3: हालांकि पायथन लेखन का समर्थन करता है float('-NaN'), फिर भी संकेत को अनदेखा किया जाता है, क्योंकि NaNआंतरिक रूप से कोई संकेत मौजूद नहीं है । यदि आप विभाजित करते हैं -inf / +inf, तो परिणाम है NaN, नहीं -NaN(ऐसी कोई बात नहीं है)।

नोट 4: उपरोक्त में से किसी पर भी भरोसा करने के लिए सावधान रहें, क्योंकि पायथन सी या जावा लाइब्रेरी पर निर्भर करता है जिसे इसके लिए संकलित किया गया था और सभी अंतर्निहित सिस्टम इस सभी व्यवहार को सही ढंग से लागू नहीं करते हैं। यदि आप सुनिश्चित होना चाहते हैं, तो अपनी गणना करने से पहले अनंत के लिए परीक्षण करें।

Version) हाल ही में संस्करण 3.2 के बाद से इसका मतलब है ।
²) फ्लोटिंग पॉइंट सकारात्मक और नकारात्मक शून्य का समर्थन करते हैं, इसलिए: x / float('inf')इसका संकेत और -1 / float('inf')पैदावार -0.0, 1 / float(-inf)पैदावार -0.0, 1 / float('inf')पैदावार 0.0और -1/ float(-inf)पैदावार रखता है 0.0। इसके अलावा, 0.0 == -0.0हैtrue , तो आप मैन्युअल संकेत जाँच करने के लिए यदि आप इसे सच हो नहीं करना चाहती है।


11
एक छोटी सी नाइटिक: प्रत्येक गणना अनन्तता के साथ नहीं होती है अनन्तता:-1 * float('infinity') == -inf
इवान क्राल

4
इसलिए मैंने कहा कि यह एक छोटा सा नाइटपिक था। आपने मुझे एक मिनट के लिए चिंतित किया था कि अनंत के साथ काम करते समय संकेत पूरी तरह से नजरअंदाज कर दिया जाएगा, और मैं अन्य लोगों के लिए स्पष्ट करना चाहता था।
इवान क्राल

12
खैर, लगभग: 1 / फ्लोट ('इन्फिनिटी') == 0.0
फिल

3
@Phil: हालांकि मुझे पूरा यकीन है कि आप केवल यह दिखाने की कोशिश कर रहे थे कि सभी परिणाम गणना में inf या NaN के साथ नहीं, मैं सिर्फ दूसरों को यह स्पष्ट करना चाहता था कि टिप्पणियों के माध्यम से पढ़ा जा सकता है, 1 / फ्लोट ('अनंत' ') == 0.0 सच है; के लिए, जैसा कि आप अनंत से संपर्क कर रहे हैं, विभाजन का परिणाम 0. आ रहा है। मुझे पता है कि यह सिर्फ मूल गणना है, लेकिन मैं यह समझना चाहता था कि पढ़ने वाले समझ रहे हैं, या कम से कम ऐसा क्यों है, इसका परिणाम है।
एंथनी पेस

1
मुझे लगता है कि यह उत्तर स्वीकृत उत्तर की तुलना में बहुत बेहतर है।
क्रिश्चियन हरजेन

3

तो C99 करता है ।

सभी आधुनिक प्रोसेसरों द्वारा उपयोग किए जाने वाले IEEE 754 फ़्लोटिंग पॉइंट प्रतिनिधित्व में कई विशेष बिट पैटर्न होते हैं जो सकारात्मक अनंत (संकेत = 0, exp = ~ 0, frac = 0), नकारात्मक अनंत (संकेत = 1, exp = ~ 0, frac = 0) के लिए आरक्षित होते हैं। ), और कई NaN (संख्या नहीं: exp = ~ 0, frac ≠ 0)।

आप सभी के बारे में चिंता करने की जरूरत है: कुछ अंकगणित अस्थायी बिंदु अपवाद / जाल का कारण हो सकता है, लेकिन वे केवल इन "दिलचस्प" स्थिरांक तक सीमित नहीं हैं।


1
तो अगर मेरा अंकगणित बहुत बड़ा है तो क्या यह एक inf बन सकता है?
केसबश

@ कासेबश नहीं, यह एक कारण होगा OverflowError
wizzwizz4

2

मुझे एक चेतावनी मिली जिसका अभी तक किसी ने उल्लेख नहीं किया है। मुझे नहीं पता कि यह व्यावहारिक स्थितियों में अक्सर आएगा, लेकिन यहां यह पूर्णता के लिए है।

आमतौर पर, एक नंबर मोडुल इनफिनिटी की गणना एक फ्लोट के रूप में की जाती है, लेकिन एक अंश मॉडुलो इन्फिनिटी रिटर्न nan(संख्या नहीं)। यहाँ एक उदाहरण है:

>>> from fractions import Fraction
>>> from math import inf
>>> 3 % inf
3.0
>>> 3.5 % inf
3.5
>>> Fraction('1/3') % inf
nan

मैंने पायथन बग ट्रैकर पर एक मुद्दा दायर किया। इसे https://bugs.python.org/issue32968 पर देखा जा सकता है ।

अपडेट: यह पायथन 3.8 में तय किया जाएगा ।


2

एक बहुत खराब गुफा: शून्य से डिवीजन

में 1/x अंश में, x = 1e-323यह ऊपर है infलेकिन जब x = 1e-324या थोड़ा इसे फेंकता हैZeroDivisionError

>>> 1/1e-323
inf

>>> 1/1e-324
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: float division by zero

इसलिए सतर्क रहें!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.