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();
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 hereint 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.
... 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:
float
s, qui a une valeur qui représente l'infini.Max Value
implémentation du langage.a>b
vérification :)Réponses:
Les nombres entiers sont intrinsèquement finis. Le plus proche , vous pouvez obtenir est par la mise
a
à laint
valeur maximale de:Ce qui serait
2^31 - 1
(ou2 147 483 647
) siint
est 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
float
oudouble
. Vous pouvez alors obtenir l'infini avec:la source
int
solution, 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.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:
est toujours vrai.
Vous feriez cela en
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
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.
la source
max()
ouinfinity()
dans un modèle où le type numérique est inconnu, vous devrez utiliser+/-infinity()
iffstd::numeric_limits<T>::has_infinity
et autrementmin()
etmax()
int
est 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:la source
std::numeric_limits<float>::infinity()
.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
Et puis utilisez simplement INF dans votre code
la source
#define INF ((unsigned) ~0)
, voyez ici .Vous pouvez également utiliser INT_MAX:
http://www.cplusplus.com/reference/climits/
cela équivaut à utiliser numeric_limits.
la source
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
la source
cstdint
).int
et les types associés en C ++.