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 ?
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 ?
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();
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".
@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.
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 :)
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.
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
}
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
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.
Vous pouvez également utiliser INT_MAX :
http://www.cplusplus.com/reference/climits/
c'est équivalent à l'utilisation de numeric_limits.
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.
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.
4 votes
@jozefg Ha, j'ai compris que vous alliez implémenter A*. J'étais donc fermer !
0 votes
@Xeo : Si vous avez besoin de valeurs discrètes,
float
n'est pas la solution. Il est facile d'imaginer un type de données dont les valeurs sont-Infinity
,INT_MIN
, ..., 0, ...,INT_MAX
,+Infinity
. Il se trouve que le C++ ne fournit pas un tel type.2 votes
@jozefg - C'est logique. Je pensais que l'OP voulait réellement effectuer le
a>b
vérifier :)0 votes
Le C++ permet de définir assez facilement une classe présentant les caractéristiques requises. Pour éviter de limiter l'utilisation de l'outil réel qui peuvent être conservées dans l'entier "sous-jacent", il faudrait maintenir un indicateur d'état "la valeur est actuellement infinie", et le vérifier dans le code pour annuler les opérateurs de comparaison, copier/additionner des valeurs, etc. Il faudrait remplacer un grand nombre d'opérateurs, mais tout cela n'est que futilités répétitives.
0 votes
@FumbleFinger : et affecterait probablement les performances de manière significative. Je me souviens avoir lu un article l'année dernière où l'auteur se plaignait de l'absence de +/-inf et NaN pour les entiers qui seraient traités par la fonction matériel au lieu du comportement indéfini de sous-débit/surdébit que nous obtenons par défaut. Maintenant, si seulement je pouvais me rappeler où je l'ai lu...
0 votes
@Matthieu M : Ne me faites pas commencer ! Dans le monde réel, je pense que la demande de l'OP est potache. Les physiciens théoriques travaillent d'arrache-pied depuis des décennies pour essayer de se débarrasser des infinis dans leurs équations, mais cela s'avère très difficile. Et voilà qu'un type veut introduire l'infini dans la programmation - probablement parce qu'il ne sait pas comment, ou parce qu'il ne peut pas se donner la peine de concevoir son algorithme et son code de manière sensée.
0 votes
@FumbleFingers : quand même, ça ne vous dérange pas que
std::numeric_limits<int>::min() - 1 == std::numeric_limits<int>::max()
dans la plupart des implémentations (c'est techniquement indéfini) ? Personnellement, je préférerais qu'il soit égal àstd::numeric_limits<int>::minusinfinity()
et contaminer le reste de l'expression.0 votes
@Matthieu : Je n'ai jamais utilisé le limites_numériques mais je constate qu'il prend en charge des attributs tels que peut supporter l'infini y est limité . Si l'OP a vraiment besoin d'une variable capable de supporter l'infini, il aura besoin de quelque chose comme ça. Mais s'il pensait sérieusement pouvoir contourner le problème en utilisant un "int" standard, il serait probablement dépassé par ce niveau d'abstraction.
0 votes
@KeithThompson désolé de nécroser ce sujet mais juste pour clarifier car j'ai un problème similaire. Vous recommandez de résoudre ce problème en utilisant
a = INT_MAX;
pas vrai ? Ou faites-vous référence à une autre fonction ?1 votes
@Hikari : Non, je dis qu'il n'y a aucun moyen de représenter l'infini dans un type entier. Vous pourriez créer une classe avec des opérateurs surchargés.