web-dev-qa-db-fra.com

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

Quelqu'un peut-il nous expliquer pourquoi Double.MIN_VALUE n'est-ce pas vraiment la valeur minimale que peuvent prendre les doubles? C'est une valeur positive, et un double peut bien sûr être négatif.

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

Aussi, quelle est la valeur minimale que les doubles peuvent prendre? Est-ce -Double.MAX_VALUE? Les docs ne semblent pas dire.

147
mo-seph

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 supplémentaire). Ainsi, la valeur minimale est simplement identique à la valeur maximale, avec le bit de signe modifié, donc yes , -Double.MAX_VALUE est le plus petit nombre possible que vous puissiez représenter avec un double.

Je suppose que le Double.MAX_VALUE devrait être vu comme une magnitude maximale , auquel cas il est logique d'écrire simplement -Double.MAX_VALUE. Cela explique aussi pourquoi Double.MIN_VALUE est la valeur la moins positive (car cela représente la plus petite magnitude possible).

Mais bien sûr, je conviens que la dénomination est un peu trompeuse. Être habitué à la signification Integer.MIN_VALUE, Moi aussi j'ai été un peu surpris quand j'ai lu que Double.MIN_VALUE était la plus petite absolue valeur pouvant être représentée. Peut-être ont-ils pensé qu'il était superflu d'avoir une constante représentant le moins possible, car il s'agit simplement d'un - loin de MAX_VALUE :-)

(Remarque, il y a aussi Double.NEGATIVE_INFINITY mais je n'en fais pas abstraction, car cela doit être considéré comme un "cas spécial" et ne représente en réalité aucun chiffre réel.)

Ici est un bon texte sur le sujet.

161
aioobe

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

Un nom plus descriptif pour ces deux pourrait être Le plus grand absolu (ajouter non nul pour verbositiy) et Le plus petit absolu valeur (ajouter un non-infini pour mot à mot).

Consultez le IEEE 754 (1985) standard pour plus de détails. Il existe une version révisée (2008), mais cela n'introduit que plusieurs formats qui ne sont même pas supportés par Java (à proprement parler Java ne prend même pas en charge certains fonctions obligatoires de IEEE 754 1985, comme beaucoup d’autres langages de haut niveau).

10
Durandal

Je suppose que les noms déroutants peuvent être remontés à C , ce qui définit FLT_MIN en tant que plus petit nombre positif.

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

4
Philipp Claßen

La valeur minimale pour 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 inférieure) 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 infinie, vous pouvez utiliser -Double.MAX_VALUE.

2
Colin Hebert

Parce qu'avec des nombres en virgule flottante, précision est ce qui est important car il n'y a pas d'étendue 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 qu'il aurait probablement dû être nommé quelque chose de mieux :)

2
John Gardner