Définition d'un int sur Infinity en C ++

114

J'ai un int aqui doit être égal à "l'infini". Cela signifie que si

int b = anyValue;

a>b est toujours vrai.

Y a-t-il une fonctionnalité de C ++ qui pourrait rendre cela possible?

Daniel Gratzer
la source
Vous pouvez simplement utiliser floats, qui a une valeur qui représente l'infini.
Xeo
1
@jozefg - D'accord, donc ce n'est pas une vérification que l'utilisateur cherche, juste l' Max Valueimplémentation du langage.
clavierP
4
@jozefg Ha, je pensais que vous alliez implémenter A *. J'étais si proche!
Etienne de Martel
2
@jozefg - Cela a du sens. Je pensais qu'OP voulait réellement effectuer la a>bvérification :)
keyboardP
1
@Hikari: Non, je dis qu'il n'y a aucun moyen de représenter l'infini dans un type entier. Vous pouvez créer une classe avec des opérateurs surchargés.
Keith Thompson

Réponses:

130

Les nombres entiers sont intrinsèquement finis. Le plus proche , vous pouvez obtenir est par la mise aà la intvaleur maximale de:

#include <limits>

// ...

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

Ce qui serait 2^31 - 1(ou 2 147 483 647) si intest de 32 bits de large sur votre implémentation.

Si vous avez vraiment besoin de l'infini, utilisez un type de nombre à virgule flottante, comme floatou double. Vous pouvez alors obtenir l'infini avec:

double a = std::numeric_limits<double>::infinity();
Etienne de Martel
la source
37
Et si vous avez vraiment besoin de l'infini comme int , écrivez une classe wrapper qui surcharge les opérateurs de comparaison et possède une variable booléenne nommée "is_infinity".
@WTP Considérant qu'il en a besoin pour l'implémentation d'un algorithme de Dijkstra, je doute que ce soit nécessaire. Mais c'est le choix le plus judicieux autrement.
Etienne de Martel
4
J'ai ajouté le commentaire pour les futurs visiteurs qui n'implémentent pas l'algorithme de Dijkstra, mais en ont besoin pour autre chose. :)
On dirait que nous avons un candidat pour un badge d'or ici. :) +1 pour vous deux!
Mysticial
2
Notez que si vous utilisez la intsolution, vous devez être très prudent avec l'arithmétique: l'ajout d'un nombre positif à "l'infini" donnera un résultat très inattendu.
Lambda Fairy
67

Les nombres entiers sont finis, si malheureusement vous ne pouvez pas l'avoir défini sur un vrai infini. Cependant, vous pouvez le définir à la valeur maximale d'un int, cela signifierait qu'il serait supérieur ou égal à tout autre int, c'est-à-dire:

a>=b

est toujours vrai.

Vous feriez cela en

#include <limits>

//your code here

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

//go off and lead a happy and productive life

Ce sera normalement égal à 2.147.483.647

Si vous avez vraiment besoin d'une vraie valeur «infinie», vous devrez utiliser un double ou un flottant. Ensuite, vous pouvez simplement le faire

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

Des explications supplémentaires sur les limites numériques peuvent être trouvées ici

Bon codage!

Remarque: Comme WTP l'a mentionné, s'il est absolument nécessaire d'avoir un int qui est "infini", vous devrez écrire une classe wrapper pour un int et surcharger les opérateurs de comparaison, bien que ce ne soit probablement pas nécessaire pour la plupart des projets.

Daniel Gratzer
la source
6
... et si vous voulez utiliser max()ou infinity()dans un modèle où le type numérique est inconnu, vous devrez utiliser +/-infinity()iff std::numeric_limits<T>::has_infinityet autrement min()etmax()
Ben Jackson
13

intest intrinsèquement fini; il n'y a aucune valeur qui satisfait vos exigences.

Si vous souhaitez modifier le type de b, vous pouvez le faire avec des remplacements d'opérateurs:

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
la source
10
Ou ... vous pouvez simplement utiliser float et std::numeric_limits<float>::infinity().
Xeo
1
@Xeo, bien sûr, c'est aussi une option :)
bdonlan
5

C'est un message pour moi dans le futur:

Utilisez simplement: (unsigned)!((int)0)

Il crée le plus grand nombre possible dans n'importe quelle machine en attribuant tous les bits à 1s (uns), puis le convertit en non signé

Encore mieux

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

Et puis utilisez simplement INF dans votre code

Wilmer E. Henao
la source
4
Je pense que vous voulez dire #define INF ((unsigned) ~0), voyez ici .
Paul Sanders
-2

int valeurs min et 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

Je suppose que vous pouvez définir un égal à 9,223,372,036,854,775,807 mais il faudrait qu'il s'agisse d'un int64

si vous voulez toujours que a râpé cela b pourquoi avez-vous besoin de le vérifier? il suffit de le définir pour toujours être vrai

Shaun07776
la source
1
Cela dépend de la mise en œuvre. Il n'y a pas de "Int64" en C ++ (à moins que vous ne comptiez les éléments en C ++ 11 cstdint).
Etienne de Martel
@Shaun, pour développer ce qu'a dit Etienne, stackoverflow.com/questions/589575/size-of-int-long-etc explique la signification intet les types associés en C ++.
Mike Samuel
Je n'ai jamais utilisé que le constructeur embarcadero c ++ et il a un __int64, je ne savais pas que d'autres c ++ ne l'avaient pas aussi.
Shaun07776