Domanda

Sto cercando di capire come assegnare il valore dell'infinito negativo a un galleggiante o a doppia variabile.Sembra che includarsi i limiti della biblioteca standard, posso ottenere la rappresentazione dell'infinito, e so (abbastanza sicuramente) che aggiungere un meno di fronte a quello (-infinity) potrebbe comportare il valore che sto cercando nel punto flottante IEEE754Standard (come 0x7FFFFFFF potrebbe risultare su 0xFFFFFFFFF), ma non sono nemmeno sicuro di questo, per non parlare di altri standard che potrebbero essere là fuori (se ce ne sono).Lo trovo davvero, in realtà non professionale e dipendente dall'implementazione.

C'è un buon modo per ottenere il valore della piattaforma di infinito negativa e dell'attuazione in modo indipendente, ovviamente, altrimenti potrei anche usare un #define, a tutti piacciono la pre-elaborazione.

È stato utile?

Soluzione

almeno se std :: numeric_limits :: is_iec559 (IEEE 754) è vero (che garantisce che std :: numeric_limits :: has_infinity è anche vero), puoi esprimere valori di infinito positivi e negativi come già indicato.

Breve spiegazione di IEEE 754-1985 Valori infinity da wikipedia :

.

...... snip ......

Il campo di prevenzione-esponente è riempito con tutti e 1 i bit per indicare entrambi infinito o risultato non valido di un calcolo.

Infinity positivo e negativo

Infinito positivo e negativo è rappresentato quindi:

 sign = 0 for positive infinity, 1 for negative infinity.
 biased exponent = all 1 bits.
 fraction = all 0 bits.
.

...... snip ......

Assertions

L'esempio seguente funzionerà come previsto o causi un errore del tempo di compilazione nel caso in cui la piattaforma di destinazione non supporti i galleggianti IEEE 754.

#include <cstdlib>
#include <cmath>
#include <cassert>
#include <limits>

int main(void)
{
    //Asserts floating point compatibility at compile time
    static_assert(std::numeric_limits<float>::is_iec559, "IEEE 754 required");

    //C99
    float negative_infinity1 = -INFINITY;
    float negative_infinity2 = -1 * INFINITY;

    float negative_infinity3 = -std::numeric_limits<float>::infinity();
    float negative_infinity4 = -1 * std::numeric_limits<float>::infinity();

    assert(std::isinf(negative_infinity1) && negative_infinity1 < std::numeric_limits<float>::lowest());
    assert(std::isinf(negative_infinity2) && negative_infinity2 < std::numeric_limits<float>::lowest());
    assert(std::isinf(negative_infinity3) && negative_infinity3 < std::numeric_limits<float>::lowest());
    assert(std::isinf(negative_infinity4) && negative_infinity4 < std::numeric_limits<float>::lowest());

    return EXIT_SUCCESS;
}
.

Altri suggerimenti

Se std::numeric_limits<double>::is_iec559 è true, dovrebbe essere sicuro da usare -

double negative_infinity = - std::numeric_limits<double>::infinity();

(IEC559 è l'equivalente ISO di IEEE754)

Se è false, allora c'è molto più lavoro da fare come non penso che lo standard C ++ ti dà alcun aiuto.

Non so quale compilatore utilizzo, ma puoi usare -std::numeric_limits<double>::infinity() su GCC e MINGW Vedi infinito-and-nan .Inoltre ho eseguito il seguente codice su MSVC e è tornato vero:

double infinity(std::numeric_limits<double>::infinity());
double neg_infinity(-std::numeric_limits<double>::infinity());
double lowest(std::numeric_limits<double>::lowest());

bool lower_than_lowest(neg_infinity < lowest);
std::cout << "lower_than_lowest: " << lower_than_lowest << std::endl;
.

Tuttavia, forse vale la pena considerare di utilizzare la più bassa della tua applicazione invece di infinito negativo in quanto è probabile che si traduca in una soluzione più portatile.

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