53 votes

La différence entre le Double.MIN_NORMAL et Double.MIN_VALUE?

Pouvez-vous me dire quelle est la différence entre le Double.MIN_NORMAL (introduit en 1.6) et Double.MIN_VALUE?

JavaDoc de l' Double.MIN_NORMAL:

Une tenue constante le plus petit positive de la valeur normale de type double, 2-1022

JavaDoc de l' Double.MIN_VALUE:

Une tenue constante le plus petit positive valeur différente de zéro de type double, 2-1074

36voto

aioobe Points 158466

La réponse peut être trouvée dans la spécification IEEE représentation à virgule flottante:

Pour le format unique, la différence entre un nombre normal et un subnormale nombre, c'est que le premier bit de la significande (le bit vers la gauche de la binaire point) d'un nombre normal est de 1, alors que le premier bit de la significande d'un subnormale nombre est égal à 0. Format unique subnormale numéros ont été appelés au format unique les nombres dénormalisés dans la Norme IEEE 754.

Qui est, (si j'interprète correctement) Double.MIN_NORMAL est le plus petit nombre possible vous pouvez représenter, à condition que vous avez un 1 devant le binaire point (ce qui est appelé point décimal dans un système décimal). Alors qu' Double.MIN_VALUE est essentiellement le plus petit nombre que vous pouvez représenter sans cette contrainte.

14voto

Pacerier Points 15960

Tldr:

Double.MIN_NORMAL donne le plus petit positive IEEE-754 binary64 "nombre normal" (aussi connu comme les nombres normalisés). Cela correspond à 2-1022, qui est à peu près 2.225 × 10-308.

Double.MIN_VALUE donne le plus petit positive IEEE-754 binary64 "subnormale nombre" (aussi connu comme anormale ou subnormale numéros). Cela correspond à 2-1074, qui est à peu près à 4,94 × 10-324. (C'est aussi le nombre donné par .NET Double.Epsilon.)

Tsdr:

Pour comprendre pourquoi ces chiffres sont ce qu'ils sont et quelle est la différence entre eux, nous aurons à examiner plus en profondeur. (Lire également la réponse par Bosonix.)

Considérons la représentation binaire de l'IEEE-754 binary64 format:

s_eee_eeee_eeee_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm_mmmm

La norme IEEE-754 binary64 les valeurs sont dérivées en tant que tel:

  • Si e est supérieure à 0 et inférieure à 2047 (2047 est - 111_1111_1111 en binaire),

    alors la valeur est égale à (-1)s × 2e-1023 × (1 + m × 2-52). (Ce sont les nombres normaux.)

  • Si e est égal à 0,

    puis la valeur est égale à (-1)s × 2(e+1)-1023 × (0 + m × 2-52). (En plus de zéro, ce sont les nombres dénormalisés.)

  • Si e est égal à 2047 et m est égal à 0,

    puis la valeur est égale à (-1)s × infini.

  • Si e est égal à 2047 et m n'est pas égal à 0,

    puis la valeur est égale à NaN. (Sans effet: il y a donc 2 × (252 - 1) bits différents de représentation NaN; cf. doubleToRawLongBits.)

Par conséquent, la plus petite positif IEEE-754 binary64 nombre normal est égal à:

(-1)0 × 21-1023 × (1 + 0 × 2-52)

= 2-1022

Et la plus petite positif IEEE-754 binary64 subnormale nombre est égal à:

(-1)0 × 2(0+1)-1023 × (0 + 1 × 2-52)

= 2-1022 × 2-52

= 2-1074

3voto

bosonix Points 1104

Pour des raisons de simplicité, l'explication tenir compte des nombres positifs.

L'espacement maximal entre deux adjacents normalisée des nombres à virgule flottante 'x1" et " x2 " est - 2 * epsilon * x1 (normalisé des nombres à virgule flottante ne sont pas uniformément espacés, ils sont espacés de manière logarithmique). Ce qui signifie que lorsqu'un nombre réel (c'est à dire la "mathématique" nombre) est arrondie à un nombre à virgule flottante, le maximum de l'erreur relative est - epsilon, ce qui est une constante appelée epsilon machine ou de l'unité d'arrondi, et pour la double précision, il a la valeur 2^-52 (valeur approximative 2.22 e-16).

Les nombres en virgule flottante plus petit que Double.MIN_NORMAL sont appelés subnormals, et ils sont également à combler l'écart entre 0 et Double.MIN_NORMAL. Cela signifie que les calculs impliquant subnormals peut conduire à des résultats moins précis. À l'aide de subnormals permet un calcul à une perte de précision plus lentement lorsque le résultat est petite.

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