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ò?
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ò?
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 .
... 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
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();
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". –
@WTP Considerando che ha bisogno di questo per l'implementazione dell'algoritmo di Dijkstra, dubito che sarebbe necessario. Ma è la scelta più sensata altrimenti. –
Ho aggiunto il commento per i futuri visitatori che non implementano l'algoritmo di Dijkstra, ma ne hanno bisogno per qualcos'altro. :) –
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
}
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
Ciò dipende dall'implementazione. Non c'è "Int64" in C++ (a meno che non si contenga il contenuto di 'cstdint' in C++ 11). –
@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++. –
Ho sempre usato solo embarcadero C++ builder e ha un __int64, non sapevo che l'altro C++ non lo avesse avuto. – Shaun07776
È inoltre possibile utilizzare INT_MAX:
http://www.cplusplus.com/reference/climits/
è equivalente ad usare numeric_limits.
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
Si potrebbe semplicemente usare 'float's, che ha un valore che rappresenta l'infinito. – Xeo
Bene, hai bisogno di qualcosa di simile all'infinito per implementare un esempio di base dell'algoritmo Dijkstra. – jozefg
@jozefg - Va bene, quindi non è un controllo che l'utente sta cercando, solo l'implementazione del valore massimo della lingua. – keyboardP