Установка int в Infinity в C ++

114

У меня есть значение, int aкоторое должно быть равно "бесконечности". Это означает, что если

int b = anyValue;

a>b всегда правда.

Есть ли какая-нибудь особенность C ++, которая могла бы сделать это возможным?

Даниэль Гратцер
источник
Вы можете просто использовать floats, значение которых представляет бесконечность.
Xeo
1
@jozefg - Хорошо, значит, пользователю нужна не проверка, а Max Valueреализация языка.
keyboardP
4
@jozefg Ха, я подумал, что вы собираетесь реализовать A *. Я был так близок!
Этьен де Мартель
2
@jozefg - В этом есть смысл. Я подумал, что OP действительно хотел провести a>bпроверку :)
keyboardP
1
@Hikari: Нет, я говорю, что нет способа представить бесконечность целым типом. Вы можете создать класс с перегруженными операторами.
Кейт Томпсон,

Ответы:

131

Целые числа по своей природе конечны. Ближайший вы можете получить, установив 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
Я добавил комментарий для будущих посетителей, которые не реализуют алгоритм Дейкстры, но нуждаются в нем для чего-то другого. :)
Похоже, у нас здесь есть кандидат на золотой значок. :) +1 для вас обоих!
Mysticial
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

Если вам действительно нужно истинное «бесконечное» значение, вам придется использовать double или float. Тогда вы можете просто сделать это

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
}
bdonlan
источник
10
Или ... вы можете просто использовать float и std::numeric_limits<float>::infinity().
Xeo
1
@Xeo, конечно, это тоже вариант :)
bdonlan
5

Это сообщение для меня в будущем:

Просто используйте: (unsigned)!((int)0)

Он создает максимально возможное число на любой машине, присваивая все биты единицам (единицам), а затем преобразует его в беззнаковый

Даже лучше

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

А затем просто используйте INF в своем коде

Уилмер Э. Энао
источник
4
Я думаю, вы имеете в виду #define INF ((unsigned) ~0), смотрите здесь .
Пол Сандерс
-2

int min и max значения

Инт -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

если ты всегда хочешь, чтобы а было больше, то б зачем тебе это проверять? просто сделай так, чтобы это всегда было правдой

Shaun07776
источник
1
Это зависит от реализации. В C ++ нет "Int64" (если вы не учитываете вещи в C ++ 11 cstdint).
Этьен де Мартель
@Shaun, чтобы подробнее рассказать о том, что сказал Этьен, stackoverflow.com/questions/589575/size-of-int-long-etc объясняет значение intи связанные с ними типы в C ++.
Майк Сэмюэл
Я когда-либо использовал конструктор embarcadero c ++, и у него есть __int64, я не знал, что у другого c ++ его тоже нет.
Shaun07776