2012-12-13 42 views
24

मैं Setting an int to Infinity in C++ पढ़ रहा था। मैं समझता हूं कि जब किसी को वास्तविक अनंतता की आवश्यकता होती है, तो उसे numeric_limits<float>::infinity() का उपयोग करना चाहिए; मैं तर्क लगता है कि इसके पीछे जो आमतौर पर अभिन्न प्रकार कोई मान Inf, आदि आईईईई की तरह 754 तैरता है (फिर से सी ++ न जनादेश नहीं है NaN, जैसे विशेष राज्यों का प्रतिनिधित्व करने के लिए नामित किया है - int & float इस्तेमाल किया छोड़ दिया जाता है कार्यान्वयन के लिए); लेकिन फिर भी यह किसी दिए गए प्रकार के लिए max > infinity भ्रामक है। मैं मानक में इस कॉल के पीछे तर्क को समझने की कोशिश कर रहा हूं। यदि infinity किसी प्रकार के लिए समझ में नहीं आता है, तो इसे वैधता के लिए ध्वज की जांच करने के बजाय इसे अस्वीकृत नहीं किया जाना चाहिए?संख्यात्मक_limits क्यों है <int> :: अधिकतम()> numeric_limits <int> :: अनंतता()?

+7

क्या आप सुनिश्चित हैं कि 'numeric_limits :: has_infinity' 'true' है? यदि ऐसा नहीं है, तो मानक को अर्थहीन होने के लिए 'अनंतता() 'की आवश्यकता नहीं होती है। – Angew

+1

http://en.cppreference.com/w/cpp/types/numeric_limits/has_infinity – BoBTFish

+1

हाँ, जैसा कि मैंने प्रश्न में उल्लेख किया है, कोई अपनी अंतर्निहित प्रकृति के कारण एक पूर्णांक मान का उपयोग करके अनंतता का प्रतिनिधित्व नहीं कर सकता है, लेकिन फिर भी जो कोडर नहीं है 'है_इनफिनिटी()' उपर्युक्त रेखा को आजमाने की कोशिश कर रहा है उसके पैर को अच्छा और चौकोर शूट करेगा; यह अनजान लगता है। – legends2k

उत्तर

31

फ़ंक्शन numeric_limits<T>::infinity() उन T के लिए समझ में आता है जिसके लिए numeric_limits<T>::has_infinitytrue देता है।

T=int के मामले में, यह false देता है। इसलिए तुलनात्मकता समझ में नहीं आती है, क्योंकि numeric_limits<int>::infinity() किसी भी अर्थपूर्ण मूल्य की तुलना करने के लिए वापस नहीं लौटाता है।

+8

वास्तव में, मानक _requires_ गैर-सार्थक मान '0' या' false' होने के लिए। –

+0

@JamesKanze धन्यवाद! जानना अच्छा है :) – legends2k

+0

हमें तुलना करने की अनुमति क्यों दी जाती है जो समझ में नहीं आता है? अगर कोई 'numeric_limits :: अनंतता() 'का उपयोग करने का प्रयास करता है तो संकलन समय पर विफल क्यों न करें? – eddi

6

यदि आप उदा। पढ़ते हैं this reference आपको एक तालिका दिखाई देगी जो अनंतांक प्रकारों के लिए शून्य होने के लिए अनंतता दिखाती है। ऐसा इसलिए है क्योंकि सी ++ में पूर्णांक प्रकार परिभाषा के अनुसार अनंत नहीं हो सकते हैं।

0

numeric_limits<int>::infinity() उपलब्ध होने पर सकारात्मक अनंतता का प्रतिनिधित्व देता है।

पूर्णांकों के मामले में, सकारात्मक अनंत मौजूद नहीं है:

cout << "int has infinity: " << numeric_limits<int>::has_infinity << endl; 

प्रिंट

int has infinity: false 
4

मान लीजिए, इसके विपरीत, मानक किया आरक्षित inifity प्रतिनिधित्व करने के लिए कुछ मूल्य, और कहा कि numeric_limits<int>::infinity() > numeric_limits<int>::max()। इसका मतलब है कि int का कुछ मूल्य होगा जो max() से अधिक है, यानी int का कुछ प्रतिनिधित्व मूल्य int के सबसे बड़े प्रतिनिधित्व मूल्य से अधिक है।

स्पष्ट रूप से, मानक निर्दिष्ट करता है, कुछ प्राकृतिक समझ का उल्लंघन किया जाता है। या तो inifinity() <= max(), या एक्स मौजूद है जैसे कि int(x) > max()। मानक को चुनना चाहिए कि प्रकृति का कौन सा नियम उल्लंघन करना है।

मुझे विश्वास है कि उन्होंने बुद्धिमानी से चुना है।

+2

एक तीसरा विकल्प है: कोड को अस्वीकार करने के लिए कार्यान्वयन की आवश्यकता है जो 'numeric_limits :: अनंतता()' का उपयोग करता है - जो मेटाप्रोग्रामिंग के साथ संभव है। – Nawaz

+0

@ Robᵩ यह सही लगता है; हालांकि मैं कहूंगा, जैसे नवाज ने सुझाव दिया था, यह उन प्रकारों से बचा जा सकता था जिनके पास SFINAE का उपयोग करके अनंतता का प्रतिनिधित्व नहीं होता है, लेकिन मुझे लगता है कि इन कार्यों को मेटा-प्रोग्रामिंग के आगमन से पहले परिभाषित किया गया था। – legends2k

+0

यह भी दिखाता है कि भाषा प्रोजेक्ट्स जो मशीन करता है, वह है, जो मेरी राय में बहुत अच्छा नहीं है क्योंकि बाद में मान लीजिए कि कुछ उपन्यास मशीन की वास्तुकला अभिन्न प्रकारों के लिए अनंतता का समर्थन करती है, तो इसकी 'है_इनफिनिटी' सच होगी, और इसलिए यह प्रोग्रामर है जिसे अपने मानसिक मॉडल में एक और अपवाद जोड़ना है। यह ठीक है जो जो कोडर के लिए सी ++ विशेषज्ञ-अनुकूल और जटिल बनाता है। – legends2k