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.
Est-il caractéristique de C++ qui pourrait rendre cela possible?
6 réponses
entiers sont intrinsèquement finis. Le plus proche que vous pouvez obtenir est en mettant a
à int
valeur maximale de":
#include <limits>
// ...
int a = std::numeric_limits<int>::max();
qui serait 2^31 - 1
(ou 2 147 483 647
) si int
est de 32 bits de large sur votre implémentation.
Si vous vraiment besoin de l'infini, l'utilisation d'un nombre à virgule flottante de type, comme float
ou double
. Vous pouvez alors obtenir l'infini avec:
double a = std::numeric_limits<double>::infinity();
Entiers sont finis, si malheureusement vous ne pouvez pas définir une véritable infini. Cependant, vous pouvez le régler à la valeur max d'un int, cela signifierait qu'il serait supérieur ou égal à tout autre type int, c'est à dire:
a>=b
est toujours vrai.
Vous voulez faire cela 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 devez utiliser un double ou un char. Alors vous pouvez simplement faire ceci
float a = std::numeric_limits<float>::infinity();
des explications supplémentaires des limites numériques peuvent être trouvées ici
Bon Codage!
Note: Comme WTP mentionné, s'il est absolument nécessaire d'avoir un int qui est "infini", vous devriez écrire une classe d'enrubannage pour un int et surcharger les opérateurs de comparaison, bien que ce ne soit probablement pas nécessaire pour la plupart des projets.
int
est intrinsèquement fini; il n'y a aucune valeur qui répond à vos exigences.
si vous êtes prêt à changer le type de b
, cependant, vous pouvez le faire avec l'opérateur overrides:
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
}
vous pouvez également utiliser INT_MAX:
http://www.cplusplus.com/reference/climits /
c'est équivalent à utiliser numeric_limits.
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 assignant tous les bits à 1s (uns) et puis le jette à non signé
encore mieux
#define INF (unsigned)!((int)0)
et ensuite il suffit D'utiliser INF dans votre code
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 pourriez mettre un à égal 9.223.372.036.854.775.807 mais il faudrait un int64
si vous voulez être râpe que b pourquoi avez-vous besoin de le vérifier?