2011-12-31 5 views
79

Ho un int a che deve essere uguale a "infinito". Ciò significa che seImpostazione di un int a Infinity in C++

int b = anyValue; 

a>b è sempre vero.

Esiste qualche caratteristica del C++ che potrebbe rendere possibile ciò?

+0

Si potrebbe semplicemente usare 'float's, che ha un valore che rappresenta l'infinito. – Xeo

+3

Bene, hai bisogno di qualcosa di simile all'infinito per implementare un esempio di base dell'algoritmo Dijkstra. – jozefg

+1

@jozefg - Va bene, quindi non è un controllo che l'utente sta cercando, solo l'implementazione del valore massimo della lingua. – keyboardP

risposta

48

I numeri interi sono finiti, quindi purtroppo non puoi averlo impostato su un vero infinito. Tuttavia è possibile impostare il valore massimo di un int, questo significherebbe che sarebbe stato maggiore o uguale a qualsiasi altro int, vale a dire:

a>=b 

è sempre vero.

Si potrebbe fare ciò

#include <limits> 

//your code here 

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

//go off and lead a happy and productive life 

Questo sarà normalmente pari a 2,147,483,647

Se davvero bisogno di un vero valore "infinito", si dovrà utilizzare un letto matrimoniale o un galleggiante. Poi si può semplicemente fare questo

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

Ulteriori spiegazioni dei limiti numerici possono essere trovati here

Felice Coding!

Nota: come menzionato da WTP, se è assolutamente necessario disporre di un int che è "infinito", è necessario scrivere una classe wrapper per un int e sovraccaricare gli operatori di confronto, anche se questo probabilmente non è necessario per la maggior parte dei progetti .

+4

... e se si desidera utilizzare 'max()' o 'infinity()' in un modello in cui il tipo numerico è sconosciuto, sarà necessario usare '+/- infinity()' iff 'std :: numeric_limits :: has_infinity' e altrimenti 'min()' e 'max()' –

91

interi sono intrinsecamente limitato. Il più vicino si può ottenere è impostando a al valore massimo int s':

#include <limits> 

// ... 

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

che sarebbe 2^31 - 1 (o 2 147 483 647) se int è largo 32 bit sulla vostra implementazione.

Se davvero bisogno infinito, utilizzare un punto di tipo di numero floating, come float o double. È quindi possibile ottenere a sfioro con:

double a = std::numeric_limits<double>::infinity(); 
+28

E se * veramente * ha bisogno di infinito come un ** int **, scrivere una classe wrapper che sovraccarichi gli operatori di confronto e abbia una variabile booleana denominata "is_infinity". –

+0

@WTP Considerando che ha bisogno di questo per l'implementazione dell'algoritmo di Dijkstra, dubito che sarebbe necessario. Ma è la scelta più sensata altrimenti. –

+3

Ho aggiunto il commento per i futuri visitatori che non implementano l'algoritmo di Dijkstra, ma ne hanno bisogno per qualcos'altro. :) –

11

int è intrinsecamente finita; non c'è valore che soddisfi le tue esigenze.

Se siete disposti a cambiare il tipo di b, però, si può fare questo con le sostituzioni dell'operatore:

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 
} 
+9

* Oppure * ... si può usare float e 'std :: numeric_limits :: infinity()'. – Xeo

+0

@Xeo, certo, questa è un'opzione :) – bdonlan

-2

int valori minimi e massimi

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

Credo che si potrebbe impostare una alla parità 9.223.372.036.854.775.807 ma avrebbe bisogno di essere un Int64

se vuoi sempre essere più grato che b perché hai bisogno di controllarlo? impostalo come sempre vero

+1

Ciò dipende dall'implementazione. Non c'è "Int64" in C++ (a meno che non si contenga il contenuto di 'cstdint' in C++ 11). –

+0

@Shaun, per approfondire ciò che Etienne ha detto, http://stackoverflow.com/questions/589575/size-of-int-long-etc spiega il significato di 'int' e dei tipi correlati in C++. –

+0

Ho sempre usato solo embarcadero C++ builder e ha un __int64, non sapevo che l'altro C++ non lo avesse avuto. – Shaun07776

1

Questo è un messaggio per me in futuro:

Basta usare: (unsigned) ((int) 0)

Si crea il maggior numero possibile in qualsiasi macchina assegnando tutti i bit a 1s (quelli) e poi l'inserisce in unsigned

Ancora meglio

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

e basta usare INF sotto