Combien de décimales ne la primitive float et double support? [dupliquer]

cette question a déjà une réponse ici:

j'ai lu que les doubles magasins 15 chiffres et les magasins flottants 7 chiffres.

ma question Est, est-ce que ces nombres le nombre de décimales soutenues ou total nombre de chiffres dans un nombre?

3
c++
demandé sur code511788465541441 2015-01-20 15:48:39

4 réponses

il s'agit du nombre total de" chiffres significatifs " si vous voulez, en comptant de gauche à droite, indépendamment de l'endroit où le point décimal est. Au-delà de ces nombres de chiffres, l'exactitude n'est pas préservée.

les nombres que vous avez énumérés sont pour la représentation de base 10.

3
répondu John Zwinck 2015-01-20 12:50:10

il y a des macros pour le nombre de décimales que chaque type supporte. Le gcc docs expliquer ce qu'ils sont et aussi ce qu'ils signifient:

FLT_DIG

il s'agit du nombre de décimales de précision pour le type de données float. Techniquement, si p et b sont la précision et la base (respectivement) pour la représentation, alors la précision décimale q est le nombre maximum de décimales telles que tout numéro à virgule flottante avec q base 10 chiffres peut être arrondi à un numéro à virgule flottante avec P base b chiffres et retour, sans changement aux décimales Q.

la valeur de cette macro est supposée être au moins 6 , pour satisfaire à la norme ISO C.

DBL_DIG

LDBL_DIG

ceux-ci sont similaires à FLT_DIG, mais pour les types de données double et long double, respectivement. Les valeurs de ces macros sont supposées être au moins 10 .

sur gcc 4.9.2 et clang 3.5.0, ces macros donnent respectivement 6 et 15.

2
répondu Barry 2015-01-20 12:52:23

s'agit-il du nombre de décimales supportées ou du nombre total de chiffres dans un nombre?

ce sont les chiffres significatifs contenus dans chaque numéro (bien que vous n'ayez pas besoin de tous, mais ils sont toujours là). Le mantissa du même type contient toujours le même nombre de bits, donc chaque nombre contient conséquemment le même nombre de "chiffres" valides si vous pensez en termes de décimale chiffre. Vous ne pouvez pas stocker plus de chiffres s'inscrivent dans la mantisse.

le nombre de chiffres" supportés "est cependant beaucoup plus grand, par exemple float supporte habituellement jusqu'à 38 chiffres décimaux et double supporte jusqu'à 308 chiffres décimaux, mais la plupart de ces chiffres sont non significatif (c'est-à-dire"inconnu").

bien que techniquement, c'est faux, puisque float et double n'ont pas des tailles universellement bien définies comme je l'ai supposé ci-dessus (elles sont définies par la mise en œuvre). De plus, les tailles d'entreposage ne sont pas nécessairement les mêmes que celles des résultats intermédiaires.

la norme c++ est très réticente à définir précisément n'importe quel type fondamental, laissant presque tout à l'implémentation. Les types à virgule flottante ne font pas exception:

3.9.1 / 8

Il existe trois types à virgule flottante: float, double et long double. Le type double est au moins autant de précision que le flotteur, et le type long double offre au moins autant de précision double. L'ensemble des valeurs de type float est un sous-ensemble de l'ensemble de valeurs de type double; l'ensemble des valeurs de type double est un sous-ensemble de l'ensemble de valeurs de type long double. La représentation de la valeur des types à virgule flottante est définie par la mise en œuvre.

Maintenant, bien sûr, tout cela n'est pas particulièrement utile dans la pratique.

en pratique, floating point est (habituellement) conforme IEEE 754, avec float ayant une largeur de 32 bits et double ayant une largeur de 64 bits (comme stocké dans la mémoire, les registres ont une plus grande précision sur certaines architectures mainstream notables).

cela équivaut à 24 bits et 53 bits de matissa, respectivement, ou 7 et 15 décimales complètes .

1
répondu Damon 2015-01-20 13:46:14

si vous êtes sur une architecture utilisant IEEE-754 arithmétique à virgule flottante (comme dans la plupart des architectures), alors le type float correspond à une seule précision, et le type double correspond à une double précision, comme décrit dans la norme.

faisons quelques nombres:

Simple précision:

32 bits pour représenter le nombre, dont 24 bits pour mantissa. Cela signifie que le bit le moins significatif (LSB) a une valeur relative de 2^(-24) respect à L'ESM, qui est le "1 caché", et il n'est pas représenté. Par conséquent, pour un exposant fixe, la valeur minimum représentative est 10^(-7.22) fois l'exposant. Cela signifie que pour une représentation dans la notation de l'exposant de base (3.141592653589 E 25), seuls les nombres décimaux" 7.22 " sont significatifs, ce qui signifie en pratique qu'au moins 7 décimales seront toujours correctes.

Double précision:

64 bits pour représenter le nombre, dont 53 bits pour mantissa. Suivant le même raisonnement, exprimant 2^(-53) comme une puissance de 10 résultats dans 10^(-15.95) , ce qui signifie qu'au moins 15 décimales seront toujours correctes.

1
répondu Samuel Navarro Lou 2015-01-20 14:10:02