Pourquoi les nombres significatifs en nombres à virgule flottante sont 7 ou 6

Je vois ceci dans le journal Wikipedia 2 24 = 7.22 .

Je ne sais pas pourquoi nous devrions calculer 2 ^ 24 et pourquoi nous devrions prendre log10 …… J’ai vraiment besoin de votre aide.

pourquoi les nombres significatifs des nombres en virgule flottante sont 7 ou 6 (?)

Considérons quelques idées utilisant le principe de Pigeonhole :

  1. binary32 float peut encoder environ 2 32 numéros différents avec précision . Les nombres que l’on peut écrire dans un texte tel que 42.0, 1.0, 3.1415623 … sont infinis, même si nous nous limitons à une plage telle que -10 38 … +10 38 . Tout code temporel a une valeur textuelle telle que 0.1f , il est codé dans un float proche, qui peut ne pas être exactement la même valeur textuelle. La question qui se pose est la suivante: combien de chiffres pouvons-nous coder tout en maintenant un float distinctif?
  2. Pour les différentes puissances de 2, 2 23 (8 388 608) valeurs sont normalement codées linéairement .
  3. Dans la plage [1.0 … 2.0), 2 23 valeurs (8.388.608) sont codées linéairement .
  4. Dans la plage [2 33 ou 8 589 934 592 … 2 34 ou 17 179 869 184], à nouveau, 2 23 valeurs (8 388 608) sont codées linéairement : 1024,0 les unes des autres. Dans la fourchette inférieure (9 000 000 000 et 10 000 000 000), il existe environ 976 562 valeurs différentes.

Mettez cela ensemble …

  1. Sous forme de texte, la plage [1.000_000 … 2.000_000), qui utilise 1 chiffre principal et 6 tracés, compte 1 000 000 valeurs différentes. Par n ° 3, Dans la même plage, il existe 8 388 608 float différents, permettant à chaque valeur textuelle d’être mappée sur un float différent. Dans cette plage, nous pouvons utiliser 7 chiffres .

  2. Sous forme de texte, la plage [9 000 000 * 10 3 et 10 000 000 * 10 3 ), en utilisant les chiffres à 1 chiffre principal et 6 niveaux de suivi, contient 1 000 000 valeurs différentes. Par n ° 4, dans la même plage, il y a moins de 1 000 000 valeurs de float différentes. Ainsi, certaines valeurs textuelles décimales seront converties dans le même float . Dans cette plage, nous pouvons utiliser 6 chiffres, pas 7, pour les conversions distinctives.

Le cas le plus défavorable pour un float typique est 6 chiffres significatifs . Pour trouver la limite pour votre float :

 #include  printf("FLT_DIG = %d\n", FLT_DIG); // this commonly prints 6 

… aucune idée pourquoi nous devrions calculer 2 ^ 24 et pourquoi nous devrions prendre log10

2 ^ 24 est une généralisation comme avec float commun et ses 24 bits de précision binary , ce qui correspond à un système décimal fantaisiste avec 7,22 … chiffres. Nous prenons log10 pour comparer le float binary au texte décimal .

2 24 == 10 7.22 …

Pourtant, nous ne devrions pas prendre 2 24 . Voyons comment FLT_DIG est défini à partir de C11dr §5.2.4.2.2 11:

nombre de chiffres décimaux, q , de sorte que tout nombre à virgule flottante avec q chiffres décimaux puisse être arrondi en un nombre à virgule flottante avec p chiffres de radix b et inversement sans modification des q chiffres décimaux,

p log 10 b …………. si b est une puissance de 10
⎣ ( p – 1) log 10 b ⎦ .. sinon

Remarquez que “log 10 2 24 ” est identique à “24 log 10 2″.

En tant que float , les valeurs sont réparties linéairement entre les puissances de 2, comme indiqué dans le paragraphe 2.3,4.

En tant que texte , les valeurs sont dissortingbuées linéairement entre les puissances de 10, comme les valeurs à 7 chiffres significatifs de [1.000000 à 9.999999] * 10 some_exponent .

La transition de ces 2 groupes se produit à des valeurs différentes. 1,2,4,8,16,32 … versus 1,10,100, … Pour déterminer le cas le plus défavorable, nous soustrayons 1 aux 24 bits pour tenir compte du mauvais alignement.

( P – 1) log 10 b ⎦ -> floor((24 − 1) log10(2)) -> floor(6.923...) -> 6.

Si notre float utilisé la base 10, 100 ou 1 000, plutôt que le très commun 2, la transition de ces 2 groupes se produirait aux mêmes valeurs et nous ne soustiendrions pas un.

Un float simple précision IEEE 754 a une mantisse de 24 bits. Cela signifie qu’il a une précision de 24 bits.

Mais nous voudrions peut-être savoir combien de chiffres de précision ont cette précision.

Une façon de calculer cela consiste à considérer le nombre de nombres binarys sur 24 bits. La réponse, bien sûr, est 2 heures 24 . Donc, ces nombres binarys vont de 0 à 16777215.

C’est combien de chiffres décimaux? Log10 vous donne le nombre de chiffres décimaux. log10 (2 24 ) vaut 7,2, soit un peu plus de 7 chiffres décimaux.

Et regardez cela: 16777215 a 8 chiffres, mais le premier chiffre est juste 1, donc en fait, ce n’est qu’un peu plus de 7 chiffres.

(Bien sûr, cela ne signifie pas que nous ne pouvons représenter que des nombres de 0 à 16777215! Cela signifie que nous pouvons représenter des nombres de 0 à 16777215 exactement . Mais nous avons aussi l’exposant avec qui jouer. Nous pouvons représenter des nombres de 0 à 1677721.5 plus ou moins exactement à un endroit après la décimale, nombres de 0 à 167772.15 plus ou moins exactement à deux décimales, etc. Et nous pouvons représenter des nombres de 0 à 167772150, ou de 0 à 1677721500, mais progressivement moins exactement – toujours avec Une précision d’environ 7 chiffres, ce qui signifie que nous commençons à perdre de la précision dans les chiffres de poids faible situés à gauche du point décimal.)

Une autre façon de faire est de noter que log10 (2) vaut environ 0,3. Cela signifie qu’un bit correspond à environ 0,3 chiffre décimal. Donc 24 bits correspondent à 24 × 0,3 = 7,2.

(En fait, la virgule flottante à simple précision IEEE 754 ne stocke explicitement que 23 bits, et non 24. Cependant, il existe un premier bit implicite, nous obtenons donc l’effet de 24 bits.)

Commençons un peu plus petit. Avec 10 bits (ou 10 chiffres de base 2), vous pouvez représenter les nombres de 0 à 1023. Vous pouvez donc représenter jusqu’à 4 chiffres pour certaines valeurs, mais 3 chiffres pour la plupart des autres valeurs (celles inférieures à 1 000).

Pour savoir combien de chiffres en base 10 (décimaux) peuvent être représentés par un groupe de chiffres en base 2, vous pouvez utiliser le log10 () de la valeur représentable maximale, c’est-à-dire log10 (2 ^ 10) = log10 ( 2) * 10 = 3,01 ….

Ce qui précède signifie que vous pouvez représenter les valeurs à 3 chiffres ou moins et quelques valeurs à 4 chiffres. Cela se vérifie facilement: 0-999 a au plus 3 chiffres et 1000-1023 en a 4.

Maintenant, prenez 24 bits. En 24 bits, vous pouvez stocker log10 (2 ^ 24) = 24 * log (2) chiffres de base 10. Mais comme le bit du haut est toujours le même, vous ne pouvez en fait stocker que log10 (2 ^ 23) = log10 (8388608) = 6,92. Cela signifie que vous pouvez représenter la plupart des nombres à 7 chiffres, mais pas tous. Certains des nombres que vous pouvez représenter fidèlement ne peuvent avoir que 6 chiffres.

La vérité est toutefois un peu plus compliquée, car les exposants jouent également un rôle et que certaines des plus grandes valeurs possibles peuvent également être représentées. 6,92 peut donc ne pas être la valeur exacte. Mais cela se rapproche et peut très bien servir de règle générale, et c’est pourquoi on dit que la précision simple peut représenter 6 à 7 chiffres.