2013-08-07 3 views
5

में float` और` float64` मैं दो संख्याओं की तुलना करने के लिए है। उनमें से एक regulat पायथन कोड से आता है और दूसरे से numpy आता है। डीबगर से पता चलता है कि वे एक ही मूल्य '29 .0 है ', लेकिन पहले के प्रकार float है और दूसरा के प्रकार float64 है, इसलिए a == b और a - b == 0False है। मैं इसके साथ कैसे निपट सकता हूं? वहाँ बल एक नियमित रूप से अजगर चर करने के लिए किसी भी तरह से float64 या numpy उपयोग डिफ़ॉल्ट रूप से float होने के लिए है?`अजगर

अद्यतन: इन सभी मानों के अंत में उसी फ़ाइल से आता है जहां 29.0 लिखा गया है, इसलिए मुझे नहीं लगता कि संख्यात्मक मानों में अंतर हैं।

+1

आमतौर पर 'एक == b' या' एक साथ किसी भी दो तैरता की तुलना - ख == 0' परिशुद्धता त्रुटियों के कारण एक बुरा विचार है। 'Abs (a - b) <1e-8' या कुछ जैसी कुछ करने का प्रयास करें। – wflynny

+1

फ़्लोटिंग-पॉइंट प्रस्तुति और अंकगणित सटीक नहीं हैं (मंथिस और छिद्रण पीबी)। अधिकतम अंतर का एक ईपीएसलॉन सेट करें (आमतौर पर 10e-10)। – lucasg

+0

सामान्य रूप से इन टिप्पणियों को सही होने के लिए, मैं मूल्य 2 9 .0' में एक सटीक त्रुटि की कल्पना नहीं कर सकता, अगर यह फ़ाइल से आता है जो शायद ASCII प्रारूप में है। 29.0 बिल्कुल प्रतिनिधित्व किया जा सकता है। – glglgl

उत्तर

12

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

if abs(a - b) < 1e-10 

तो इस समस्या float और float64 (अजगर उन्हें स्वचालित रूप से बदल देता है) के बीच अंतर के साथ क्या करना है नहीं है, लेकिन के मौलिक समस्या के साथ समानता के लिए तैरने की तुलना।

भी What's wrong with using == to compare floats in Java?

+0

अच्छा बिंदु। मैं गलत पक्ष – xander27

+0

धन्यवाद देख रहा था।ऐसा लगता है कि मुझे बहुत अधिक समय लगता है =) तो मैं इस मूल बात के बारे में भूल गया – xander27

+0

असल में आप उन भाषाओं में समानता के साथ संख्या की तुलना कर सकते हैं जो प्रतीकात्मक गणित गणना –

7

देखें आप numpy का उपयोग कर रहे हैं, तो क्या एनतोनिस सुझाव दिया है करने के लिए सबसे अच्छा तरीका समारोह np.allclose(a, b) उपयोग करने के लिए है। आप सहिष्णुता भी निर्दिष्ट कर सकते हैं (ऊपर से 1e-10)।