198 votes

Pourquoi Double.MIN_VALUE n'est-il pas négatif ?

Quelqu'un peut-il m'éclairer sur la raison pour laquelle Double.MIN_VALUE n'est pas en fait la valeur minimale que les Doubles peuvent prendre ? C'est une valeur positive, et un Double peut bien sûr être négatif.

Je comprends pourquoi il s'agit d'un nombre utile, mais son nom semble très peu intuitif, surtout lorsqu'il est comparé à Integer.MIN_VALUE . En l'appelant Double.SMALLEST_POSITIVE ou MIN_INCREMENT ou similaire aurait une sémantique plus claire.

Par ailleurs, quelle est la valeur minimale que les Doubles peuvent prendre ? Est-ce que c'est -Double.MAX_VALUE ? La documentation ne semble pas le dire.

2 votes

Merci pour les réponses ! La différence entre portée et précision est logique. Je trouve toujours la dénomination assez étrange et incohérente, mais c'est faisable.

1 votes

Je suppose que c'est parce qu'il est écrit par les mêmes génies qui ont appelé une méthode writeBytes qui prend un String .

1 votes

Fondamentalement, vous avez raison, c'est une mauvaise sémantique.

216voto

aioobe Points 158466

Le format IEEE 754 a un bit réservé pour le signe et les bits restants représentant la magnitude. Cela signifie qu'il est "symétrique" autour de l'origo (par opposition aux valeurs Integer, qui ont une valeur négative de plus). Ainsi, la valeur minimale est simplement la même que la valeur maximale, avec le bit de signe modifié, soit oui , -Double.MAX_VALUE est le plus petit nombre réel possible que vous pouvez représenter avec un double .

Je suppose que le Double.MAX_VALUE doit être considéré comme magnitude maximale dans ce cas, il est logique d'écrire simplement -Double.MAX_VALUE . Il explique également pourquoi Double.MIN_VALUE est la valeur la moins positive (puisque cela représente la plus petite magnitude possible).

Mais bien sûr, je reconnais que le nom est un peu trompeur. Être habitué à la signification Integer.MIN_VALUE J'ai aussi été un peu surpris quand j'ai lu que Double.MIN_VALUE était le plus petit absolu valeur qui pourrait être représentée. Peut-être pensaient-ils qu'il était superflu d'avoir une constante représentant la plus petite valeur possible, puisqu'il s'agit simplement d'une - loin de MAX_VALUE :-)

(Remarque : il existe également Double.NEGATIVE_INFINITY mais je n'en tiens pas compte, car il doit être considéré comme un "cas particulier" et ne représente en fait aucun nombre réel).

Ici est un bon texte sur le sujet.

4 votes

Merci pour ça. Je portais un code d'analyse statistique et je traduisais aveuglément java en C#. J'ai remarqué que certains chiffres sortaient à -infini ou NaN et j'ai regardé de plus près l'algorithme. J'ai réalisé que double.MIN_VALUE n'avait aucun sens dans le contexte et j'ai fait une recherche. Cet article est apparu avant la documentation Java. C'est vraiment un nom déroutant pour ce qui est en réalité double.Epsilon. Ce n'est pas très grave, il a fallu moins d'une minute pour le corriger, mais c'est vraiment surprenant.

0 votes

La "plus petite valeur absolue qui peut être représentée" n'est-elle pas censée s'appeler "epsilon" ?

0 votes

@Sahuagin, il n'est pas vraiment "censé" porter un nom particulier. Epsilon est juste une lettre grecque qui représente communément une quantité positive arbitrairement petite en maths / physique. Allez choisir SmallestNonzeroFloat64 par exemple.

14voto

Durandal Points 9434

Ces constantes n'ont rien à voir avec le signe. Cela a plus de sens si vous considérez un double comme un composé de trois parties : le signe, l'exposant et la mantisse. Double.MIN_VALUE est en fait la plus petite valeur que la mantisse peut prendre lorsque l'exposant est à sa valeur minimale avant qu'une purge vers zéro ne se produise. De même, MAX_VALUE peut être compris comme la plus grande valeur que Mantissa peut prendre lorsque l'exposant est à sa valeur maximale avant qu'un flush à l'infini ne se produise.

Un nom plus descriptif pour ces deux-là pourrait être Le plus grand absolu (ajouter une valeur non nulle pour la verbosité) et Le plus petit absolu (ajoutez une valeur non infinie pour la verbosité).

Consultez le IEEE 754 (1985) pour plus de détails. Il existe une version révisée (2008), mais elle ne fait qu'introduire davantage de formats qui ne sont même pas pris en charge par java (à proprement parler, java ne prend même pas en charge certaines caractéristiques obligatoires de la norme IEEE 754 1985, comme de nombreux autres langages de haut niveau).

7voto

Philipp Claßen Points 4863

Je suppose que les noms qui prêtent à confusion peuvent être remontant à C qui a défini FLT_MIN comme le plus petit nombre positif.

Comme en Java, où vous devez utiliser -Double.MAX_VALUE vous devez utiliser -FLT_MAX pour obtenir le plus petit flotteur en C.

5voto

Colin Hebert Points 40084

La valeur minimale d'un double est Double.NEGATIVE_INFINITY c'est pourquoi Double.MIN_VALUE n'est pas vraiment le minimum pour un Double .

Comme les doubles sont des nombres à virgule flottante, vous ne pouvez avoir que le plus grand nombre (avec une précision moindre) ou le nombre le plus proche de 0 (avec une grande précision).

Si vous voulez vraiment une valeur minimale pour un double qui ne soit pas l'infini, vous pouvez utiliser -Double.MAX_VALUE .

2 votes

En suivant cette idée, la valeur maximale d'un Double est-elle Double.MAX_VALUE ou Double.POSITIVE_INFINITY ?

0 votes

Double.MIN_VALUE pourrait être égal à Double.NEGATIVE_INFINITY .

0 votes

@starblue, non. @mo-seph, Double.POSITIVE_INFINITY , + > tout et - < tout

3voto

John Gardner Points 10882

Parce qu'avec les nombres à virgule flottante, le précision est ce qui est important car il n'y a pas de portée exacte .

/**
 * A constant holding the smallest positive nonzero value of type
 * <code>double</code>, 2<sup>-1074</sup>. It is equal to the
 * hexadecimal floating-point literal
 * <code>0x0.0000000000001P-1022</code> and also equal to
 * <code>Double.longBitsToDouble(0x1L)</code>.
 */

Mais je suis d'accord pour dire qu'il aurait dû porter un meilleur nom :)

0 votes

D'accord, mais alors pourquoi est-il logique d'avoir Double.MAX_VALUE ? Cela semble être clairement défini.

0 votes

Parce que c'est la valeur maximale précise (non infinie), sans tenir compte de son signe.

Prograide.com

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.

Powered by:

X