Combien de chiffres significatifs ont des flottants et des doubles en java?


Est un flotteur de 32 chiffres binaires et un double de 64 chiffres binaires? La documentation était trop difficile à comprendre.

Tous les bits se traduisent - ils en chiffres significatifs? Ou l'emplacement du point décimal prend-il certains bits?

Author: Denys Séguret, 2012-11-24

6 answers

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 flotteur peut "déplacer" le point décimal vers la droite ou vers la gauche en utilisant les 8 bits. Ceci permet d'éviter de stocker beaucoup de zéros dans la mantisse comme dans 0.0000003 (3 × 10-7) ou 3000000 (3 × 107). Il y a 1 bit utilisé comme bit de signe.

Double: 64 bits (8 octets) où 52 bits sont utilisé 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 binaire (seulement 0 et 1), un bit dans la mantisse est implicitement 1 (float et double utilisent cette astuce) lorsque le nombre est non nul.

De plus, puisque 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 0.1 ne l'est pas. Comme d'autres l'ont dit, si vous devez stocker les cents avec précision, ne pas utiliser float ou double, utiliser 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

 78
Author: marcus, 2017-07-25 15:02:08

Despécification java :

Les types à virgule flottante sont float et double, qui sont conceptuellement associé à la simple précision 32 bits et de double précision format 64 bits IEEE 754 valeurs et opérations comme spécifié dans IEEE Norme pour l'Arithmétique Binaire à Virgule Flottante, Norme ANSI/IEEE 754-1985 (IEEE, New York).

Comme il est difficile de faire quoi que ce soit avec des nombres sans comprendre les bases de IEEE754, voici un autre lien.

Il est important de comprendre que la précision n'est pas uniforme et que ce n'est pas un stockage exact des nombres comme cela se fait pour les entiers.

Un exemple:

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

Imprime

0.19999999999999998

Si vous avez besoin d'une précision arbitraire (par exemple à des fins financières), vous aurez peut-être besoin de Big Decimal.

 16
Author: Denys Séguret, 2012-11-24 16:22:59

Une réponse mathématique normale.

En comprenant qu'un nombre à virgule flottante est implémenté sous forme de bits représentant l'exposant et le reste, la plupart pour les chiffres (dans le système binaire), on a la situation suivante:

Avec un exposant élevé, disons 1023 si le bit le moins significatif est modifié, une grande différence entre deux nombres différentiables adjacents apparaît. En outre, le point décimal de base 2 fait que de nombreux nombres de base 10 ne peuvent être approximés; 1/5, 1/10 étant un nombre sans fin.

Donc dansgé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, meilleur usageBigDecimal .

Pour physique virgule flottante double sont adéquates, flotteurs presque jamais. De plus, la partie virgule flottante des processeurs, le FPU, peut même utiliser un peu plus de précision en interne.

 5
Author: Joop Eggen, 2012-11-24 16:30:23

Les nombres à virgule flottante sont codés en utilisant une forme exponentielle, c'est-à-dire quelque chose comme m * b ^ e, c'est-à-dire pas du tout comme les entiers. La question que vous posez serait significative dans le contexte des nombres à points fixes . Il existe de nombreuses bibliothèques arithmétiques à points fixes disponibles.

Concernant l'arithmétique à virgule flottante: Le nombre de chiffres décimaux dépend de la présentation et du système de nombres. Par exemple, il existe des nombres périodiques (0.33333) qui n'ont pas présentation finie en décimal mais 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 que value + 1 donne value, car value + 1 ne peut pas être codé en utilisant m * b ^ e, où m, b et e sont fixes en longueur. La même chose se produit pour les valeurs inférieures à 1, c'est-à-dire que tous les points de code possibles n'ont pas la même distance.

Pour cette raison, il n'y a pas de précision de exactement n les chiffres comme avec les nombres à points fixes, car tous les nombres avec n chiffres décimaux n'ont pas un codage IEEE.

Il y a un document presque obligatoire que vous devriez lire alors qui explique les nombres à virgule flottante: Ce que tout informaticien devrait savoir sur l'arithmétique à virgule flottante.

 3
Author: scravy, 2016-12-02 10:06:49

Un float 32 bits a environ 7 chiffres de précision et un double 64 bits a environ 16 chiffres de précision

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 la ampleur le nombre.
  3. Une fraction, qui détermine à quelle distance entre deux valeurs d'exposant le nombre être. Cela est parfois appelé "le significande, mantisse, ou coefficient "

Essentiellement, cela fonctionne à sign * 2^exponent * (1 + fraction). Taille" du nombre, son exposant, n'est pas pertinent pour nous, car il ne fait que mettre à l'échelle le valeur de la portion de fraction. 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). Parce que chaque bit dans un flotteur stocke 2 les possibilités, un nombre binaire de n bits peut stocker un nombre maximum de 2ⁿ - 1 (un total de 2ⁿ valeurs lorsque l'une des valeurs est égale à zéro). Cela devient un peu poilus, car il s'avère que les nombres à virgule flottante sont stockés avec un moins de bits de fraction qu'ils ne peuvent utiliser, car les zéros sont représentés spécialement et tous les nombres non nuls ont au moins un bit binaire non nul.‡

En combinant cela, les chiffres de précision pour un nombre à virgule flottante sont log₁₀(2ⁿ), où n est le nombre de bits du nombre à virgule flottante fraction. Un flotteur 32 bits a 24 bits de fraction pour ≈7,22 décimal les chiffres de précision, et un double 64 bits a 53 bits de fraction pour ≈15,95 chiffres décimaux de la précision.

Pour en savoir plus sur la précision en virgule flottante, vous voudrez peut-être lire sur le concept de un machine epsilon.


† Pour n ≥ 1 au moins - pour les autres nombres, votre formule ressemblera davantage ⌊log₁₀(|n|)⌋ + 1.

‡ " Cette règle est diversement appelée la convention de bit principal, le bit implicite convention, ou la convention de bit caché." (Wikipedia)

 3
Author: 9999years, 2018-06-28 20:48:49

Regarder Float.intBitsToFloat et Double.longBitsToDouble, quel type d'expliquer comment les bits correspondent à des nombres à virgule flottante. En particulier, les bits d'un float normal ressemblent à

 s * 2^exp * 1.ABCDEFGHIJKLMNOPQRSTUVW

Où A...W sont 23 bits -- 0s et 1s representing représentant une fraction en binaire s s est + / -1, représenté par un 0 ou un 1 respectivement, et exp est un entier signé de 8 bits.

 1
Author: Louis Wasserman, 2012-11-24 16:33:58