Existe-t-il un moyen standard et/ou portable de représenter la plus petite valeur négative (par exemple, d'utiliser l'infini négatif) dans un programme C++?
DBL_MIN dans float.h est le plus petit nombre positif.
Existe-t-il un moyen standard et/ou portable de représenter la plus petite valeur négative (par exemple, d'utiliser l'infini négatif) dans un programme C++?
DBL_MIN dans float.h est le plus petit nombre positif.
Voici l'explication de mon -1: qui ou quoi dit que -DBL_MAX est garanti par le langage C ou C++ d'être représentable, sans parler de la valeur minimale représentable? Le fait que la plupart du matériel FP soit conforme à IEEE 754 et utilise cette représentation ne signifie pas que -DBL_MAX est garanti de fonctionner sur n'importe quelle plateforme C conforme à la norme.
Les nombres à virgule flottante (IEEE 754) sont symétriques, donc si vous pouvez représenter la plus grande valeur (DBL_MAX
ou numeric_limits::max()
), il suffit de préfixer un signe négatif.
Et voici la manière cool:
double f;
(*((uint64_t*)&f))= ~(1LL<<52);
@onebyone, dites-moi en un qui ne le fait pas... Je pense que vous ne pourrez pas, car tous les compilateurs C/C++ utilisent le format natif du processeur pour les nombres en virgule flottante, et maintenant je ne peux pas penser à un seul FPU qui ne respecte pas la norme IEEE 754 (peut-être dans les temps sombres de l'informatique, quand tout le monde avait ses propres formats maison...)
La fonction min()
n'était-elle pas disponible avant C++11? Ou s'agit-il d'une valeur différente de -max()
? en.cppreference.com/w/cpp/types/numeric_limits
@Alexis : si vous regardez les trois dernières lignes du tableau sur la page que vous avez liée, vous verrez que min
vous donne la plus petite valeur positive en magnitude, et lowest
la plus grande valeur négative en magnitude. Oui, c'est terrible. Bienvenue dans le brillant monde de la bibliothèque standard C++ :-P
.
Essayez ceci :
-1 * std::numeric_limits::max()
Référence : numeric_limits
Cette classe est spécialisée pour chacun des types fondamentaux, avec ses membres retournant ou étant définis sur les différentes valeurs qui définissent les propriétés que ce type a dans la plateforme spécifique dans laquelle il compile.
Recherchez-vous l'infini réel ou la valeur finie minimale ? Si c'est le premier cas, utilisez
-numeric_limits::infinity()
ce qui ne fonctionne que si
numeric_limits::has_infinity
Sinon, vous devriez utiliser
numeric_limits::lowest()
qui a été introduit en C++11.
Si lowest()
n'est pas disponible, vous pouvez vous rabattre sur
-numeric_limits::max()
qui peut différer de lowest()
en principe, mais normalement pas en pratique.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
4 votes
Je vais choisir -DBL_MAX, mais je suis sûr qu'il y a une raison technique pour laquelle ce n'est pas le cas :-)
4 votes
@Neil, non, ce n'est pas comme les entiers en complément à 2
0 votes
Je n'ai encore rien vu dans la norme pour dire que la gamme des types de point flottant doit être symétrique autour de zéro. Mais les constantes dans limits.h et suggèrent que les normes C et C++ s'attendent un peu à ce qu'elles le soient.
0 votes
@onebyone Il y a un bit de signe (le 31ème en float et le 63ème en double), donc prenez n'importe quelle valeur positive et mettez le bit de signe, puis vous avez la même magnitude, mais négative, c'est pourquoi c'est symétrique. Au cas où vous vous poseriez la question, oui, il y a un zéro positif et un zéro négatif.
4 votes
En fait, DBL_MIN dans float.h est le plus petit nombre positif normalisé. Il y a des nombres qui sont encore plus petits.
1 votes
@fortran: IEEE 754 FP utilise un bit de signe, et la plupart du matériel FP de nos jours est certainement IEEE 754. Cependant, C et C++ prennent en charge du matériel FP non-IEEE 754, donc la question reste ouverte quant à savoir si le langage garantit que -DBL_MAX doit être égal à la valeur représentable minimale.