web-dev-qa-db-fra.com

Définir un int sur Infinity 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.

Existe-t-il une fonctionnalité du C++ qui pourrait rendre cela possible?

99
jozefg

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.

59
jozefg

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();
112
Etienne de Martel

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
}
12
bdonlan

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

3
Wilmer E. Henao

Vous pouvez également utiliser INT_MAX:

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

c'est équivalent à utiliser numeric_limits.

2
nicodjimenez