2012-01-05 23 views
6

EASTL के माध्यम से जा रहे हैं y, मैं कोड की एक अजीब रेखा के पार ठोकर खाई। दिए गए लिंक पर 1870.के बीच क्या अंतर है! (एक्स < y) and x > = में सी ++?

https://github.com/paulhodge/EASTL/blob/master/include/EASTL/algorithm.h

कोड पर ब्याज की लाइन संख्या के साथ फ़ाइल से पता चलता उस रेखा if(!(value < *i)) है। टिप्पणी का कहना है कि करने के लिए यह क्यों इतना है के रूप में किसी भी विवरण के बिना "हम हमेशा == < या के मामले में मूल्य तुलना व्यक्त"। वहाँ भी कुछ अन्य क्षेत्रों में जहां एक ही टिप्पणी रखा लेकिन किसी भी विवरण के बिना है ।

वहाँ कोई लाभ जो भी ऐसे ही एक तुलना लिखने के लिए शायद इतना है (मुझे संदर्भ है कि मैं देख रहा हूँ)? यदि नहीं, तो ईएएसटीएल के लेखक ने जानबूझकर इसे इस विशेष फैशन में क्यों लिखा और इसके बारे में टिप्पणी करने की देखभाल भी की? स्थिरता केवल एकमात्र कारण है?

+1

फ़्लोटिंग-पॉइंट में, वे अलग हैं, क्योंकि 'NaN' के साथ तुलना हमेशा झूठी वापसी होगी। – Mysticial

+0

आप उससे क्यों नहीं पूछते? –

+0

एक बहुत ही विशिष्ट प्रोसेसर/असेंबलर/कंपाइलर प्रकार अनुकूलन की तरह लगता है। क्या यह कोड किसी विशेष प्रोसेसर/कंपाइलर इत्यादि पर लक्षित है –

उत्तर

11

इसका मतलब है कि आप केवल कंटेनर मूल्य प्रकार के लिए < और == प्रदान करने के लिए की जरूरत है। यह आपको उन प्रकारों के लिए परिवर्तनशीलता की मात्रा को कम (के रूप में सभी एल्गोरिदम !(a<b) का उपयोग a>=b और a!=b के लिए !(a==b) मतलब करने के लिए) का मतलब है, अन्यथा, आप >= और != असंगत परिणाम लौट सकते हैं।

8

सी ++ में, आप < ऑपरेटर को ओवरलोड सकते हैं ताकि यह >= के विपरीत तुलना में अलग तरह से व्यवहार करता है, तो वे बराबर होने की गारंटी नहीं कर रहे हैं।

साथ ही, किसी भी आईईईई फ्लोटिंग प्वाइंट कार्यान्वयन में, NaN < NaN झूठे, है लेकिन इतनाNaN >= NaN है, इसलिए !(NaN < NaN) सत्य है भले ही NaN >= NaN गलत है।

1

मुझे कम से कम एक अंतर दिखाई देता है। यदि संख्याओं में से एक QNAN (फ़्लोटिंग-पॉइंट 0/0) था तो! (< बी) यदि कोई या बी क्यूएनएएन था, तो हमेशा सत्य वापस आ जाता था, जबकि यह हमेशा> = b के लिए झूठा वापस आ जाता

+0

असल में, यह व्यवहार काफी परेशान है। '<', गणितीय रूप से गुणों में से एक विरोधी समरूपता है। मतलब है कि '! (ए <बी) 'का अर्थ है' बी <ए'। उन लोगों ने जानबूझकर इस संपत्ति का उल्लंघन करना चुना है, बस मुझे परेशान करता है, यह कई एल्गोरिदम को फेंकता है ... –

+0

@SteveJessop: हाँ, क्षमा करें, यह थोड़ा सा है। सच्चे रिश्ते है: '(एक एक == b' –

+0

ख @Matthieu:!। यह सच है कि यह कष्टप्रद है, लेकिन antisymmetry की अपनी परिभाषा बंद है' विचार करें == b', तो '।!(एक <बी) '' b

1

का उपयोग करते हुए बस से कम ऑपरेटर, आप अन्य सभी तुलना ऑपरेटरों अनुकरण कर सकते हैं। इससे इसे अधिक सुसंगत बना दिया जाता है और जब आप तुलना को पैरामीटर करने की आवश्यकता होती है तो आपको एक टेम्पलेट पैरामीटर का उपयोग करने की अनुमति मिलती है। मानक सॉर्ट किए गए कंटेनर और एल्गोरिदम उदाहरण के लिए डिफ़ॉल्ट टेम्पलेट तुलनित्र के रूप में std::less<T> का उपयोग करते हैं।

operation equivalent 
x < y  x < y 
x > y  y < x 
x <= y  !(y < x) 
x >= y  !(x < y) 
x == y  !(x < y) && !(y < x) 
x != y  (x < y) || (y < x) 
उन कार्यों जहां आदेश महत्वपूर्ण नहीं है यह सरल और अधिक बजाय ऑपरेटर == उपयोग करने के लिए सक्षम है के लिए

+0

मानक लाइब्रेरी समानता जांच के लिए 'equal_to (==)' का भी उपयोग करती है। – visitor

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