In C ++ ein int auf Infinity setzen

114

Ich habe eine int a, die gleich "unendlich" sein muss. Dies bedeutet, dass wenn

int b = anyValue;

a>b ist immer wahr.

Gibt es eine Funktion von C ++, die dies ermöglichen könnte?

Daniel Gratzer
quelle
Sie können auch floats verwenden, die einen Wert haben, der unendlich darstellt.
Xeo
1
@jozefg - Okay, es ist also keine Überprüfung, nach der der Benutzer sucht, sondern nur die Max ValueImplementierung der Sprache.
TastaturP
4
@jozefg Ha, ich dachte du würdest A * implementieren. Ich war so nah!
Etienne de Martel
2
@jozefg - Das macht Sinn. Ich dachte, OP wollte die a>bPrüfung tatsächlich durchführen :)
TastaturP
1
@ Hikari: Nein, ich sage, dass es keine Möglichkeit gibt, Unendlichkeit in einem ganzzahligen Typ darzustellen. Sie können eine Klasse mit überladenen Operatoren erstellen.
Keith Thompson

Antworten:

130

Ganzzahlen sind von Natur aus endlich. Der nächstgelegene Wert ist die Einstellung aauf intden Maximalwert:

#include <limits>

// ...

int a = std::numeric_limits<int>::max();

Welches wäre 2^31 - 1(oder 2 147 483 647), wenn intIhre Implementierung 32 Bit breit ist.

Wenn Sie wirklich unendlich brauchen, verwenden Sie einen Gleitkommazahlentyp wie floatoder double. Sie können dann unendlich werden mit:

double a = std::numeric_limits<double>::infinity();
Etienne de Martel
quelle
37
Und wenn Sie als int wirklich unendlich brauchen , schreiben Sie eine Wrapper-Klasse, die die Vergleichsoperatoren überlastet und eine boolesche Variable namens "is_infinity" hat.
@WTP Angesichts der Tatsache, dass er dies für die Implementierung eines Dijkstra-Algorithmus benötigt, bezweifle ich, dass dies notwendig wäre. Aber sonst ist es die vernünftigste Wahl.
Etienne de Martel
4
Ich habe den Kommentar für zukünftige Besucher hinzugefügt, die den Dijkstra-Algorithmus nicht implementieren, ihn aber für etwas anderes benötigen. :)
Sieht so aus, als hätten wir hier einen Kandidaten für ein goldenes Abzeichen. :) +1 für euch beide!
Mysticial
2
Beachten Sie, dass Sie bei der Verwendung der intLösung mit der Arithmetik sehr vorsichtig sein müssen: Das Hinzufügen einer positiven Zahl zu "unendlich" führt zu einem sehr unerwarteten Ergebnis.
Lambda Fairy
67

Ganzzahlen sind endlich, so dass Sie sie leider nicht auf eine wahre Unendlichkeit setzen können. Sie können es jedoch auf den Maximalwert eines int setzen. Dies würde bedeuten, dass es größer oder gleich einem anderen int ist, dh:

a>=b

ist immer wahr.

Sie würden dies tun, indem Sie

#include <limits>

//your code here

int a = std::numeric_limits<int>::max();

//go off and lead a happy and productive life

Dies entspricht normalerweise 2.147.483.647

Wenn Sie wirklich einen echten "unendlichen" Wert benötigen, müssten Sie ein Double oder ein Float verwenden. Dann können Sie dies einfach tun

float a = std::numeric_limits<float>::infinity();

Weitere Erläuterungen zu numerischen Grenzwerten finden Sie hier

Viel Spaß beim Codieren!

Hinweis: Wie bereits erwähnt, müssen Sie, wenn WTP unbedingt ein "unendlich" int haben muss, eine Wrapper-Klasse für ein int schreiben und die Vergleichsoperatoren überladen, obwohl dies für die meisten Projekte wahrscheinlich nicht erforderlich ist.

Daniel Gratzer
quelle
6
... und wenn Sie max()oder infinity()in einer Vorlage verwenden möchten, in der der numerische Typ unbekannt ist, müssen Sie +/-infinity()iff std::numeric_limits<T>::has_infinityund andere verwenden min()undmax()
Ben Jackson
13

intist von Natur aus endlich; Es gibt keinen Wert, der Ihren Anforderungen entspricht.

Wenn Sie jedoch bereit sind, den Typ zu ändern b, können Sie dies mit Operatorüberschreibungen tun:

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
}
bdonlan
quelle
10
Oder ... Sie könnten einfach float und verwenden std::numeric_limits<float>::infinity().
Xeo
1
@ Xeo, sicher, das ist auch eine Option :)
Bdonlan
5

Dies ist eine Nachricht für mich in der Zukunft:

Benutz einfach: (unsigned)!((int)0)

Es erzeugt die größtmögliche Zahl in jeder Maschine, indem alle Bits 1s (Einsen) zugewiesen und dann in vorzeichenlose umgewandelt werden

Noch besser

#define INF (unsigned)!((int)0)

Und dann verwenden Sie einfach INF in Ihrem Code

Wilmer E. Henao
quelle
4
Ich denke du meinst #define INF ((unsigned) ~0), siehe hier .
Paul Sanders
-2

int min und max Werte

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

Ich denke, Sie könnten a auf 9.223.372.036.854.775.807 setzen, aber es müsste ein int64 sein

Wenn Sie immer wollen, dass a reifer ist als b, warum müssen Sie es überprüfen? setze es einfach so, dass es immer wahr ist

Shaun07776
quelle
1
Das hängt von der Implementierung ab. Es gibt kein "Int64" in C ++ (es sei denn, Sie zählen das Zeug in C ++ 11 cstdint).
Etienne de Martel
@Shaun, um das zu erweitern, was Etienne gesagt hat, erklärt stackoverflow.com/questions/589575/size-of-int-long-etc die Bedeutung intund verwandte Typen in C ++.
Mike Samuel
Ich habe immer nur den Embarcadero C ++ Builder verwendet und er hat einen __int64. Ich wusste nicht, dass andere C ++ ihn nicht so gut hatten.
Shaun07776