Question

J'essaie de comprendre comment attribuer la valeur de l'infini négatif à une variable flottante ou double.Il semble qu'en incluant les limites standard de la bibliothèque, je peux obtenir la représentation à l'infini, et je sais (très sûrement) que l'ajout d'un moins devant cela (-infini) pourrait donner la valeur que je recherche dans la virgule flottante IEEE754. standard (car 0x7FFFFFFF pourrait entraîner 0xFFFFFFFF), mais je n'en suis même pas sûr, sans parler d'autres normes qui pourraient exister (s'il y en a).Je trouve cela vraiment, vraiment peu professionnel et dépendant de la mise en œuvre.

Existe-t-il un bon moyen d'obtenir la valeur de la plate-forme infinie négative et de sa mise en œuvre indépendamment, bien sûr, sinon je pourrais tout aussi bien utiliser un #define, tout le monde aime le prétraitement.

Était-ce utile?

La solution

au moins si std :: numeric_limits :: is_iec559 (IEEE 754) est vrai (qui garantit, que std :: numeric_limits :: has_infinity est également vrai), vous pouvez exprimer des valeurs infini positives et négatives comme vous avez déjà indiqué.

Explication courte de IEEE 754-1985 Valeurs Infinity de Wikipedia :

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

Le champ exponent biaisé est rempli de 1 bits pour indiquer soit infini ou un résultat invalide d'un calcul.

Infinity positif et négatif

L'infini positif et négatif est représenté ainsi:

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

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

assertions

L'exemple suivant fonctionnera comme prévu ou provoquera une erreur de temps de compilation au cas où la plate-forme cible ne prend pas en charge les flotteurs 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;
}

Autres conseils

Si std::numeric_limits<double>::is_iec559 est true alors il devrait être sûr à utiliser -

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

(IEC559 est l'équivalent ISO de IEEE754)

Si c'est false alors il y a beaucoup plus de travail à faire car je ne pense pas que la norme C++ vous aide.

Je ne sais pas quel compilateur votre utilisation, mais vous pouvez utiliser -std::numeric_limits<double>::infinity() sur GCC et MINGW, voir Infinity-and-Nan .Aussi, j'ai dirigé le code suivant sur MSVC et il est retourné true:

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;

Cependant, il est peut-être intéressant d'être envisagé d'utiliser l'utilisation du plus bas de votre application au lieu de l'infini négative car il est susceptible de donner une solution plus portable.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top