2009-12-01 10 views
6

में उत्पन्न इन्फिनिटी मैं कुछ जटिल पायथन 2.6 कोड देख रहा हूं जो कभी-कभी एक अनंतता उत्पन्न होती है (कम से कम एक इंफिनिटी जेसन लाइब्रेरी द्वारा क्रमबद्ध किया जा रहा है - जो w/math.isinf की जांच करता है)।पाइथन कोड

विशेष रूप से परेशान करने वाला यह है कि पाइथन (जहां तक ​​मैं कह सकता हूं) कभी भी अनंतता के लिए गणना गणना परिणाम उत्पन्न करने में सक्षम नहीं होना चाहिए। क्या मैं इस धारणा से गलत हूं? मुझे पता है आप केवल स्थिरांक से infinities प्राप्त कर सकते हैं था:

k = float('inf') 
k = 1e900 
+0

हम्म ... अनंतता JSON मान्य नहीं है, लेकिन पायथन दोनों क्रमबद्ध और अनुक्रमित करेंगे। – Thanatos

+2

@ थानाटोस कि व्यवहार कॉन्फ़िगर करने योग्य है http://docs.python.org/library/json.html –

उत्तर

13
1e308 के बीच

कहीं और 1e309 तैरता है, परिशुद्धता से बाहर चलाने ताकि आप उस श्रेणी के ऊपर परिणामों का आकलन कर रहे हैं यदि आप inf देखेंगे

>>> 1e308 
1e+308 
>>> 1e309 
inf 

>>> json.dumps(1e308,allow_nan=False) 
'1e+308' 
>>> json.dumps(1e309,allow_nan=False) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.6/json/__init__.py", line 237, in dumps 
    **kw).encode(obj) 
    File "/usr/lib/python2.6/json/encoder.py", line 367, in encode 
    chunks = list(self.iterencode(o)) 
    File "/usr/lib/python2.6/json/encoder.py", line 304, in _iterencode 
    yield floatstr(o, self.allow_nan) 
    File "/usr/lib/python2.6/json/encoder.py", line 47, in floatstr 
    raise ValueError(msg) 
ValueError: Out of range float values are not JSON compliant: inf 
>>> 

दशमलव बड़ी संख्या में संभाल कर सकते हैं, लेकिन स्पष्ट रूप से वहाँ निष्पादन दंड है (और यह json के साथ धारावाहिक नहीं किया जा सकता)

>>> from decimal import Decimal 
>>> Decimal('1e900')/10 
Decimal("1E+899") 

यहाँ एक अतिरिक्त है कि रा नहीं है का एक उदाहरण है आईएसई ओवरफ्लो अपवाद

>>> a=1e308 
>>> a+a 
inf 
+0

सही, मुद्दा यह है कि किसी भी तरह कि गणना गणना के माध्यम से उत्पन्न की जा रही है, न कि कॉन्स्ट असाइनमेंट के माध्यम से। मैं सोच रहा हूं कि क्या वैसे भी है कि ओवरफ्लो एक्सेप्शन बाईपास हो जाएंगे। – UsAaR33

+0

निश्चित रूप से, मैंने अपने उत्तर –

+0

के नीचे एक उदाहरण जोड़ा है, आप प्रश्न पर gnibbler की टिप्पणी के लिए JSON व्यवहार को परिभाषित कर सकते हैं। आप दशमलव आयात से के साथ पाइथन कोड में फ्लोट अनंतता की जांच भी कर सकते हैं दशमलव यदि दशमलव ("% f"% younumber) .is_infinite(): ओवरफ्लो एरर – jsbueno