2011-12-31 18 views
79

Tengo un int a que debe ser igual a "infinito". Esto significa que siConfiguración de un int para Infinity en C++

int b = anyValue; 

a>b siempre es cierto.

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

+0

Puedes simplemente usar 'float's, que tienen un valor que representa infinito. – Xeo

+3

Bueno, necesitas algo similar al infinito para implementar un ejemplo básico del algoritmo de Dijkstra. – jozefg

+1

@jozefg - De acuerdo, entonces no se trata de un control que el usuario busca, solo la implementación del lenguaje 'Max Value '. – keyboardP

Respuesta

48

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

a>=b 

siempre es cierto.

podría hacer 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 al 2147483647

Si realmente necesita un cierto valor "infinito", que tendría que utilizar un doble o un flotador. A continuación, puede hacer esto

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

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

feliz Codificación!

Nota: Como se menciona WTP, si es absolutamente necesario tener un int que sea "infinito", debería 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 proyectos .

+4

... y si desea usar 'max()' o 'infinito()' en una plantilla donde el tipo numérico es desconocido, necesitará usar '+/- infinito()' iff 'std :: numeric_limits :: has_infinity' y de lo contrario 'min()' y 'max()' –

91

Los enteros son inherentemente finitos. Lo más cerca que se puede conseguir es mediante el establecimiento de a al valor máximo int 's:

#include <limits> 

// ... 

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

lo que sería 2^31 - 1 (o 2 147 483 647) si int es de 32 bits de ancho en su aplicación.

Si realmente necesidad infinito, utiliza un punto flotante tipo de número, como float o double. A continuación, puede obtener el infinito con:

double a = std::numeric_limits<double>::infinity(); 
+28

Y si * realmente * necesita infinito como ** int **, escriba una clase contenedora que sobrecargue los operadores de comparación y tenga una variable booleana llamada "is_infinity". –

+0

@WTP Considerando que lo necesita para la implementación de un algoritmo de Dijkstra, dudo que sea necesario. Pero es la opción más sensata de lo contrario. –

+3

Agregué el comentario para futuros visitantes que no implementan el algoritmo de Dijkstra, pero lo necesitan para otra cosa. :) –

11

int es intrínsecamente finita; no hay ningún valor que satisfaga sus requisitos.

Si usted está dispuesto a cambiar el tipo de b, sin embargo, usted puede hacer esto con las 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 
} 
+9

* O * ... simplemente podría usar float y 'std :: numeric_limits :: infinito()'. – Xeo

+0

@Xeo, seguro, esa también es una opción :) – bdonlan

-2

int valores mínimo y máximo

Int -2147483648/2147483647 Int 64 -9.223.372.036.854.775.808/9.223.372.036.854.775.807

Creo que se puede establecer una igualdad de 9.223.372.036.854.775.807 pero tendría que ser Int64

si siempre quiere que se forme un grater que b ¿por qué necesita verificarlo? simplemente configúrelo como verdadero siempre

+1

Eso depende de la implementación. No hay "Int64" en C++ (a menos que cuente las cosas en 'cstdint' de C++ 11). –

+0

@Shaun, para ampliar lo que dijo Etienne, http://stackoverflow.com/questions/589575/size-of-int-long-etc explica el significado de 'int' y tipos relacionados en C++. –

+0

Solo he usado embarcadero C++ Builder y tiene un __int64, no sabía que otros C++ tampoco lo tenían. – Shaun07776

1

Este es un mensaje para mí en el futuro:

Sólo tiene que utilizar: (sin firmar) ((int) 0)

Se crea el mayor número posible en cualquier máquina mediante la asignación de todos los bits de 1s (unos) y luego lo arroja a firmar

Aún mejor

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

y sólo tiene que utilizar INF continuación