Impostazione di un int su Infinity in C ++


114

Ho un int ache deve essere uguale a "infinito". Ciò significa che se

int b = anyValue;

a>b è sempre vero.

C'è qualche caratteristica di C ++ che potrebbe renderlo possibile?


Potresti semplicemente usare floats, che hanno un valore che rappresenta l'infinito.
Xeo

1
@jozefg - Va bene, quindi non è un controllo che l'utente sta cercando, ma solo l' Max Valueimplementazione della lingua.
tastiera

4
@jozefg Ha, immaginavo che avresti implementato A *. Ero così vicino!
Etienne de Martel

2
@jozefg - Questo ha senso. Pensavo che OP volesse effettivamente eseguire il a>bcontrollo :)
keyboardP

1
@ Hikari: No, sto dicendo che non c'è modo di rappresentare l'infinito in un tipo intero. Potresti creare una classe con operatori sovraccarichi.
Keith Thompson,

Risposte:


130

Gli interi sono intrinsecamente finiti. Il più vicino si può ottenere è impostando aa int's valore massimo:

#include <limits>

// ...

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

Quale sarebbe 2^31 - 1(o 2 147 483 647) se intè largo 32 bit nella tua implementazione.

Se hai davvero bisogno di infinito, usa un tipo di numero in virgola mobile, come floato double. Puoi quindi ottenere l'infinito con:

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

37
E se hai davvero bisogno di infinity come int , scrivi una classe wrapper che sovraccarica gli operatori di confronto e ha una variabile booleana chiamata "is_infinity".

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

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

Sembra che qui abbiamo un candidato per un distintivo d'oro. :) +1 per entrambi!
Mysticial

2
Nota che se usi la intsoluzione, devi stare molto attento con l'aritmetica: l'aggiunta di un numero positivo a "infinito" produrrà un risultato molto inaspettato.
Lambda Fairy

67

I numeri interi sono finiti, quindi purtroppo non puoi averli impostati su un vero infinito. Tuttavia puoi impostarlo al valore massimo di un int, questo significherebbe che sarebbe maggiore o uguale a qualsiasi altro int, ovvero:

a>=b

è sempre vero.

Lo faresti entro

#include <limits>

//your code here

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

//go off and lead a happy and productive life

Normalmente sarà pari a 2.147.483.647

Se hai davvero bisogno di un vero valore "infinito", dovresti usare un double o un float. Quindi puoi semplicemente farlo

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

Ulteriori spiegazioni sui limiti numerici possono essere trovate qui

Buona programmazione!

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


6
... e se vuoi usare max()o infinity()in un modello in cui il tipo numerico è sconosciuto dovrai usare +/-infinity()iff std::numeric_limits<T>::has_infinitye altrimenti min()emax()
Ben Jackson

13

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

Se sei disposto a cambiare il tipo di b, però, puoi farlo con l'override 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
}

10
Oppure ... potresti semplicemente usare float e std::numeric_limits<float>::infinity().
Xeo

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

5

Questo è un messaggio per me in futuro:

Usa solo: (unsigned)!((int)0)

Crea il numero più grande possibile in qualsiasi macchina assegnando tutti i bit a 1 (uno) e quindi lo converte in unsigned

Anche meglio

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

E poi usa semplicemente INF nel tuo codice


4
Penso che tu voglia dire #define INF ((unsigned) ~0), vedi qui .
Paul Sanders


-2

valori int min e 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

immagino che potresti impostare a uguale a 9,223,372,036,854,775,807 ma dovrebbe essere un int64

se vuoi sempre a essere più grattugia che b perché devi controllarlo? basta impostarlo in modo che sia sempre vero


1
Dipende dall'implementazione. Non c'è "Int64" in C ++ (a meno che non contiate le cose in C ++ 11 cstdint).
Etienne de Martel

@ Shaun, per espandere ciò che ha detto Etienne, stackoverflow.com/questions/589575/size-of-int-long-etc spiega il significato inte i tipi correlati in C ++.
Mike Samuel

Ho usato solo embarcadero c ++ builder e ha un __int64, non sapevo che anche altri c ++ non lo avessero.
Shaun07776
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.