Установка int в бесконечность в C++


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

int b = anyValue;

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

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

6 86

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

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

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
}

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

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

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

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

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

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

Еще лучше

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

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

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

Я думаю, что вы можете установить a равным 9,223,372,036,854,775,807, но это должно быть int64

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