39 votes

Comment est-ce que NaN et Infinity d'un float ou double sont stockés en mémoire?

Ce que je comprends java va stocker un flotteur dans la mémoire comme un entier de 32 bits, avec les propriétés suivantes:

  • Le premier bit est utilisé pour déterminer le signe
  • Les 8 bits représentent l'exposant
  • La finale des 23 bits sont utilisés pour stocker la fraction

Cela ne laisse pas de rechange bits pour les trois cas particuliers:

  • NaN
  • L'Infini Positif
  • L'Infini Négatif

Je peux deviner que négatif 0 peut être utilisé pour stocker de l'un de ces.

Comment sont-ils représentés dans la mémoire?

57voto

Darshan Mehta Points 4787

Java spécifie que les nombres à virgule flottante suivre la norme IEEE 754 la norme.

C'est comment il est stocké:

  • bit 0 : bit de signe
  • les bits 1 à 11 : exposant
  • les bits 12 à 63 : fraction

Maintenant, j'ai exécuté ci-dessous la méthode avec différentes valeurs doubles:

public static void print(double d){
    System.out.println(Long.toBinaryString(Double.doubleToRawLongBits(d)));
}

J'ai exécuté avec ces valeurs:

print(Double.NaN);
print(Double.NEGATIVE_INFINITY);
print(Double.POSITIVE_INFINITY);
print(-Double.MAX_VALUE);
print(Double.MAX_VALUE);

Et a obtenu le résultat suivant pour les valeurs ci-dessus (formaté pour des raisons de lisibilité):

 NaN: 0111111111111000000000000000000000000000000000000000000000000000
-Inf: 1111111111110000000000000000000000000000000000000000000000000000
+Inf: 0111111111110000000000000000000000000000000000000000000000000000
-Max: 1111111111101111111111111111111111111111111111111111111111111111
+Max: 0111111111101111111111111111111111111111111111111111111111111111

Wikipedia explique que lorsque l'exposant champ est tous les bits à 1, le nombre est soit Inf ou NaN. Inf a tous les bits de la mantisse zéro; NaN a au moins un bit de la mantisse la valeur 1. Le bit de signe conserve sa signification normale pour Inf, mais n'est pas significatif pour NaN. Java Double.NaN est une valeur particulière qui sera interprété comme NaN, mais il y a 253-3 autres.

17voto

Rahul Tripathi Points 1

À partir d' ici:

Q. Comment est égale à zéro, l'infini et NaN représentés à l'aide de la norme IEEE 754?

A. Par le réglage de tous les bits d'exposant à 1. L'infini positif = 0x7ff0000000000000 (tous les bits d'exposant 1, le bit de signe 0 et tous les mantisse les bits 0), l'infini négatif = 0xfff0000000000000 (tous les bits d'exposant 1, bit de signe 1 et tous les bits de la mantisse 0), NaN = 0x7ff8000000000000 (tous les bits d'exposant 1, au moins un ensemble de bits de la mantisse). Positif zéro = tous les bits 0. Négatif zéro = tous les bits à 0, sauf le bit de signe est 1.

Se référer également à la Javadoc sur NAN, l'Infini Positif et Négatif de l'Infini.

5voto

yole Points 3628

Comme décrit dans Wikipedia , l'exposant avec tous les bits mis à 1 est utilisé pour identifier ces nombres. Le champ de fraction défini sur 0 est utilisé pour identifier l'infini (positif ou négatif, comme indiqué par le signe), et un champ de fraction non nul identifie une valeur NaN.

3voto

plugwash Points 795

Java utilise la norme IEEE 754 en virgule flottante.

La plupart des chiffres sont exprimés dans un signe-exposant-mantisse format avec la mantisse avoir un implicite leader de 1.

Les valeurs extrêmes de l'exposant (tous les zéros et tous ceux) champ ne sont pas utilisées normalement valeurs d'exposant. Au lieu de cela, ils sont utilisés pour représenter des cas particuliers.

Tous les zéros en l'exposant à la jeunesse est utilisé pour représenter les nombres (y compris à la fois positifs et négatifs zéro) qui sont trop petites pour être représentées dans le format normal.

Tous ceux dans le exponenent est utilisé pour représenter des valeurs spéciales. Si tous les bits de la mantisse sont à zéro, alors la valeur est plus ou moins l'infini (signe indiqué par le bit de signe). Sinon, la valeur est NaN.

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