Установка int в бесконечность в C ++ - PullRequest
97 голосов
/ 01 января 2012

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

int b = anyValue;

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

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

Ответы [ 6 ]

110 голосов
/ 01 января 2012

Целые числа по своей природе конечны.Самое близкое, что вы можете получить, установив максимальное значение 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();
59 голосов
/ 01 января 2012

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

12 голосов
/ 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
}
3 голосов
/ 22 ноября 2017

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

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

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

Еще лучше

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

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

2 голосов
/ 05 января 2016

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

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

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

0 голосов
/ 01 января 2012

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, но для этого нужно было бы 10064*

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...