2011-04-07 23 views
10

क्या std :: numeric_limits पर संख्यात्मक सीमा मैक्रोज़ (उदा। INT64_MAX) का उपयोग करने के लिए कोई तर्क है? जो मैं समझता हूं उससे numeric_limits मानक में है लेकिन मैक्रोज़ केवल C99 में हैं इसलिए इसलिए गैर मानक।INT_ [MIN | MAX] मैक्रोज़ बनाम numeric_limits <T>

उत्तर

8

यदि सी ++, numeric_limits का उपयोग करें, तो अंत में।

संपादित करें: ठीक है, जेम्स द्वारा टिप्पणी के अनुसार, "अंत" नहीं। - अपवाद टेम्पलेट्स और केस लेबल्स हैं। लेकिन, मैं या तो न्यूनतम या अधिकतम, या उनके लिए टेम्पलेट के लिए केस लेबल रखने के लिए उपयोग नहीं देख सकता, लेकिन मुझे लगता है कि मैंने सभी संभावनाएं नहीं देखी हैं ...

मुझे लगता है कि मेरा बिंदु यह है कि numeric_limits टेम्पलेट max() और min() ...

+1

इसे उस संदर्भ में आज़माएं जहां एक अभिन्न निरंतर अभिव्यक्ति की आवश्यकता है। एक टेम्पलेट को तत्काल, या एक मामले में सक्षम कहें। या छोटे प्रकार के लिए, सरणी आयाम के रूप में ('UCHAR_MAX + 1' अक्सर होता है)। –

+0

@ जेम्स, हम्म .. ठीक है, मैं टेम्पलेट्स और केस लेबल्स के लिए संपादित करूंगा, सरणी आयामों के बारे में निश्चित नहीं है ... – Nim

+3

महत्वपूर्ण नोट: चूंकि सी ++ 11 'std :: numeric_limits :: अधिकतम() 'है 'constexpr', तो, अपवाद अब पकड़ नहीं है। – juanchopanza

1

कुछ संदर्भों में (जैसे case लेबल, गैर प्रकार टेम्पलेट पैरामीटर) एक अंकीय निरंतर उम्मीद है परे और अधिक उपयोगी है, और numeric_limits इस का समर्थन नहीं करता: numeric_limits<int>::max() एक निरंतर नहीं है। case लेबल में, आपको इसके बजाय INT_MAX का उपयोग करना होगा।

यह बहुत परेशान है लेकिन मुझे लगता है कि सी ++ 11 इसे ठीक करेगा।

10

पूर्व सी ++ 0x, निश्चित रूप से। INT_MIN और INT_MAX अभिन्न निरंतर अभिव्यक्ति हैं; numeric_limits<int>::min() और numeric_limits<int>::max() नहीं हैं। <climits> मानक सी ++ है, और जब तक आप टेम्पलेट्स से निपट नहीं रहे हैं (जहां आप नहीं जानते कि यह int या long है), अत्यधिक जटिल समाधान से परेशान करने का वास्तव में कोई कारण नहीं है। (इसके अलावा: यदि आप टेम्पलेट्स लिख रहे हैं, भूल जाते हैं नहीं है कि numeric_limits<int>::min() और numeric_limits<double>::min() पूरी तरह से अलग विशेषताओं का प्रतिनिधित्व करते हैं, यदि आप कम से कम संभव मूल्य चाहते हैं, आप numeric_limits<T>::is_integer ? numeric_limits<T>::min() : -numeric_limits<T>::max() आवश्यकता होगी।)

+0

मैं जोड़ता हूं कि अभिन्न निरंतर अभिव्यक्ति तर्क केवल गणना करता है, यदि आप टेम्पलेट्स में मानों का उपयोग करना चाहते हैं। – Xeo

+0

@Xeo: यह सच नहीं है। यह भी महत्वपूर्ण है जब आप कक्षा स्थिर शुरू कर रहे हैं। – MSalters

+0

@MSalters,?आप बिना अभिन्न निरंतर एक अभिन्न कक्षा स्थैतिक प्रारंभ नहीं कर सकते? – Nim

12

अन्य उत्तर ज्यादातर सही जानकारी नहीं है, लेकिन ऐसा लगता है कि इसे सी ++ 11 के लिए अद्यतन करने की आवश्यकता है।

सी ++ 11, std::numeric_limits<T>::min(), std::numeric_limits<T>::max() में, और std::numeric_limits<T>::lowest() सब की घोषणा की जाती constexpr, तो वे INT_MIN और कंपनी के रूप में ही संदर्भों में से अधिकांश में प्रयोग करने योग्य हो सकता है। एकमात्र अपवाद जिसे मैं सोच सकता हूं संकलन-समय स्ट्रिंग प्रसंस्करण # स्ट्रिंगफिकेशन टोकन का उपयोग कर रहा है।

इसका मतलब है कि numeric_limits मामला लेबल, टेम्पलेट मानकों, आदि के लिए इस्तेमाल किया जा सकता है, और आप सामान्य कोड में इसका उपयोग करने का लाभ मिलेगा (template<typename T> get_min(T t); में INT_MIN बनाम LONG_MIN आज़मा कर देखें)।

सी ++ 11 std::numeric_limits<T>::lowest() जोड़कर, इस मुद्दे का समाधान भी लाता है, जो कि std::numeric_limits<T>::lowest() जोड़कर बातचीत करता है, जो पूर्णांक प्रकारों के लिए सबसे कम मूल्य और फ़्लोटिंग के लिए सबसे कम सकारात्मक मूल्य के बजाय सभी प्रकार के लिए सबसे सीमित मूल्य प्रदान करता है। बिंदु प्रकार।

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