2012-03-02 4 views
36

में ईपीएसलॉन के लिए मूल्य क्या पाइथन में ईपीएसलॉन (या प्राप्त करने के लिए विधि) के लिए मानक मान है? मुझे फ्लोटिंग पॉइंट मानों की तुलना करने की आवश्यकता है और सबसे छोटे संभव अंतर के साथ तुलना करना चाहते हैं।पायथन

C++ में numeric_limits::epsilon() प्रदान की एक समारोह जो किसी भी डेटा प्रकार के लिए एप्सिलॉन मूल्य देता है। क्या पाइथन में बराबर है?

+5

फ्लोट की तुलना करते समय, मूल्यों की परिमाण ईपीएसलॉन को प्रभावित करेगी। –

+1

यह भी विचार करें कि मूल्यों में त्रुटि संचालन में फैल सकती है। क्षेत्र "संख्यात्मक विश्लेषण" इस अध्ययन के लिए समर्पित है। [यह] (http://floating-point-gui.de/errors/propagation/) साइट भी पालन करने के लिए कुछ अच्छे नियम प्रदान करती है। – Darthfett

उत्तर

79

जानकारी sys.float_info में उपलब्ध है, जो सी 99 में float.h के अनुरूप है।

>>> import sys 
>>> sys.float_info.epsilon 
2.220446049250313e-16 
21

strcat posted हैं, वहाँ sys.float_info.epsilon है।

लेकिन फ़्लोटिंग पॉइंट तुलना के लिए इसे पूर्ण त्रुटि मार्जिन के रूप में उपयोग करने के नुकसान को न भूलें। जैसे बड़ी संख्या के लिए, गोल त्रुटि ईपीएसलॉन से अधिक हो सकती है।

यदि आपको लगता है कि आपको एक रिफ्रेशर की आवश्यकता है, मानक संदर्भ डेविड गोल्डबर्ग का What Every Computer Scientist Should Know About Floating-Point Arithmetic है, या एक सरल समीक्षा के लिए आप The Floating Point Guide देख सकते हैं।

0

आश्चर्यचकित किसी ने इसका यहां उल्लेख नहीं किया; मुझे लगता है कि कई लोग इसके बजाय numpy.finfo(type(variable)).eps का उपयोग करेंगे। या .resolution यदि यह परिशुद्धता का आकलन करना है।

ध्यान दें कि finfo केवल फ़्लोटिंग पॉइंट प्रकारों के लिए है, और यह पाइथन के अपने float प्रकार (यानी numpy के प्रकार तक सीमित नहीं है) के साथ भी काम करता है। पूर्णांक प्रकारों के बराबर iinfo है, हालांकि इसमें सटीक जानकारी नहीं है (क्योंकि, ठीक है, यह क्यों होगा?)।

+0

"अधिकांश लोगों" के बारे में असहमत: हर कोई NumPy का उपयोग नहीं करता है। यदि आप * पायथन * की 'फ्लोट' के लिए ईपीएसलॉन चाहते हैं, तो 'sys.float_info' का उपयोग करें; इसके लिए नम्पी का उपयोग करना अजीब होगा। यदि आप * NumPy * प्रकारों ('np.float32',' np.float64', आदि) के मानों के बाद हैं, तो 'numpy.finfo' का उपयोग करें। –

+0

शब्द बदल दिया। यद्यपि स्पष्टीकरण के लिए, 'np.finfo (float)' _does_ कार्य, लेकिन मैं सहमत हूं कि यदि आप कभी भी numpy का उपयोग नहीं करते हैं, तो इसके लिए पैकेज को इंस्टॉल करने के लिए यह अधिक होगा। – Sheljohn

+1

दाएं, लेकिन 'np.finfo (फ्लोट) 'थोड़ा भ्रामक है, क्योंकि NumPy [तुरंत परिवर्तित हो जाता है] (https://github.com/numpy/numpy/blob/6914bb41f0fb3c1ba500bae4e7d671da9536786f/numpy/core/getlimits.py#L378) 'float'' np.float64' पर, और फिर उसके लिए विवरण रिपोर्ट करता है। तो यह फिर से न्यूमपी प्रकार पर रिपोर्ट कर रहा है, पायथन के 'फ्लोट' पर नहीं। (हालांकि स्वीकार्य रूप से, यह काफी संभावना है कि 'फ्लोट' और 'np.float64' एक ही प्रारूप हैं: वे दोनों हुड के नीचे सी डबल्स का उपयोग कर रहे हैं।) –