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

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

int b = anyValue;

a>b всегда верно.

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


person Daniel Gratzer    schedule 31.12.2011    source источник
comment
Вы можете просто использовать floats, значение которых представляет бесконечность.   -  person Xeo    schedule 01.01.2012
comment
@jozefg - Хорошо, значит, пользователю нужна не проверка, а только Max Value реализация языка.   -  person keyboardP    schedule 01.01.2012
comment
@keyboardP Да, похоже, я имею в виду, что использовал это, когда реализую алгоритмы для минимизации.   -  person Daniel Gratzer    schedule 01.01.2012
comment
@jozefg Ха, я подумал, вы собираетесь реализовать A *. Я был так близок!   -  person Etienne de Martel    schedule 01.01.2012
comment
@Xeo: Если вам нужны дискретные значения, float - не решение. Легко представить себе тип данных, значениями которого являются -Infinity, INT_MIN, ..., 0, ..., INT_MAX, +Infinity. В C ++ такого типа просто нет.   -  person Keith Thompson    schedule 01.01.2012
comment
@jozefg - В этом есть смысл. Я думал, что OP действительно хочет выполнить a>b проверку :)   -  person keyboardP    schedule 01.01.2012
comment
C ++ позволяет довольно легко определить класс с требуемыми характеристиками. Чтобы избежать ограничения фактических значений, которые могут храниться в базовом целочисленном, вам нужно будет поддерживать значение текущего флага состояния бесконечности и проверять это в коде, чтобы переопределить операторы сравнения, скопируйте / добавьте значения и т. д. Вам придется переопределить множество операторов, но все это просто повторяющиеся мелочи.   -  person FumbleFingers    schedule 01.01.2012
comment
@FumbleFinger: и, вероятно, значительно повлияет на производительность. Я помню, как в прошлом году читал статью, в которой автор жаловался на отсутствие +/- inf и NaN для целых чисел, с которыми будет иметь дело аппаратное обеспечение, вместо неприятного поведения undefined при недополнении / переполнении, которое мы получаем. по умолчанию. Вот если бы я только мог вспомнить, где я это читал ...   -  person Matthieu M.    schedule 01.01.2012
comment
@Matthieu M: Не заставляйте меня начинать! В реальном мире я считаю, что просьба OP - пустяк. Физики-теоретики десятилетиями пытались избавиться от бесконечностей в своих уравнениях, но это оказалось очень сложно. И здесь у нас есть парень, который хочет привнести бесконечность в программирование - вероятно, потому, что он не знает, как, или не может позаботиться о том, чтобы спроектировать свой алгоритм и код разумно в первую очередь.   -  person FumbleFingers    schedule 01.01.2012
comment
@FumbleFingers: тем не менее, вас не беспокоит, что std::numeric_limits<int>::min() - 1 == std::numeric_limits<int>::max() в большинстве реализаций (технически это не определено)? Лично я бы предпочел, чтобы оно было равно std::numeric_limits<int>::minusinfinity() и испортило остальную часть выражения.   -  person Matthieu M.    schedule 01.01.2012
comment
@Matthieu: Я никогда не использовал шаблон numeric_limits, но отмечу, что он поддерживает такие атрибуты, как can support infinity и is bounded. Если OP действительно нужна переменная, способная поддерживать бесконечность, ему понадобится что-то в этом роде. Но если бы он всерьез думал, что сможет каким-то образом обойти проблему, используя стандартный int, он, вероятно, был бы не в своей тарелке с таким уровнем абстракции.   -  person FumbleFingers    schedule 01.01.2012
comment
@KeithThompson, извините за некро, но просто чтобы прояснить, поскольку у меня аналогичная проблема. Вы рекомендуете решить эту проблему, используя a = INT_MAX;, верно? Или вы ссылаетесь на другую функцию?   -  person Callat    schedule 20.04.2016
comment
@Hikari: Нет, я говорю, что нет способа представить бесконечность целым типом. Вы можете создать класс с перегруженными операторами.   -  person Keith Thompson    schedule 20.04.2016


Ответы (6)


Целые числа по своей природе конечны. Самое близкое, что вы можете получить, - это установить 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();
person Etienne de Martel    schedule 31.12.2011
comment
И если вам действительно нужна бесконечность как int, напишите класс-оболочку, который перегружает операторы сравнения и имеет логическую переменную с именем is_infinity. - person ; 01.01.2012
comment
@WTP Учитывая, что ему это нужно для реализации алгоритма Дейкстры, я сомневаюсь, что это будет необходимо. Но в противном случае это наиболее разумный выбор. - person Etienne de Martel; 01.01.2012
comment
Я добавил комментарий для будущих посетителей, которые не реализуют алгоритм Дейкстры, но нуждаются в нем для чего-то другого. :) - person ; 01.01.2012
comment
Похоже, у нас здесь есть кандидат на золотой значок. :) +1 для вас обоих! - person Mysticial; 01.01.2012
comment
Обратите внимание, что если вы используете решение int, вы должны быть очень осторожны с арифметикой: добавление положительного числа к бесконечности даст очень неожиданный результат. - person Lambda Fairy; 01.08.2014
comment
Класс Wrapper пригодится для сравнения векторов. - person dylan; 17.09.2017
comment
Есть ли способ инициализировать с помощью -infinity? - person mnis.p; 24.08.2018
comment
@ mnis.p Предполагая, что ваша реализация использует двойники IEEE 754, вы можете использовать -std::numeric_limits<double>::infinity(). - person Etienne de Martel; 24.08.2018

Целые числа конечны, поэтому, к сожалению, вы не можете установить для них истинную бесконечность. Однако вы можете установить для него максимальное значение 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 и перегрузить операторы сравнения, хотя это, вероятно, не обязательно для большинства проектов.

person Daniel Gratzer    schedule 31.12.2011
comment
... и если вы хотите использовать max() или infinity() в шаблоне, где числовой тип неизвестен, вам нужно будет использовать +/-infinity() iff std::numeric_limits<T>::has_infinity, а в противном случае min() и max() - person Ben Jackson; 01.01.2012

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

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

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

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

Даже лучше

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

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

person Wilmer E. Henao    schedule 22.11.2017
comment
Я думаю, вы имеете в виду #define INF ((unsigned) ~0), см. здесь. - person Paul Sanders; 22.06.2018

Вы также можете использовать INT_MAX:

http://www.cplusplus.com/reference/climits/

это эквивалентно использованию numeric_limits.

person nicodjimenez    schedule 05.01.2016

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

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

person Shaun07776    schedule 31.12.2011
comment
Это зависит от реализации. В C ++ нет Int64 (если вы не учитываете вещи в C ++ 11 cstdint). - person Etienne de Martel; 01.01.2012
comment
@Shaun, чтобы расширить сказанное Этьеном, stackoverflow.com/questions/589575/size-of- int-long-etc объясняет значение int и связанных типов в C ++. - person Mike Samuel; 01.01.2012
comment
Я когда-либо использовал конструктор Embarcadero C ++, и у него есть __int64, я не знал, что у других C ++ его тоже нет. - person Shaun07776; 01.01.2012