2010-07-22 3 views
10

équivalant à log10 (2^24) ≈ 7.225 chiffres décimauxprécision décimale de flotteurs

Wikipedia

Précision: 7 chiffres

MSDN

std::numeric_limits<float>::digits10 

Pourquoi numeric_limits retour 6 ici? Wikipedia et MSDN rapportent que les flottants ont 7 chiffres décimaux de précision.

+1

Je suppose que vous vouliez dire std :: numeric_limits :: digits10, non? – Scharron

+0

@Scharron: Bien, merci d'avoir repéré ça. Copier et coller une erreur. – liori

+0

duplication possible de [La précision des chiffres décimaux les plus significatifs pouvant être convertie en binaire et retour en décimal sans perte de signification 6 ou 7.225?] (Http://stackoverflow.com/questions/30688422/is-the-most- significatif-decimal-digits-precision-that-can-be-convert-to-binary) – Bryan

Répondre

13

En cas de doute, lisez les spécifications. La norme C++ indique que digits10 est:

Nombre de 10 chiffres de base pouvant être représentés sans modification.

C'est un peu vague; Heureusement, il y a une note:

équivalent à FLT_DIG, DBL_DIG, LDBL_DIG

Ceux-ci sont définis dans la norme C; regardons là-haut:

nombre de chiffres décimaux, q, de sorte que tout nombre à virgule flottante avec des chiffres décimaux q peut être arrondi en un nombre à virgule flottante avec Radix p chiffres b et à nouveau sans changement les q chiffres décimaux.

Alors std::numeric_limits<float>::digits10 est le nombre de chiffres décimaux tel que tout nombre à virgule flottante avec autant de chiffres ne change pas si vous le convertir en un float et retour en décimal. Comme vous le dites, les flottants ont environ 7 chiffres de précision décimale, mais l'erreur dans la représentation des nombres décimaux et des flottants de largeur fixe n'est pas uniformément logarithmique. L'erreur relative à arrondir un nombre de la forme 1.xxx .. à un nombre fixe de décimales est presque dix fois plus grand que l'erreur relative de l'arrondi 9.xxx .. au même nombre de décimales. De même, en fonction de l'endroit où une valeur tombe dans une binade, l'erreur relative en l'arrondissant à 24 chiffres binaires peut varier d'un facteur de près de deux. En conséquence, tous les nombres décimaux à sept chiffres ne survivent pas à l'aller-retour pour flotter et revenir, mais tous les décimaux à six chiffres le font. Par conséquent, std::numeric_limits<float>::digits10 est 6.

Il n'y a pas autant de décimales à six et sept chiffres avec des exposants dans une plage valide pour le type float; vous pouvez facilement écrire un programme pour les tester exhaustivement si vous n'êtes toujours pas convaincu.

+0

cour. "mais tous les décimales à six chiffres font" qu'en est-il de 0,3 (décimal)? Pouvez-vous nous en dire plus sur ces chiffres? –

+1

0,3 converti pour flotter (en supposant que la précision IEEE-754 ici) est exactement '0.300000011920928955078125'. Lorsque cette valeur est arrondie à six chiffres décimaux, le résultat est 0.3, donc il est inchangé quand float et retour en décimal avec six chiffres. Cela est vrai pour tous les décimaux à six chiffres dans la plage représentable de 'float'. –

+0

Par décimales de largeur fixe, vous voulez dire [nombres à virgule fixe] (http://en.wikipedia.org/wiki/Q_%28number_format%29) ou types intégraux? – legends2k

2

C'est vraiment seulement 23 bits dans la mantisse (il y a un 1 implicite, donc c'est effectivement 24 bits, mais le 1 ne varie évidemment pas). Cela donne 6.923689900271567 chiffres décimaux de précision, ce qui n'est pas tout à fait 7.

+0

Pas forcément. Tous les nombres normalisés ont ceci implicite 1. Mais votre commentaire m'a rappelé des nombres dénormalisés, qui ont moins de bits de précision. Merci. – liori

Questions connexes