Existe-t-il un moyen standard et/ou portable pour représenter la plus petite valeur négative (par exemple, utiliser l'infini négatif) dans un programme C (++)?
DBL_MIN dans float.h est le plus petit nombre positif.
-DBL_MAX
en ANSI C , défini dans float.h.
Les nombres à virgule flottante (IEEE 754) sont symétriques. Par conséquent, si vous pouvez représenter la plus grande valeur (DBL_MAX
Ou numeric_limits<double>::max()
), ajoutez simplement un signe moins.
Et puis c'est la manière cool:
double f;
(*((long long*)&f))= ~(1LL<<52);
En C, utilisez
#include <float.h>
const double lowest_double = -DBL_MAX;
En C++ pré-11, utilisez
#include <limits>
const double lowest_double = -std::numeric_limits<double>::max();
À partir de C++ 11, utilisez
#include <limits>
constexpr double lowest_double = std::numeric_limits<double>::lowest();
Essaye ça:
-1 * numeric_limits<double>::max()
Référence: numeric_limits
Cette classe est spécialisée pour chacun des types fondamentaux. Ses membres renvoient ou définissent les différentes valeurs qui définissent les propriétés de ce type dans la plate-forme spécifique sur laquelle elle est compilée.
Cherchez-vous l'infini réel ou la valeur finie minimale? Si l'ancien, utilisez
-numeric_limits<double>::infinity()
qui ne fonctionne que si
numeric_limits<double>::has_infinity
Sinon, vous devriez utiliser
numeric_limits<double>::lowest()
qui a été introduit en C++ 11.
Si lowest()
n'est pas disponible, vous pouvez revenir à
-numeric_limits<double>::max()
qui peut différer de lowest()
en principe, mais normalement pas dans la pratique.
A partir de C++ 11, vous pouvez utiliser numeric_limits<double>::lowest()
. Selon le standard, il retourne exactement ce que vous recherchez:
Une valeur finie x telle qu’il n’y ait pas d’autre valeur finie y où
y < x
.
Significatif pour toutes les spécialisations dans lesquellesis_bounded != false
.
Il y a beaucoup de réponses pour -std::numeric_limits<double>::max()
.
Heureusement, ils fonctionneront bien dans la plupart des cas. Les schémas de codage en virgule flottante décomposent un nombre dans une mantisse et un exposant et la plupart d’entre eux (par exemple, le populaire IEEE-754 ) utilisent un bit de signe distinct, qui n’appartient pas à la mantisse. Cela permet de transformer le plus grand positif en le plus petit négatif en inversant simplement le signe:
La norme n'impose aucune norme en virgule flottante.
Je conviens que mon argument est un peu théorique, mais supposons qu'un fabricant de compilateurs excentrique utilise un schéma de codage révolutionnaire avec une mantisse codée dans certaines variations d'un complément à deux . L'encodage du complément à deux n'est pas symétrique. Par exemple, pour un caractère signé de 8 bits, le maximum positif est 127, mais le minimum négatif est -128. Nous pourrions donc imaginer que certains codages en virgule flottante présentent un comportement asymétrique similaire.
Je ne suis au courant d'aucun schéma d'encodage de ce type, mais le fait est que la norme ne garantit pas que le retournement du signe donne le résultat souhaité . Donc, cette réponse populaire (désolé les gars!) Ne peut pas être considérée comme une solution standard entièrement portable!/* du moins pas si vous n'avez pas affirmé que numeric_limits<double>::is_iec559
est vrai * /
La question initiale concerne l'infini. Alors, pourquoi ne pas utiliser
#define Infinity ((double)(42 / 0.0))
selon la définition de l'IEEE? Vous pouvez nier cela bien sûr.