मैं Setting an int to Infinity in C++ पढ़ रहा था। मैं समझता हूं कि जब किसी को वास्तविक अनंतता की आवश्यकता होती है, तो उसे numeric_limits<float>::infinity()
का उपयोग करना चाहिए; मैं तर्क लगता है कि इसके पीछे जो आमतौर पर अभिन्न प्रकार कोई मान Inf, आदि आईईईई की तरह 754 तैरता है (फिर से सी ++ न जनादेश नहीं है NaN, जैसे विशेष राज्यों का प्रतिनिधित्व करने के लिए नामित किया है - int
& float
इस्तेमाल किया छोड़ दिया जाता है कार्यान्वयन के लिए); लेकिन फिर भी यह किसी दिए गए प्रकार के लिए max > infinity
भ्रामक है। मैं मानक में इस कॉल के पीछे तर्क को समझने की कोशिश कर रहा हूं। यदि infinity
किसी प्रकार के लिए समझ में नहीं आता है, तो इसे वैधता के लिए ध्वज की जांच करने के बजाय इसे अस्वीकृत नहीं किया जाना चाहिए?संख्यात्मक_limits क्यों है <int> :: अधिकतम()> numeric_limits <int> :: अनंतता()?
उत्तर
फ़ंक्शन numeric_limits<T>::infinity()
उन T
के लिए समझ में आता है जिसके लिए numeric_limits<T>::has_infinity
true
देता है।
T=int
के मामले में, यह false
देता है। इसलिए तुलनात्मकता समझ में नहीं आती है, क्योंकि numeric_limits<int>::infinity()
किसी भी अर्थपूर्ण मूल्य की तुलना करने के लिए वापस नहीं लौटाता है।
वास्तव में, मानक _requires_ गैर-सार्थक मान '0' या' false' होने के लिए। –
@JamesKanze धन्यवाद! जानना अच्छा है :) – legends2k
हमें तुलना करने की अनुमति क्यों दी जाती है जो समझ में नहीं आता है? अगर कोई 'numeric_limits
यदि आप उदा। पढ़ते हैं this reference आपको एक तालिका दिखाई देगी जो अनंतांक प्रकारों के लिए शून्य होने के लिए अनंतता दिखाती है। ऐसा इसलिए है क्योंकि सी ++ में पूर्णांक प्रकार परिभाषा के अनुसार अनंत नहीं हो सकते हैं।
numeric_limits<int>::infinity()
उपलब्ध होने पर सकारात्मक अनंतता का प्रतिनिधित्व देता है।
पूर्णांकों के मामले में, सकारात्मक अनंत मौजूद नहीं है:
cout << "int has infinity: " << numeric_limits<int>::has_infinity << endl;
प्रिंट
int has infinity: false
मान लीजिए, इसके विपरीत, मानक किया आरक्षित inifity प्रतिनिधित्व करने के लिए कुछ मूल्य, और कहा कि numeric_limits<int>::infinity() > numeric_limits<int>::max()
। इसका मतलब है कि int
का कुछ मूल्य होगा जो max()
से अधिक है, यानी int
का कुछ प्रतिनिधित्व मूल्य int के सबसे बड़े प्रतिनिधित्व मूल्य से अधिक है।
स्पष्ट रूप से, मानक निर्दिष्ट करता है, कुछ प्राकृतिक समझ का उल्लंघन किया जाता है। या तो inifinity() <= max()
, या एक्स मौजूद है जैसे कि int(x) > max()
। मानक को चुनना चाहिए कि प्रकृति का कौन सा नियम उल्लंघन करना है।
मुझे विश्वास है कि उन्होंने बुद्धिमानी से चुना है।
एक तीसरा विकल्प है: कोड को अस्वीकार करने के लिए कार्यान्वयन की आवश्यकता है जो 'numeric_limits
@ Robᵩ यह सही लगता है; हालांकि मैं कहूंगा, जैसे नवाज ने सुझाव दिया था, यह उन प्रकारों से बचा जा सकता था जिनके पास SFINAE का उपयोग करके अनंतता का प्रतिनिधित्व नहीं होता है, लेकिन मुझे लगता है कि इन कार्यों को मेटा-प्रोग्रामिंग के आगमन से पहले परिभाषित किया गया था। – legends2k
यह भी दिखाता है कि भाषा प्रोजेक्ट्स जो मशीन करता है, वह है, जो मेरी राय में बहुत अच्छा नहीं है क्योंकि बाद में मान लीजिए कि कुछ उपन्यास मशीन की वास्तुकला अभिन्न प्रकारों के लिए अनंतता का समर्थन करती है, तो इसकी 'है_इनफिनिटी' सच होगी, और इसलिए यह प्रोग्रामर है जिसे अपने मानसिक मॉडल में एक और अपवाद जोड़ना है। यह ठीक है जो जो कोडर के लिए सी ++ विशेषज्ञ-अनुकूल और जटिल बनाता है। – legends2k
क्या आप सुनिश्चित हैं कि 'numeric_limits :: has_infinity' 'true' है? यदि ऐसा नहीं है, तो मानक को अर्थहीन होने के लिए 'अनंतता() 'की आवश्यकता नहीं होती है। –
Angew
http://en.cppreference.com/w/cpp/types/numeric_limits/has_infinity – BoBTFish
हाँ, जैसा कि मैंने प्रश्न में उल्लेख किया है, कोई अपनी अंतर्निहित प्रकृति के कारण एक पूर्णांक मान का उपयोग करके अनंतता का प्रतिनिधित्व नहीं कर सकता है, लेकिन फिर भी जो कोडर नहीं है 'है_इनफिनिटी()' उपर्युक्त रेखा को आजमाने की कोशिश कर रहा है उसके पैर को अच्छा और चौकोर शूट करेगा; यह अनजान लगता है। – legends2k