Встановлення int до нескінченності в C ++


114

У мене є int aте, що повинно дорівнювати "нескінченності". Це означає, що якщо

int b = anyValue;

a>b завжди правда.

Чи є якась функція C ++, яка могла б зробити це можливим?


Ви можете просто використовувати floats, які мають значення, що представляє нескінченність.
Xeo

1
@jozefg - Гаразд, тому користувач не перевіряє це, а лише Max Valueвпровадження мови.
клавіатураP

4
@jozefg Ha, я подумав, що ти збираєшся реалізувати A *. Я був такий близько!
Етьєн де Мартель

2
@jozefg - Це має сенс. Я думав, що ОП хотів насправді виконати a>bперевірку :)
клавіатураP

1
@Hikari: Ні, я кажу, що не існує способу представити нескінченність у цілому типі. Ви можете створити клас із перевантаженими операторами.
Кіт Томпсон

Відповіді:


130

Цілі числа за своєю суттю є кінцевими. Найближчий ви можете отримати, встановивши aв int«s максимального значення:

#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
І якщо вам дійсно потрібна нескінченність як int , напишіть клас обгортки, який перевантажує оператори порівняння і має булеву змінну під назвою "is_infinity".

@WTP Враховуючи, що він потрібен для реалізації алгоритму Діккстри, я сумніваюся, що це буде необхідно. Але це найбільш розумний вибір інакше.
Етьєн де Мартель

4
Я додав коментар для майбутніх відвідувачів, які не реалізують алгоритм Dijkstra, але потребують його для чогось іншого. :)

Схоже, ми тут отримали кандидата на золотий знак. :) +1 для вас обох!
Містичний

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
Або ... ви могли просто використовувати float і 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 min та max

Int -2,147,483,648 / 2,147,483,647 Int 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).
Етьєн де Мартель

@Shaun, щоб розширити те, що сказав Етьєн, stackoverflow.com/questions/589575/size-of-int-long-etc пояснює значення intта пов'язані з ними типи в C ++.
Майк Самуель

Я тільки коли-небудь використовував embarcadero c ++ builder, і він має __int64, я не знав, що інші c ++ також не мали його.
Shaun07776
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.