86 votes

Combien de chiffres significatifs ont les flottants et les doubles en Java ?

Un float a-t-il 32 chiffres binaires et un double 64 chiffres binaires ? La documentation était trop difficile à comprendre.

Tous les bits se traduisent-ils par des chiffres significatifs ? Ou bien l'emplacement de la virgule occupe-t-il une partie des bits ?

117voto

marcus Points 1244

flotteur : 32 bits (4 octets) où 23 bits sont utilisés pour la mantisse (environ 7 chiffres après la virgule). 8 bits sont utilisés pour l'exposant, de sorte qu'un flottant peut "déplacer" le point décimal vers la droite ou vers la gauche en utilisant ces 8 bits. Cela permet d'éviter de stocker de nombreux zéros dans la mantisse, comme dans 0,0000003 (3 × 10 -7 ) ou 3000000 (3 × 10 7 ). Un bit est utilisé comme bit de signe.

double : 64 bits (8 octets) où 52 bits sont utilisés pour la mantisse (environ 16 chiffres décimaux). 11 bits sont utilisés pour l'exposant et 1 bit est le bit de signe.

Puisque nous utilisons le binaire (uniquement 0 et 1), un bit de la mantisse est implicitement à 1 (le float et le double utilisent tous deux cette astuce) lorsque le nombre n'est pas nul.

De plus, comme tout est en binaire (mantisse et exposants), les conversions en nombres décimaux ne sont généralement pas exactes. Des nombres comme 0,5, 0,25, 0,75, 0,125 sont stockés exactement, mais pas 0,1. Comme d'autres l'ont dit, si vous devez stocker des cents avec précision, n'utilisez pas float ou double, mais int, long, BigInteger ou BigDecimal.

Sources :

http://en.wikipedia.org/wiki/Floating_point#IEEE_754:_floating_point_in_modern_computers

http://en.wikipedia.org/wiki/Binary64

http://en.wikipedia.org/wiki/Binary32

41voto

9999years Points 601

Un flottant de 32 bits a une précision d'environ 7 chiffres et un double de 64 bits a une précision d'environ 16 chiffres.

Réponse longue :

Les nombres à virgule flottante ont trois composantes :

  1. Un bit de signe, pour déterminer si le nombre est positif ou négatif.
  2. Un exposant, pour déterminer le ampleur du numéro.
  3. Une fraction, qui détermine la distance entre deux valeurs de l'exposant, le nombre est. On l'appelle parfois "le significand, la mantisse ou le coefficient"

Pour l'essentiel, cela revient à sign * 2^exponent * (1 + fraction) . La "taille" du nombre, son exposant, n'a pas d'importance pour nous, car il ne fait que écailles le la valeur de la partie fractionnée. Sachant que log(n) donne le nombre de chiffres de n † nous pouvons déterminer la précision d'un nombre à virgule flottante avec log(largest_possible_fraction) . Comme chaque bit d'un flotteur stocke 2 possibilités, un nombre binaire de n Les bits peuvent stocker un nombre jusqu'à 2 - 1 (a total de 2 valeurs où l'une des valeurs est zéro). Cela devient un peu un peu plus difficile, car il s'avère que les nombres à virgule flottante sont stockés avec un bit de moins. de fraction de moins que ce qu'ils peuvent utiliser, parce que les zéros sont représentés de manière spéciale et que tous les nombres non nuls ont une valeur de 0. et tous les nombres non nuls ont au moins un bit binaire non nul.‡

En combinant ces éléments, les chiffres de précision d'un nombre à virgule flottante sont les suivants log(2)n est le nombre de bits de la fraction du nombre à virgule flottante. fraction du nombre à virgule flottante. Un nombre flottant de 32 bits possède 24 bits de fraction pour une précision de 7,22 décimales. et un double de 64 bits a 53 bits de fraction pour une précision de 15,95 décimales. de précision.

Pour en savoir plus sur la précision de la virgule flottante, vous pouvez consulter le concept de a machine epsilon .


† Pour n 1 au moins - pour d'autres nombres, votre formule ressemblera davantage à log(|n|) + 1 .

‡ "Cette règle est diversement appelée convention sur les bits de tête, convention sur les bits implicites ou convention sur les bits cachés. implicite, ou la convention du bit caché." ( Wikipedia (en anglais) )

17voto

dystroy Points 145126

De spécification java :

Les types à virgule flottante sont float et doubl associés aux formats simple précision 32 bits et double précision 64 bits de l'IEEE 754 et aux opérations spécifiées dans la norme IEEE Standard for Binary Floating-Point Arit 754-1985 (IEEE, New York).

Comme il est difficile de faire quoi que ce soit avec des nombres sans comprendre les principes de base de l'IEEE754, voici autre lien .

Il est important de comprendre que la précision n'est pas uniforme et qu'il ne s'agit pas d'un stockage exact des nombres, comme c'est le cas pour les entiers.

Un exemple :

double a = 0.3 - 0.1;
System.out.println(a);          

empreintes

0.19999999999999998

Si vous avez besoin d'une précision arbitraire (par exemple à des fins financières), vous pouvez avoir besoin de Grande décimale .

7voto

Joop Eggen Points 30166

Une réponse mathématique normale.

Sachant qu'un nombre à virgule flottante se compose de quelques bits représentant l'exposant et du reste, la plupart des chiffres (dans le système binaire), on se trouve dans la situation suivante :

Avec un exposant élevé, disons 10²³, si le bit le moins significatif est modifié, une grande différence entre deux nombres adjacents distinguables apparaît. En outre, le point décimal en base 2 fait que de nombreux nombres en base 10 ne peuvent être qu'approximatifs ; 1/5, 1/10 étant des nombres sans fin.

Ainsi, en général Les nombres à virgule flottante ne doivent pas être utilisés si vous vous souciez des chiffres significatifs. Pour les montants monétaires avec calcul, e,a, il est préférable d'utiliser BigDecimal .

Para physique virgule flottante doubles sont adéquates, flotteurs presque jamais. En outre, la partie à virgule flottante des processeurs, la FPU, peut même utiliser un peu plus de précision en interne.

3voto

scravy Points 3070

Les nombres à virgule flottante sont codés en utilisant une forme exponentielle, c'est-à-dire quelque chose comme m * b ^ e c'est-à-dire qu'ils ne ressemblent pas du tout à des entiers. La question que vous posez aurait un sens dans le contexte de nombres en virgule fixe . Il existe de nombreuses bibliothèques d'arithmétique en virgule fixe disponible.

En ce qui concerne l'arithmétique à virgule flottante : Le nombre de chiffres décimaux dépend de la présentation et du système de numération. Par exemple, il existe des nombres périodiques ( 0.33333 ) qui n'ont pas de présentation finie en décimal mais qui en ont une en binaire et vice versa.

Il convient également de mentionner que les nombres à virgule flottante jusqu'à un certain point ont une différence supérieure à un, c'est-à-dire value + 1 rendements value puisque value + 1 ne peut pas être encodé à l'aide de m * b ^ em , b y e sont de longueur fixe. Il en va de même pour les valeurs inférieures à 1, c'est-à-dire que tous les points de code possibles n'ont pas la même distance.

C'est pourquoi il n'est pas possible de déterminer avec précision n comme pour les nombres en virgule fixe, puisque tous les nombres ayant une valeur n Les chiffres décimaux ont un encodage IEEE.

Il existe un document presque obligatoire à lire qui explique les nombres à virgule flottante : Ce que tout informaticien doit savoir sur l'arithmétique à virgule flottante .

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