Quelqu'un peut-il expliquer pourquoi ce Double.MIN_VALUE
n'est pas 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 cela semble un nom très 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? C'est ça -Double.MAX_VALUE
? Les documents ne semblent pas le dire.
java
numbers
floating-point
mo-seph
la source
la source
writeBytes
qui prend unString
.Réponses:
Le format IEEE 754 a un bit réservé pour le signe et les bits restants représentant la grandeur. Cela signifie qu'il est "symétrique" autour de l'origo (par opposition aux valeurs Integer, qui ont encore une valeur négative). Ainsi, la valeur minimale est simplement la même que la valeur maximale, avec le bit de signe modifié, donc oui ,
-Double.MAX_VALUE
c'est le plus petit nombre réel possible que vous pouvez représenter avec adouble
.Je suppose que le
Double.MAX_VALUE
devrait être considéré comme une magnitude maximale , auquel cas il est en fait logique d'écrire simplement-Double.MAX_VALUE
. Cela explique également pourquoiDouble.MIN_VALUE
est la valeur la moins positive (puisque cela représente la moindre ampleur possible).Mais bien sûr, je conviens que la dénomination est un peu trompeuse. Étant habitué à la signification
Integer.MIN_VALUE
, j'ai moi aussi été un peu surpris quand j'ai lu queDouble.MIN_VALUE
c'était la plus petite valeur absolue qui pouvait être représentée. Peut-être ont-ils pensé qu'il était superflu d'avoir une constante représentant la moindre valeur possible car elle est simplement-
éloignée deMAX_VALUE
:-)(Remarque, il y en a aussi
Double.NEGATIVE_INFINITY
mais je ne tiens pas compte de cela, car il doit être considéré comme un "cas spécial" et ne représente en fait aucun nombre réel.)Voici un bon texte sur le sujet.
la source
SmallestNonzeroFloat64
par exemple.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: signe, exposant et mantisse. Double.MIN_VALUE est en fait la plus petite valeur que Mantissa peut prendre lorsque l'exposant est à la valeur minimale avant qu'un vidage à 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 vidage à l'infini ne se produise.
Un nom plus descriptif pour ces deux pourrait être le plus grand absolu (ajouter une valeur non nulle pour la verbosité) et la plus petite valeur absolue (ajouter une valeur non infinie pour la verbosité).
Consultez la norme IEEE 754 (1985) pour plus de détails. Il existe une version révisée (2008), mais qui n'introduit que plus de formats qui ne sont même pas pris en charge par java (java à proprement parler ne prend même pas en charge certaines fonctionnalités obligatoires de IEEE 754 1985, comme beaucoup d'autres langages de haut niveau).
la source
Je suppose que les noms confus peuvent être attribués à C , qui est 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.la source
La valeur minimale pour un double,
Double.NEGATIVE_INFINITY
c'est pourquoi ceDouble.MIN_VALUE
n'est pas vraiment le minimum pour unDouble
.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 n'est pas l'infini, vous pouvez utiliser
-Double.MAX_VALUE
.la source
Double.MIN_VALUE
pourrait être égal àDouble.NEGATIVE_INFINITY
.Double.POSITIVE_INFINITY
+ ∞> tout et —∞ <toutDouble.MIN_VALUE
serait égal àDouble.NEGATIVE_INFINITY
, car alors il serait cohérent avecMIN_VALUE
les types entiers. Je pourrais initialiser n'importe quelle variable pour calculer un maximum avecMIN_VALUE
et ce serait correct. Le queDouble.MIN_VALUE
nous avons maintenant aurait un meilleur nom. (Et de manière analogue pourMAX_VALUE
.)Parce qu'avec les nombres à virgule flottante, la précision est ce qui est important car il n'y a pas de plage exacte .
Mais je suis d'accord qu'il aurait probablement dû être nommé quelque chose de mieux :)
la source
Comme il est dit dans les documents ,
L'astuce ici est que nous parlons d'une représentation numérique à virgule flottante. Le type de données double est une virgule flottante IEEE 754 64 bits à double précision. Les virgules flottantes représentent des nombres de 1 000 000 000 000 à 0,000000000000000001 avec facilité et en maximisant la précision (le nombre de chiffres) aux deux extrémités de l'échelle. (Pour en savoir plus, consultez ceci )
La mantisse, toujours un nombre positif , contient les chiffres significatifs du nombre à virgule flottante. L'exposant indique la puissance positive ou négative de la base par laquelle la mantisse et le signe doivent être multipliés. Les quatre composants sont combinés comme suit pour obtenir la valeur en virgule flottante.
Pensez que 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 grandeur minimale qui peut être représentée en utilisant cela. (J'aurais pu utiliser un meilleur nom pour éviter cette confusion)
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. Reportez - vous ceci et cela .
la source