143 votes

Définir un int à l'infini en C++

J'ai un int a qui 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 ?

1 votes

Vous pouvez simplement utiliser float qui ont une valeur représentant l'infini.

1 votes

@jozefg - Ok, donc ce n'est pas une vérification que l'utilisateur recherche, juste l'option Max Value la mise en œuvre de la langue.

0 votes

@keyboardP Oui, ça y ressemble, je l'ai utilisé pour implémenter des algorithmes de minimisation.

163voto

Etienne de Martel Points 16020

Les nombres entiers sont par nature finis. Le plus proche que vous puissiez obtenir est de définir a a int La valeur maximale de l'entreprise :

#include <limits>

// ...

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

Ce qui serait 2^31 - 1 (ou 2 147 483 647 ) si int est d'une largeur de 32 bits sur votre implémentation.

Si vous vraiment pour l'infini, utilisez un type de nombre à virgule flottante, tel que float o double . Vous pouvez alors obtenir l'infini avec :

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

45 votes

Et si vous vraiment ont besoin de l'infini comme int Pour cela, il faut écrire une classe qui surcharge les opérateurs de comparaison et qui possède une variable booléenne nommée "is_infinity".

1 votes

@WTP Considérant qu'il en a besoin pour l'implémentation de l'algorithme de Dijkstra, je doute que cela soit nécessaire. Mais sinon, c'est le choix le plus judicieux.

5 votes

J'ai ajouté le commentaire pour les futurs visiteurs qui n'implémentent pas l'algorithme de Dijkstra, mais qui en ont besoin pour autre chose :)

82voto

jozefg Points 29997

Les nombres entiers sont finis, donc malheureusement vous ne pouvez pas l'avoir fixé à un véritable infini. Cependant, vous pouvez le définir sur la valeur maximale d'un int, ce qui signifie qu'il serait supérieur ou égal à n'importe quel autre int, c'est à dire :

a>=b

est toujours vrai.

Pour ce faire, vous devez

#include <limits>

//your code here

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

//go off and lead a happy and productive life

Ce chiffre sera normalement égal à 2 147 483 647.

Si vous avez vraiment besoin d'une véritable valeur "infinie", vous devez utiliser un double ou un flottant. Dans ce cas, vous pouvez simplement faire ceci

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

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

Bon codage !

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

9 votes

...et si vous voulez utiliser max() o infinity() dans un modèle où le type numérique est inconnu, vous devrez utiliser +/-infinity() si std::numeric_limits<T>::has_infinity et par ailleurs min() y max()

13voto

bdonlan Points 90068

int est par nature finie ; il n'existe aucune valeur qui satisfasse vos exigences.

Si vous êtes prêt à changer le type de b Cependant, vous pouvez le faire avec des surcharges 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
}

11 votes

O ... vous pourriez simplement utiliser float et std::numeric_limits<float>::infinity() .

1 votes

@Xeo, bien sûr, c'est aussi une option :)

13voto

Wilmer E. Henao Points 2035

C'est un message pour moi à l'avenir :

Il suffit d'utiliser : (unsigned)!((int)0)

Il crée le plus grand nombre possible dans n'importe quelle machine en assignant tous les bits à des 1 (uns), puis le transforme en un nombre non signé.

Encore mieux

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

Et ensuite, utilisez simplement INF dans votre code

11 votes

Je pense que vous voulez dire #define INF ((unsigned) ~0) , voir aquí .

0 votes

C'est très intéressant mais j'avais besoin de quelque chose que je pouvais stocker dans un tableau avec d'autres entiers normaux, j'ai fini par tout changer en doubles et utiliser les limites numériques infinies.

0 votes

La transformation de 0 en int n'est pas nécessaire puisque 0 est déjà un int. De plus, !0 == 1, ce qui est loin d'être l'infini. Même la définition de Paul Sanders est un entier non signé, et l'utiliser pour comparer avec des entiers signés causera probablement des problèmes.

9voto

nicodjimenez Points 66

Vous pouvez également utiliser INT_MAX :

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

c'est équivalent à l'utilisation de numeric_limits.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X