সি ++ তে ইনফিনিটিতে একটি ইন্ট সেট করা


114

আমার একটি আছে int aযা "অনন্ত" এর সমান হওয়া দরকার। এর অর্থ হল যে যদি

int b = anyValue;

a>b সর্বদা সত্য।

সি ++ এর কোনও বৈশিষ্ট্য যা এটি সম্ভব করে দিতে পারে?


আপনি কেবল floatএস ব্যবহার করতে পারেন , যার একটি মূল্য রয়েছে যা অনন্তকে উপস্থাপন করে।
Xeo

1
@ জোজেফগ - ঠিক আছে, সুতরাং এটি ব্যবহারকারীর পরে নেই কেবল Max Valueভাষার প্রয়োগের জন্য check
keyboardP

4
@ জোজেফগ হা, আমি বুঝতে পেরেছিলাম আপনি A * বাস্তবায়ন করতে যাচ্ছেন। আমি এত কাছে ছিলাম !
এতিয়েন ডি মার্টেল

2
@ জোজেফগ - এটি উপলব্ধি করে। আমি ওপি আসলে সম্পাদন করতে চেয়েছিলেন চিন্তা a>bচেক :)
keyboardP

1
@ হিকারি: না, আমি বলছি যে পূর্ণসংখ্যার ধরণে অনন্তর উপস্থাপন করার কোনও উপায় নেই। আপনি ওভারলোডেড অপারেটরগুলির সাথে একটি শ্রেণি তৈরি করতে পারেন।
কিথ থম্পসন

উত্তর:


130

পূর্ণসংখ্যা সহজাতভাবে সীমাবদ্ধ। নিকটস্থ আপনি পেতে পারেন সেট করে হয় aথেকে intএর সর্বোচ্চ মান:

#include <limits>

// ...

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

আপনার প্রয়োগে 32 বিট প্রশস্ত হলে কোনটি 2^31 - 1(বা 2 147 483 647) হবে int

আপনি যদি সত্যিই অনন্ত প্রয়োজন, একটি ফ্লোটিং পয়েন্ট সংখ্যা টাইপ ব্যবহার মত floatবা double। তারপরে আপনি এতে অনন্ততা পেতে পারেন:

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

37
এবং যদি আপনি সত্যিই একটি যেমন অনন্ত প্রয়োজন int- এ , একটি রাপার ক্লাস যে overloads তুলনা অপারেটরদের লিখে "is_infinity" নামে একটি বুলিয়ান পরিবর্তনশীল হয়েছে।

@ ডব্লিউটিপি একটি বিবেচনা করে যে ডিজকস্ট্রার অ্যালগরিদম বাস্তবায়নের জন্য আমার সন্দেহ হয় যে এটি প্রয়োজনীয় হবে। তবে এটি অন্যথায় সবচেয়ে বুদ্ধিমান পছন্দ।
এটিয়েন ডি মার্টেল

4
আমি ভবিষ্যতের দর্শকদের জন্য মন্তব্যটি যুক্ত করেছি যারা ডিজকস্ট্রার অ্যালগরিদম বাস্তবায়ন করে না, তবে অন্য কিছুর জন্য এটির প্রয়োজন need :)

দেখে মনে হচ্ছে আমরা এখানে সোনার ব্যাজটির জন্য প্রার্থী পেয়েছি। :) আপনার দুজনের জন্যই +1!
রহস্যময়

2
দ্রষ্টব্য যে আপনি যদি intসমাধানটি ব্যবহার করেন তবে আপনাকে অবশ্যই গাণিতিক সম্পর্কে খুব সতর্কতা অবলম্বন করা উচিত: "অনন্ত" -এ একটি ধনাত্মক সংখ্যা যুক্ত করা খুব অপ্রত্যাশিত ফলাফল এনে দেবে।
লাম্বদা পরী

67

পূর্ণসংখ্যা সীমাবদ্ধ, তাই দুঃখের বিষয় আপনি এটিকে সত্যিকারের অনন্তরে সেট করতে পারেন না। তবে আপনি এটিকে কোনও 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();

সংখ্যার সীমা সম্পর্কিত অতিরিক্ত ব্যাখ্যা এখানে পাওয়া যাবে

শুভ কোডিং!

দ্রষ্টব্য: ডব্লিউটিপি যেমন উল্লেখ করেছে, "ইনফিনেট" এমন একটি অন্তর্ভুক্ত থাকা যদি একেবারে প্রয়োজন হয় তবে আপনাকে কোনও ইনট জন্য একটি র‌্যাপার ক্লাস লিখতে হবে এবং তুলনা অপারেটরদের ওভারলোড করতে হবে, যদিও এটি বেশিরভাগ প্রকল্পের জন্য সম্ভবত প্রয়োজনীয় নয়।


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()
Xoo

1
@ শিও, নিশ্চিত, এটিও একটি বিকল্প :)
বিডনলান

5

ভবিষ্যতে এটি আমার জন্য একটি বার্তা:

শুধু ব্যবহার করুন: (unsigned)!((int)0)

এটি 1 ম (সমস্ত) কে সমস্ত বিট বরাদ্দ করে কোনও মেশিনে সর্বাধিক সম্ভাব্য সংখ্যা তৈরি করে এবং পরে এটি স্বাক্ষরবিহীন অবস্থায় কাস্ট করে

আর ভালো

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

এবং তারপরে আপনার কোডটিতে কেবল আইএনএফ ব্যবহার করুন


4
আমার মনে হয় আপনি অর্থ #define INF ((unsigned) ~0)দেখতে এখানে
পল স্যান্ডার্স


-2

কমপক্ষে মিনিট এবং সর্বাধিক মান

আন্ত -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 এর সমান হতে পারে তবে এটি একটি 64 এর দরকার হবে

আপনি যদি সর্বদা খাঁটি হতে চান তবে খ কেন এটি পরীক্ষা করা দরকার? এটি সর্বদা সত্য হতে সেট করুন


1
এটি বাস্তবায়নের উপর নির্ভর করে। সি ++ তে কোনও "ইন্টার64" নেই (আপনি যদি সি ++ 11 এর মধ্যে স্টাফ গণনা করেন না cstdint)।
এটিয়েন ডি মার্টেল

@Shaun, কি Etienne বললেন, উপর প্রসারিত করতে stackoverflow.com/questions/589575/size-of-int-long-etc অর্থ ব্যাখ্যা intসি ও সংশ্লিষ্ট ধরনের ++,।
মাইক স্যামুয়েল

আমি কেবল এম্বারক্যাডেরো সি ++ বিল্ডার ব্যবহার করেছি এবং এটির একটি __int64 রয়েছে, আমি অন্যান্য সি ++ তেও এটি জানতাম না।
শান07776
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.