Comment Nan et L'infini d'un flotteur ou d'un double sont-ils stockés en mémoire?

d'après ce que j'ai compris, java stockera un float en mémoire sous la forme d'un entier 32 bits avec les propriétés suivantes:

  • Le premier bit est utilisé pour déterminer le signe
  • les 8 bits suivants représentent l'exposant
  • les 23 derniers bits sont utilisés pour stocker la fraction

cela ne laisse pas de pièces de rechange pour les trois cas spéciaux:

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

je peux deviner que négatif 0 pourrait être utilisé pour stocker un de ceux-ci.

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

37
demandé sur Rahul Tripathi 2016-03-22 12:55:07

5 réponses

Java spécifie que les nombres à virgule flottante suivent le IEEE 754 standard.

Voici comment il est stocké:

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

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

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 obtenu la sortie suivante 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 le champ exposant est all-bits-1, Le nombre est Inf ou NaN. Inf a tous les bits du zéro de mantissa; NaN a au moins un bit dans le mantissa fixé à 1. Le bit de signe conserve sa signification normale pour Inf mais n'est pas significatif pour NaN. Java est Double.NaN est une valeur particulière qui sera interprétée comme NaN, mais il y a 2 53-3 autres.

53
répondu Darshan Mehta 2016-03-22 14:12:25

ici:

Q. Comment le zéro, l'infini et la NaN sont-ils représentés en utilisant IEEE 754?

A. en réglant tous les bits exposant à 1. L'infini positif = 0x7ff0000000000000 (tous les bits exposant 1, bit de signe 0 et tous les mantissa bits 0), l'infini négatif = 0xfff0000000000000 (tous les bits exposant 1, signe bit 1 et tous les bits de mantissa 0), NaN = 0x7ff8000000000000 (tous exposant bits 1, au moins un jeu de bits mantissa). Zéro positif = tous bits 0. Zéro négatif = tous les bits 0, sauf le signe bit qui est 1.

référez aussi les Javadocs à propos de NAN, l'Infini Positif et Négatif de l'Infini.

17
répondu Rahul Tripathi 2016-03-22 10:08:04

Comme décrit dans Wikipédia, l'exposant avec tous les bits mis à 1 est utilisé pour identifier ces numéros. Le champ fraction fixé à 0 est utilisé pour identifier l'infini (positif ou négatif, tel qu'identifié par le signe), et un champ fraction non-zéro identifie une valeur NaN.

5
répondu yole 2016-03-22 10:01:27

Java utilise IEEE 754 floating point.

la plupart des nombres sont exprimés dans un format sign-exposant-mantissa avec le mantissa ayant un leader implicite 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. Ils sont plutôt utilisés pour représenter des cas spéciaux.

tous les zéros dans l'exposant feild est utilisé pour représenter des nombres (y compris les zéro positif et négatif) qui sont trop petits pour représenter dans le format normal.

tous ceux de l'exponentiel sont utilisés pour représenter des valeurs spéciales. Si tous les bits de la mantissa sont nuls, alors la valeur est plus ou moins infinity (signe indiqué par le signe bit). Sinon, la valeur est NaN.

3
répondu plugwash 2016-04-05 08:29:53

tout d'abord nous devons apprendre comment le nombre est représenté comme le point de flottaison et le double dans la mémoire.

le numéro général est de la forme: 1.M * 2 ^ e.

(où M est appelé mantisse et le e est l'exposant, dans l'excès-127)

En virgule flottante

le MSB (bit le plus significatif) est utilisé comme bit de signe et le nombre de bits de 23 à 31 est utilisé pour la valeur exponentielle sous la forme de l'excès-127 et le bit nombre de 0 à 30 est utilisé pour stocker le mantissa.

En Double

le MSB (bit le plus significatif) est utilisé comme bit de signe et le nombre de bits de 52 à 63 est utilisé pour la valeur exponentielle sous la forme de l'excès-127 et le nombre de bits de 0 à est utilisé pour stocker le mantissa.

donc maintenant nous sommes en position pour comprendre la représentation de NaN, Infinity dans le flotteur ou le double.

NaN(Pas un Nombre)

dans la représentation de la NaN tous les bits exposant sont 1 et les bits de Mantissa peuvent être n'importe quoi et il n'importe pas qu'il soit en flottant ou décimal.

Infini

dans la représentation de L'infini tous les bits exposant sont 1 et les bits Mantissa sont 0 et il n'importe pas qu'il soit en flottant ou décimal. l'Infini positif est juste représenter par la même que ci-dessus mais le bit de signe est 0 et la infini négatif est également représenté par le même, mais le bit de signe est ici 1.

0
répondu Rahul Dhawan 2017-02-15 09:50:14