Establecer un int en Infinity en C ++

114

Tengo un int aque debe ser igual a "infinito". Esto significa que si

int b = anyValue;

a>b siempre es cierto.

¿Existe alguna característica de C ++ que pueda hacer esto posible?

Daniel Gratzer
fuente
Podría usar floats, que tiene un valor que representa infinito.
Xeo
1
@jozefg: de acuerdo, no es una comprobación que el usuario busca, solo la Max Valueimplementación del lenguaje.
keyboardP
4
@jozefg Ha, pensé que ibas a implementar A *. ¡Estaba tan cerca!
Etienne de Martel
2
@jozefg - Eso tiene sentido. Pensé que OP quería realizar la a>bverificación :)
keyboardP
1
@Hikari: No, estoy diciendo que no hay forma de representar el infinito en un tipo entero. Podría crear una clase con operadores sobrecargados.
Keith Thompson

Respuestas:

130

Los enteros son inherentemente finitos. Lo más cercano que puede obtener es estableciendo el valor máximo de ato int:

#include <limits>

// ...

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

Cuál sería 2^31 - 1(o 2 147 483 647) si inttiene 32 bits de ancho en su implementación.

Si realmente necesita infinito, use un tipo de número de punto flotante, como floato double. Luego puede obtener el infinito con:

double a = std::numeric_limits<double>::infinity();
Etienne de Martel
fuente
37
Y si realmente necesita infinity como int , escriba una clase contenedora que sobrecargue los operadores de comparación y tenga una variable booleana llamada "is_infinity".
@WTP Teniendo en cuenta que lo necesita para la implementación del algoritmo de Dijkstra, dudo que sea necesario. Pero es la opción más sensata de lo contrario.
Etienne de Martel
4
Agregué el comentario para futuros visitantes que no implementan el algoritmo de Dijkstra, pero lo necesitan para otra cosa. :)
Parece que tenemos un candidato para una insignia de oro aquí. :) +1 para los dos!
Mysticial
2
Tenga en cuenta que si usa la intsolución, debe tener mucho cuidado con la aritmética: agregar un número positivo a "infinito" producirá un resultado muy inesperado.
Lambda Fairy
67

Los enteros son finitos, por lo que, lamentablemente, no puede haberlo establecido en un verdadero infinito. Sin embargo, puede establecerlo en el valor máximo de un int, esto significaría que sería mayor o igual a cualquier otro int, es decir:

a>=b

siempre es cierto.

Harías esto por

#include <limits>

//your code here

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

//go off and lead a happy and productive life

Esto normalmente será igual a 2,147,483,647

Si realmente necesita un valor "infinito" verdadero, tendría que usar un doble o un flotante. Entonces puedes simplemente hacer esto

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

Aquí se pueden encontrar explicaciones adicionales de los límites numéricos.

¡Feliz codificación!

Nota: Como mencionó WTP, si es absolutamente necesario tener un int que sea "infinito", tendría que escribir una clase contenedora para un int y sobrecargar los operadores de comparación, aunque esto probablemente no sea necesario para la mayoría de los proyectos.

Daniel Gratzer
fuente
6
... y si desea usar max()o infinity()en una plantilla donde se desconoce el tipo numérico, deberá usar +/-infinity()iff std::numeric_limits<T>::has_infinityy de lo contrario min()ymax()
Ben Jackson
13

intes inherentemente finito; no hay valor que satisfaga sus requisitos.

Sin embargo, si está dispuesto a cambiar el tipo de b, puede hacerlo con anulaciones 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
fuente
10
O ... podrías usar float y std::numeric_limits<float>::infinity().
Xeo
1
@Xeo, claro, esa también es una opción :)
bdonlan
5

Este es un mensaje para mí en el futuro:

Solo usa: (unsigned)!((int)0)

Crea el mayor número posible en cualquier máquina asignando todos los bits a unos (unos) y luego lo convierte en unsigned

Aun mejor

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

Y luego solo usa INF en tu código

Wilmer E. Henao
fuente
4
Creo que te refieres a #define INF ((unsigned) ~0)ver aquí .
Paul Sanders
-2

valores int min y 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

supongo que podría establecer un igual a 9,223,372,036,854,775,807 pero tendría que ser un int64

si siempre quieres que a sea más rallado, ¿por qué necesitas comprobarlo? solo configúralo para que sea cierto siempre

Shaun07776
fuente
1
Eso depende de la implementación. No hay "Int64" en C ++ (a menos que cuente las cosas en C ++ 11 cstdint).
Etienne de Martel
@Shaun, para ampliar lo que dijo Etienne, stackoverflow.com/questions/589575/size-of-int-long-etc explica el significado inty los tipos relacionados en C ++.
Mike Samuel
Solo he usado embarcadero c ++ builder y tiene un __int64, no sabía que otros c ++ no lo tenían también.
Shaun07776