J'ai un int a
qui doit être égal à "l'infini". Cela signifie que si
int b = anyValue;
a>b
est toujours vrai.
Existe-t-il une fonctionnalité du C++ qui pourrait rendre cela possible?
Les entiers sont finis, donc vous ne pouvez malheureusement pas le définir à un véritable infini. Cependant, vous pouvez le définir sur la valeur maximale d'un int, cela voudrait dire qu'il serait supérieur ou égal à tout autre int, c'est-à-dire:
a>=b
est toujours vrai.
Tu ferais ça par
#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 float. Ensuite, 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 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.
Les entiers sont intrinsèquement finis. Le plus proche que vous puissiez obtenir est de régler a
sur la valeur maximale de int
:
#include <limits>
// ...
int a = std::numeric_limits<int>::max();
Ce qui serait 2^31 - 1
(ou 2 147 483 647
) si int
a une largeur de 32 bits sur votre implémentation.
Si vous vraiment avez besoin de l'infini, utilisez un type de nombre à virgule flottante, comme float
ou double
. Vous pouvez alors obtenir l'infini avec:
double a = std::numeric_limits<double>::infinity();
int
est intrinsèquement fini; il n'y a pas de valeur qui réponde à 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
}
Ceci est un message pour moi dans le futur:
Il suffit d'utiliser: (unsigned)!((int)0)
Il crée le plus grand nombre possible dans n’importe quelle machine en attribuant tous les bits à 1 (un), puis en le convertissant en non signé.
Encore mieux
#define INF (unsigned)!((int)0)
Et puis utilisez simplement INF dans votre code
Vous pouvez également utiliser INT_MAX:
http://www.cplusplus.com/reference/climits/
c'est équivalent à utiliser numeric_limits.