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?

86
demandé sur jozefg 2012-01-01 01:09:26

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();
101
répondu Etienne de Martel 2013-04-19 16:05:34

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.

52
répondu jozefg 2013-09-02 20:27:18

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
}
11
répondu bdonlan 2011-12-31 21:15:09

vous pouvez également utiliser INT_MAX:

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

c'est équivalent à utiliser numeric_limits.

2
répondu nicodjimenez 2016-01-05 16:47:08

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

2
répondu Wilmer E. Henao 2018-06-22 04:28:18

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?

-2
répondu Shaun07776 2011-12-31 21:17:41