2009-10-07 18 views
6

मैं बस चल बिन्दु मूल्य तुलनामुकाबले चल बिन्दु को महत्व देता

चल बिन्दु मान या तो == या! = ऑपरेटर्स का उपयोग की तुलना में नहीं किया जाएगा के बारे में एक बयान पढ़ा। अधिकांश फ़्लोटिंग पॉइंट मानों का कोई सटीक बाइनरी प्रतिनिधित्व नहीं होता है और सीमित परिशुद्धता होती है।

यदि ऐसा है तो दो फ़्लोटिंग पॉइंट मानों की तुलना करने के लिए सबसे अच्छी विधि क्या है?

+0

क्या आप समझा सकते हैं कि आपको उनकी तुलना करने की आवश्यकता क्यों है? या आप सिर्फ उस दस्तावेज़ीकरण के बारे में उत्सुक हैं? – rjmunro

+0

संभावित डुप्लिकेट [मुझे फ़्लोटिंग पॉइंट तुलना कैसे करनी चाहिए?] (Http://stackoverflow.com/questions/4915462/how-should-i-do-floating-point-comparison) – Magnus

उत्तर

7

निम्नलिखित विस्तार तरीकों केविन के सुझाव को लागू करने के लिए उपयोगी हो सकता है

if(x1.IsEqualTo(x2)) ... 
if(x1.IsEqualTo(x2, 0.01)) ... 

बस एक अधिक उपयुक्त नाम के IsEqualTo बदलने, या बदलने के यदि आवश्यक हो तो double.Epsilon से बेहतर कुछ भी डिफ़ॉल्ट मार्जिन।

3

आम तौर पर चल बिन्दु संख्या एक निर्माण की तरह

if(abs((x1 - x2) < 0.001)) 

चेतावनी आप उद्धृत के लिए कारण का उपयोग कर की तुलना में किया जाना चाहिए कि आप कुछ की गणना के दो तरीके हो सकते हैं, और वे बराबर यदि आप कोई गोलाई त्रुटि थी हो सकता है , लेकिन गोल करने की त्रुटि उन्हें थोड़ा अलग बनाती है। तो अब

public static bool IsEqualTo(this double a, double b, double margin) 
{ 
    return Math.Abs(a - b) < margin; 
} 

public static bool IsEqualTo(this double a, double b) 
{ 
    return Math.Abs(a - b) < double.Epsilon; 
} 

तुम सिर्फ कर सकते हैं::

+1

'abs (x1 - x2) का उपयोग करें <0.001 * x1' इसके बजाय –

+0

@Alexandre: क्यों? अगर आप हमें कुछ स्पष्टीकरण दे सकते हैं तो मददगार होगा। – shuhalo

+1

@ उपयोगकर्ता 411768: यह "आम तौर पर" की वजह से है। आम तौर पर, आप रिश्तेदार परिशुद्धता की तुलना करते हैं, पूर्ण नहीं। क्या होगा यदि x1 और x2 10^-6 के क्रम पर हैं, लेकिन x1 x2 जितना बड़ा है x2? आप निश्चित रूप से उपर्युक्त निर्माण नहीं चाहते हैं कि आपको यह बताने के लिए x1 == x2। ऐसे मामले हैं जहां पूर्ण परिशुद्धता सही है। विषय मुश्किल है। –

2

"सर्वश्रेष्ठ विधि" परिस्थितियों पर निर्भर करती है कि आप संख्याओं की तुलना क्यों करना चाहते हैं। आम तौर पर, यदि आपको लगता है कि आप जांचना चाहते हैं कि 2 फ़्लोटिंग पॉइंट संख्या बराबर हैं, तो आप कुछ गलत कर रहे हैं।

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

आप यह जांचना चाहेंगे कि वे करीब हैं, (एक निश्चित दहलीज के करीब) जैसा कि अन्य उत्तरों ने सुझाव दिया है, लेकिन बराबर नहीं है।

संबंधित मुद्दे