Qual è la soluzione consigliata se numeric_limits < double > :: has_infinity è falso?
Domanda
Devo controllare un doppio valore per l'infinito in un'app C ++ su Linux. Sulla maggior parte delle piattaforme funziona a confronto con std :: numeric_limits < double > :: infinity ()
. Tuttavia, su alcune vecchie piattaforme (ad esempio RedHat 9, con gcc 3.2.2) questo non è disponibile e std :: numeric_limits < double > :: has_infinity
è falso lì.
Quale soluzione alternativa consiglieresti per quelle piattaforme?
Soluzione 3
Ok, ora ho fatto ricorso all'uso delle macro INFINITY
e NAN
su quel particolare computer - sembra funzionare bene. Provengono da math.h
.
Altri suggerimenti
Se stai usando l'aritmetica IEEE 754, come quasi certamente lo sei, gli infiniti sono valori ben definiti e hanno risultati definiti per tutte le operazioni aritmetiche. In particolare,
infinity - infinity = NaN
I valori ??infinito positivo e negativo e NaN
sono gli unici valori per i quali ciò è vero. I NaN sono speciali "non un numero" valori utilizzati per indicare errori di dominio delle funzioni, ad es. sqrt (-1)
. Inoltre:
NaN != NaN
NaN
s sono gli unici valori per i quali ciò è vero.
Quindi:
bool is_infinite(double x) {
double y = x - x;
return x == x && y != y;
}
restituirà vero se e solo se x
è infinito positivo o negativo. Aggiungi un test per x > 0
se vuoi solo verificare l'infinito positivo.
Nella maggior parte dei casi, std :: numeric_limits :: max () può essere un valido sostituto di std :: numeric_limits :: infinity ().
Dovresti stare più attento a usarlo, comunque. Con gli overflow credo che dovresti rilevare manualmente l'overflow e impostare il risultato al massimo esplicitamente se viene rilevato un overflow.