C ++ में Infinity में इंट की स्थापना


114

मेरे पास int a"अनंत" के बराबर होने की आवश्यकता है। इसका मतलब है कि अगर

int b = anyValue;

a>b हमेशा सच होता है।

क्या C ++ की कोई विशेषता है जो इसे संभव बना सकती है?


आप बस floats का उपयोग कर सकते हैं , जिसमें एक मूल्य है जो अनंत का प्रतिनिधित्व करता है।
Xeo

1
@jozefg - ठीक है, तो यह एक चेक नहीं है जो उपयोगकर्ता के बाद है, बस Max Valueभाषा का कार्यान्वयन।
keyboardP

4
@jozefg हा, मुझे लगा कि आप A * को लागू करने जा रहे हैं। मैं इतना करीब था !
एटीन डे मार्टेल

2
@jozefg - यह समझ में आता है। मैं ओपी वास्तव में प्रदर्शन करने के लिए चाहता था सोचा a>bकी जांच :)
keyboardP

1
@ हाइकरी: नहीं, मैं कह रहा हूं कि पूर्णांक प्रकार में अनंत का प्रतिनिधित्व करने का कोई तरीका नहीं है। आप अतिभारित ऑपरेटरों के साथ एक वर्ग बना सकते हैं।
कीथ थॉम्पसन

जवाबों:


130

इंटेगर स्वाभाविक रूप से परिमित हैं। निकटतम आप प्राप्त कर सकते हैं की स्थापना कर रहा है aकरने के लिए intकी अधिकतम मूल्य:

#include <limits>

// ...

int a = std::numeric_limits<int>::max();

कौन होगा 2^31 - 1(या 2 147 483 647) अगर intआपके क्रियान्वयन के 32 बिट चौड़ा है।

यदि आपको वास्तव में अनंत की आवश्यकता है, तो फ्लोटिंग पॉइंट नंबर टाइप का उपयोग करें, जैसे floatया double। फिर आप के साथ अनंत प्राप्त कर सकते हैं:

double a = std::numeric_limits<double>::infinity();

37
और अगर आप वास्तव में एक के रूप में अनंत की जरूरत पूर्णांक , एक आवरण वर्ग कि भार के तुलना ऑपरेटरों लिख सकते हैं और "is_infinity" नामक एक बूलियन चर है।

@TP यह ध्यान में रखते हुए कि उसे दिक्जस्ट्रा के एल्गोरिथ्म कार्यान्वयन के लिए, मुझे संदेह है कि यह आवश्यक होगा। लेकिन यह अन्यथा सबसे समझदार विकल्प है।
एटिएन डे मार्टेल

4
मैंने भविष्य के आगंतुकों के लिए टिप्पणी को जोड़ा, जो दिज्कस्ट्रा के एल्गोरिथ्म को लागू नहीं करते हैं, लेकिन इसके लिए कुछ और चाहिए। :)

लगता है कि हमें यहां एक गोल्ड बैज के लिए एक उम्मीदवार मिला। :) आप दोनों के लिए +1!
18

2
ध्यान दें कि यदि आप intसमाधान का उपयोग करते हैं, तो आपको अंकगणित से बहुत सावधान रहना चाहिए: "अनंत" में एक सकारात्मक संख्या जोड़ने से बहुत अप्रत्याशित परिणाम प्राप्त होगा।
लैम्ब्डा फेयरी

67

इंटेर्ज़ परिमित हैं, इसलिए दुख की बात है कि आपने इसे एक वास्तविक अनंतता के लिए निर्धारित नहीं किया है। हालाँकि आप इसे किसी int के अधिकतम मान पर सेट कर सकते हैं, इसका मतलब यह होगा कि यह किसी भी अन्य int यानी की तुलना में अधिक या बराबर होगा:

a>=b

हमेशा सच होता है।

आप ऐसा करेंगे

#include <limits>

//your code here

int a = std::numeric_limits<int>::max();

//go off and lead a happy and productive life

यह सामान्य रूप से 2,147,483,647 के बराबर होगा

यदि आपको वास्तव में एक "अनंत" मूल्य की आवश्यकता है, तो आपको एक डबल या फ्लोट का उपयोग करना होगा। तो आप बस यह कर सकते हैं

float a = std::numeric_limits<float>::infinity();

संख्यात्मक सीमाओं के अतिरिक्त स्पष्टीकरण यहां देखे जा सकते हैं

हैप्पी कोडिंग!

नोट: जैसा कि WTP ने उल्लेख किया है, अगर "int" का एक इंट होना आवश्यक है, तो आपको एक int के लिए एक रैपर क्लास लिखना होगा और तुलना ऑपरेटरों को ओवरलोड करना होगा, हालांकि यह संभवतः अधिकांश परियोजनाओं के लिए आवश्यक नहीं है।


6
... और यदि आप उपयोग करना चाहते हैं max()या infinity()एक ऐसे टेम्पलेट में जहां संख्यात्मक प्रकार अज्ञात है, तो आपको +/-infinity()iff std::numeric_limits<T>::has_infinityऔर अन्यथा का उपयोग करने की आवश्यकता होगी min()औरmax()
बेन जैक्सन

13

intस्वाभाविक रूप से परिमित है; ऐसा कोई मूल्य नहीं है जो आपकी आवश्यकताओं को पूरा करता हो।

यदि आप के प्रकार को बदलने के लिए तैयार हैं b, हालांकि, आप ऑपरेटर ओवरराइड के साथ ऐसा कर सकते हैं:

class infinitytype {};

template<typename T>
bool operator>(const T &, const infinitytype &) {
  return false;
}

template<typename T>
bool operator<(const T &, const infinitytype &) {
  return true;
}

bool operator<(const infinitytype &, const infinitytype &) {
  return false;
}


bool operator>(const infinitytype &, const infinitytype &) {
  return false;
}

// add operator==, operator!=, operator>=, operator<=...

int main() {
  std::cout << ( INT_MAX < infinitytype() ); // true
}

10
या ... आप फ्लोट का उपयोग कर सकते हैं और std::numeric_limits<float>::infinity()
Xeo

1
@ Xeo, निश्चित रूप से, यह भी एक विकल्प है :)
bdonlan

5

यह भविष्य में मेरे लिए एक संदेश है:

महज प्रयोग करें: (unsigned)!((int)0)

यह किसी भी मशीन में 1s (वाले) को सभी बिट्स असाइन करके सबसे बड़ी संभव संख्या बनाता है और फिर इसे अहस्ताक्षरित कर देता है

और भी बेहतर

#define INF (unsigned)!((int)0)

और फिर बस अपने कोड में INF का उपयोग करें


4
मुझे लगता है कि आपका मतलब है #define INF ((unsigned) ~0), यहां देखें ।
पॉल सैंडर्स


-2

int न्यूनतम और अधिकतम मान

इंट -2,147,483,648 / 2,147,483,647 इंट 64 -9,223,372,036,854,775,808 / 9,223,372,036,854,775,807

मुझे लगता है कि आप 9,223,372,036,854,775,807 के बराबर सेट कर सकते हैं, लेकिन इसके लिए एक int64 होना चाहिए

यदि आप हमेशा चाहते हैं कि ग्रेटर बी हो तो आपको इसकी जांच करने की आवश्यकता क्यों है? बस इसे हमेशा सच होने के लिए सेट करें


1
यह कार्यान्वयन पर निर्भर करता है। C ++ में कोई "Int64" नहीं है (जब तक कि आप C ++ 11 में सामान की गिनती नहीं करते हैं cstdint)।
एटिएन डे मार्टेल

@ शॉन, एटिने ने जो कहा, उस पर विस्तार करने के लिए, stackoverflow.com/questions/589575/size-of-int-long-etcint C ++ का अर्थ और संबंधित प्रकार बताता है।
माइक शमूएल

मैंने केवल एम्बैरेडेरो सी ++ बिल्डर का उपयोग किया है और इसमें __int64 है, मुझे नहीं पता था कि अन्य सी ++ के पास भी नहीं था।
शौन ० .६ Sha६
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.