web-dev-qa-db-fra.com

double valeur minimale en C / C ++

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.

76
Will

-DBL_MAXen ANSI C , défini dans float.h.

118
dfa

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);
70
fortran

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();
39
rubenvb

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.

32
Andrew Hare

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.

20
Christoph

Une solution C++ vraiment portable

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 lesquelles is_bounded != false.

Démo en ligne


Beaucoup de réponses C++ non portables ici!

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:

enter image description here

Pourquoi ces portables ne sont-ils pas?

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 * /

9
Christophe
- std::numeric_limits<double>::max()

devrait bien fonctionner

limites numériques

7
MadH

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.

1
Norbert