जवाबों:
आप अभी भी साधारण अंकगणित से नंबर (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
चुपचाप अपनी गणना में इंजेक्शन मूल्य।
**
एक बालक छोटी गाड़ी लगता है। जब यह वास्तविक संख्याओं से अधिक हो जाता है, तो यह एक त्रुटि फेंकता है, लेकिन जब इसका कोई ऑपरेंड inf
या होता है -inf
, तो यह 0.0
या तो वापस आ जाता है inf
। तो यह सही ढंग से काम करता है जब इनपुट निष्क्रिय होता है, लेकिन तब नहीं जब परिणाम अनंत होना चाहिए।
पायथन का कार्यान्वयन 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
, तो आप मैन्युअल संकेत जाँच करने के लिए यदि आप इसे सच हो नहीं करना चाहती है।
-1 * float('infinity') == -inf
तो C99 करता है ।
सभी आधुनिक प्रोसेसरों द्वारा उपयोग किए जाने वाले IEEE 754 फ़्लोटिंग पॉइंट प्रतिनिधित्व में कई विशेष बिट पैटर्न होते हैं जो सकारात्मक अनंत (संकेत = 0, exp = ~ 0, frac = 0), नकारात्मक अनंत (संकेत = 1, exp = ~ 0, frac = 0) के लिए आरक्षित होते हैं। ), और कई NaN (संख्या नहीं: exp = ~ 0, frac ≠ 0)।
आप सभी के बारे में चिंता करने की जरूरत है: कुछ अंकगणित अस्थायी बिंदु अपवाद / जाल का कारण हो सकता है, लेकिन वे केवल इन "दिलचस्प" स्थिरांक तक सीमित नहीं हैं।
OverflowError
।
मुझे एक चेतावनी मिली जिसका अभी तक किसी ने उल्लेख नहीं किया है। मुझे नहीं पता कि यह व्यावहारिक स्थितियों में अक्सर आएगा, लेकिन यहां यह पूर्णता के लिए है।
आमतौर पर, एक नंबर मोडुल इनफिनिटी की गणना एक फ्लोट के रूप में की जाती है, लेकिन एक अंश मॉडुलो इन्फिनिटी रिटर्न 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 में तय किया जाएगा ।
एक बहुत खराब गुफा: शून्य से डिवीजन
में 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
इसलिए सतर्क रहें!
1e309
रूप में व्याख्या की जाएगी+inf
और-1e309
इसकी व्याख्या की जाएगी-inf
।