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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top