2017-02-01 11 views
49

सी ++ में, क्या मुझे कोई गारंटी है कि, किसी दिए गए float a और float b के लिए, एक और केवल a < b, a == b और a > b सत्य है?सी ++ में, <, == and > में से एक है फ्लोट पर सच होने की गारंटी है?

यदि यह कंपाइलर्स और प्लेटफॉर्म के बीच भिन्न है, तो मुझे x86 पर विजुअल सी ++ में रूचि है।

+28

यदि आपका फ्लोट एक नाएन नहीं है। –

+1

आप कोने-केस को बाहर करने के लिए शायद इसे 'गैर-नॉन फ्लोट मान' में संशोधित करना चाहते हैं? – smci

+2

नहीं, ** उनमें से अधिकतर ** ** सत्य होने की गारंटी है। –

उत्तर

75

सं

यह पर्याप्त या तो a या b के लिए गलत a < b, a == b और a > b से प्रत्येक के लिए NaN होने के लिए है।

दोनों a और b तो गैर NaN हैं वास्तव में a < b, a == b या a > b में से एक सत्य हो गया है।

पूरक में, इस answer आपको बताता है कि आप C++ में एक NaN मूल्य प्राप्त कर सकते हैं (वहाँ कई NaN मान होते हैं, कि उनके अभ्यावेदन निरीक्षण से प्रतिष्ठित किया जा सकता है, और वे सभी एक दूसरे से अलग हैं, क्योंकि NaN बराबर नहीं है कुछ भी करने के लिए, और कैसे आप यह जांच सकते हैं कि कोई मान NaN है (यह देखने के लिए एक idiomatic परीक्षण है कि एक चर x एक NaN x != x है, और वास्तव में std::isnan() अक्सर इस तरह कार्यान्वित किया जाता है, लेकिन कुछ प्रोग्रामर जिन्हें आपका कोड पढ़ना होगा इससे भ्रमित हो सकता है)।

और फिर, a और b पिछले गणनाओं के परिणाम हैं, तो अतिरिक्त परिशुद्धता की समस्या है। सी 0 सीसी में चर्चा के लिए देखें। सी 99 मानक ने नियमों को स्पष्ट कर दिया है कि अतिरिक्त परिशुद्धता क्या हो सकती है और क्या नहीं हो सकती है, लेकिन सी ++ के बावजूद FLT_EVAL_METHOD की परिभाषा के लिए सी मानक को संदर्भित करके इन नियमों को विरासत में कम या कम करने के बावजूद cfloat, अभ्यास में सी संकलक नियमों को सी ++ कंपाइलर्स से अधिक गंभीरता से लेते हैं। उदाहरण के लिए जीसीसी -std=c99 के साथ संकलित करते समय सी के नियमों को लागू करता है, और इस संदर्भ में आप संपत्ति पर भरोसा कर सकते हैं, लेकिन इस लेखन के अनुसार जीसीसी इन नियमों को लागू नहीं करता है जब सी ++ कंपाइलर के रूप में उपयोग किया जाता है।

+0

क्या '0.0/0.0' जैसा कुछ भी __a__ NaN नहीं मिलेगा? –

+0

@JeppeStigNielsen हां, यह किसी भी शीर्षलेख पर भरोसा किए बिना इसे लिखने का एक तरीका है। –

+6

@JeppeStigNielsen: आपकी एफपीयू सेटिंग्स के आधार पर जो NaN के बजाय एक एफपीयू अपवाद उत्पन्न कर सकता है। –

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