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

Quelqu’un peut-il expliquer pourquoi Double.MIN_VALUE n’est pas réellement 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 c’est un nombre utile, mais il semble que ce soit un nom peu intuitif, surtout par rapport à Integer.MIN_VALUE . L’appeler Double.SMALLEST_POSITIVE ou MIN_INCREMENT ou similaire aurait une sémantique plus claire.

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

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ésortingque” autour de l’origo (par opposition aux valeurs entières, 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é, alors 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 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 (puisque cela représente la magnitude la plus faible possible).

Mais bien sûr, je suis d’accord que la dénomination est un peu trompeuse. Étant habitué à la signification Integer.MIN_VALUE , j’étais aussi un peu surpris quand j’ai lu que Double.MIN_VALUE était la plus petite valeur absolue pouvant être représentée. Peut-être pensaient-ils qu’il était superflu d’avoir une constante représentant le moins de valeur possible, car il s’agit simplement d’une - loin de MAX_VALUE 🙂

(Notez qu’il y a aussi Double.NEGATIVE_INFINITY mais je ne tiens pas compte de cela, car il doit être vu comme un “cas particulier” et ne représente en fait aucun nombre réel.)

Voici un bon texte sur le sujet.

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: Sign, Exponent et Mantissa. Double.MIN_VALUE est en réalité la plus petite valeur que Mantissa peut prendre lorsque l’exposant est à une valeur minimale avant qu’un vidage à zéro 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 vidage à l’infini se produise.

Un nom plus descriptif pour ces deux éléments pourrait être Largest Absolute (append non nul pour verbositiy) et Smallest Absolute value (append non-infinity pour verbositiy).

Consultez la norme IEEE 754 (1985) pour plus de détails. Il existe une version révisée (2008), mais qui introduit seulement plus de formats qui ne sont même pas supportés par java (à proprement parler, java ne prend même pas en charge certaines fonctionnalités obligatoires de IEEE 754 1985, comme beaucoup d’autres langages de haut niveau).

Parce que les nombres à virgule flottante, la précision est ce qui est important car il n’y a pas de plage exacte .

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

Mais je suis d’accord pour dire qu’il aurait probablement dû être nommé quelque chose de mieux 🙂

Je suppose que les noms confus peuvent être remontés à C , qui définit 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 flottant en C.

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 le double est un nombre à 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 n’est pas infini, vous pouvez utiliser -Double.MAX_VALUE .

Comme il est dit dans les documents ,

Double.MIN_VALUE est une constante contenant la plus petite valeur POSITIVE non nulle de type double, 2 ^ (- 1074).

L’astuce ici est que nous parlons d’une représentation des nombres à virgule flottante. Le type de données double est un virgule flottante IEEE 754 64 bits à double précision. Les points flottants représentent des nombres de 1 000 000 000 000 à 0,0000000000000001 en toute simplicité, tout en maximisant la précision (le nombre de chiffres) aux deux extrémités de l’échelle. (Pour plus de référez ceci )

La mantisse, toujours un nombre positif , contient les chiffres significatifs du nombre à virgule flottante. L’exposant indique le pouvoir positif ou négatif du radix par lequel la mantisse et le signe doivent être multipliés. Les quatre composants sont combinés comme suit pour obtenir la valeur en virgule flottante.

entrer la description de l'image ici

Pensez que le MIN_VALUE est la valeur minimale que la mantisse peut représenter. Comme les valeurs minimales d’une représentation en virgule flottante sont la magnitude minimale pouvant être représentée à l’aide de cette valeur. (Aurait pu utiliser un meilleur nom pour éviter cette confusion cependant)

123> 10> 1> 0,12> 0,012> 0,0000123> 0,000000001> 0,0000000000000001

Ci-dessous est juste FYI.

La virgule flottante double précision peut représenter 2 098 puissances de deux, de 2 ^ -1074 à 2 ^ 1023. Les puissances dénormalisées de deux sont celles de 2 ^ -1074 à 2 ^ -1023; les puissances normalisées de deux sont celles de 2 ^ -1022 à 2 ^ 1023. Référez ceci et ceci .