Configurando um int para Infinity em C ++

114

Eu tenho um int aque precisa ser igual ao "infinito". Isso significa que se

int b = anyValue;

a>b é sempre verdade.

Existe algum recurso do C ++ que poderia tornar isso possível?

Daniel Gratzer
fonte
Você poderia apenas usar floats, que têm um valor que representa o infinito.
Xeo
1
@jozefg - Ok, então não é uma verificação que o usuário busca, apenas a Max Valueimplementação da linguagem.
teclado
4
@jozefg Ha, imaginei que você implementaria A *. Eu estava tão perto!
Etienne de Martel
2
@jozefg - Isso faz sentido. Achei que OP queria realmente fazer a a>bverificação :)
keyboardP
1
@Hikari: Não, estou dizendo que não há como representar o infinito em um tipo inteiro. Você pode criar uma classe com operadores sobrecarregados.
Keith Thompson de

Respostas:

130

Os inteiros são inerentemente finitos. O mais próximo que você pode obter é através da criação ade int's valor máximo:

#include <limits>

// ...

int a = std::numeric_limits<int>::max();

Que seria 2^31 - 1(ou 2 147 483 647) se tivesse int32 bits de largura em sua implementação.

Se você realmente precisa do infinito, use um tipo de número de ponto flutuante, como floatou double. Você pode obter o infinito com:

double a = std::numeric_limits<double>::infinity();
Etienne de Martel
fonte
37
E se você realmente precisar do infinito como um int , escreva uma classe wrapper que sobrecarregue os operadores de comparação e tenha uma variável booleana chamada "is_infinity".
@WTP Considerando que ele precisa disso para a implementação de um algoritmo de Dijkstra, duvido que seja necessário. Mas é a escolha mais sensata de outra forma.
Etienne de Martel
4
Eu adicionei o comentário para futuros visitantes que não implementam o algoritmo de Dijkstra, mas precisam dele para outra coisa. :)
Parece que temos um candidato a um distintivo dourado aqui. :) +1 para vocês dois!
Mysticial 01 de
2
Observe que se você usar a intsolução, deve ter muito cuidado com a aritmética: adicionar um número positivo ao "infinito" produzirá um resultado muito inesperado.
Lambda Fairy
67

Os inteiros são finitos, portanto, infelizmente, você não pode defini-los como um infinito verdadeiro. No entanto, você pode defini-lo com o valor máximo de um int, isso significaria que seria maior ou igual a qualquer outro int, ou seja:

a>=b

é sempre verdade.

Você faria isso por

#include <limits>

//your code here

int a = std::numeric_limits<int>::max();

//go off and lead a happy and productive life

Isso normalmente será igual a 2.147.483.647

Se você realmente precisa de um valor "infinito" verdadeiro, terá que usar um double ou um float. Então você pode simplesmente fazer isso

float a = std::numeric_limits<float>::infinity();

Explicações adicionais sobre os limites numéricos podem ser encontradas aqui

Happy Coding!

Nota: Como WTP mencionou, se for absolutamente necessário ter um int que seja "infinito", você teria que escrever uma classe wrapper para um int e sobrecarregar os operadores de comparação, embora isso provavelmente não seja necessário para a maioria dos projetos.

Daniel Gratzer
fonte
6
... e se você quiser usar max()ou infinity()em um modelo onde o tipo numérico é desconhecido, você precisará usar +/-infinity()iff std::numeric_limits<T>::has_infinitye de outra forma min()emax()
Ben Jackson
13

inté inerentemente finito; não há valor que atenda às suas necessidades.

Se você deseja alterar o tipo de b, no entanto, pode fazer isso com as substituições de operador:

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
fonte
10
Ou ... você pode apenas usar float e std::numeric_limits<float>::infinity().
Xeo
1
@Xeo, claro, essa também é uma opção :)
bdonlan
5

Esta é uma mensagem para mim no futuro:

Apenas use: (unsigned)!((int)0)

Ele cria o maior número possível em qualquer máquina, atribuindo todos os bits a 1s (uns) e, em seguida, converte-o em sem sinal

Melhor ainda

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

E então é só usar INF em seu código

Wilmer E. Henao
fonte
4
Eu acho que você quer dizer #define INF ((unsigned) ~0), veja aqui .
Paul Sanders de
-2

valores mínimos e máximos int

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

eu acho que você poderia definir a igual a 9.223.372.036.854.775.807, mas seria necessário ser um int64

se você sempre quer a ser maior que b, por que você precisa verificar? apenas configure para ser verdade sempre

Shaun07776
fonte
1
Isso depende da implementação. Não há "Int64" em C ++ (a menos que você conte as coisas em C ++ 11 cstdint).
Etienne de Martel
@Shaun, para expandir o que Etienne disse, stackoverflow.com/questions/589575/size-of-int-long-etc explica o significado inte os tipos relacionados em C ++.
Mike Samuel
Eu só usei o embarcadero c ++ builder e ele tem um __int64, eu não sabia que outro c ++ não tinha também.
Shaun07776