2012-11-09 1 views
0

Ce que je pensais être un ajout trivial dans le code C standard compilé par GCC m'a quelque peu troublé. Si j'ai un double appelé A et aussi un double appelé B, et A = une exponentielle très petite disons 1e-20 et B est une valeur plus grande par exemple 1e-5 - pourquoi mon double C qui est égal à la somme A + B prend la valeur dominante B? J'espérais que lorsque je spécifiais imprimer à 25 décimales j'obtiendrais 1.00000000000000100000e-5. Au lieu de cela, je n'ai que 1.00000000000000000000e-5. Dois-je utiliser long double ou autre chose?C: Ajout d'exponentielles

Très confus, et une question facile pour la plupart de répondre, je suis sûr! Merci pour toute orientation à l'avance.

+2

"Dois-je utiliser long double ou autre chose?" Est-ce que tu l'as essayé? – Nocturno

+1

'1e-5 + 1e-20 => 1.0000000000000011e-5' Si vous imprimez suffisamment de place, vous devriez obtenir la différence. –

+2

Les deux chiffres pertinents dans la différence sont espacés de 15, ce qui est proche de la fin de la gamme qu'un «double» peut exprimer. Notez que cela n'a aucun sens d'imprimer plus de 17 chiffres décimaux. –

Répondre

1

Oui, il n'y a pas assez de précision dans la double mantisse. 2^53 (la précision de la double mantisse) est seulement légèrement supérieure à 10^15 (le rapport entre 10^20 et 10^5) de sorte que l'expansion binaire et l'arrondi peuvent facilement écraser de petits bits à la fin.

http://en.wikipedia.org/wiki/Double-precision_floating-point_format

Google est votre ami, etc.

+1

2^53 est presque 10^16 – Henrik

+0

oui, 9 x 10^15 - mais encore il est théoriquement suffisant que - si ce n'était pas pour les expansions binaires de décimales étant récurrentes et arrondir les erreurs alors il devrait être bien – jheriko

+0

Merci - Cela a du sens maintenant. – Protoplanet

-1

variables à virgule flottante peuvent contenir une plus grande gamme de valeur que le point fixe, mais leur précision sur chiffre significatif a des limites.
Vous pouvez représenter des nombres très grands ou très petits mais la précision dépend du nombre de chiffres significatifs.
Si vous essayez de faire fonctionner très loin les nombres en termes d'exposant utilisé pour les exprimer, la possibilité de travailler avec eux dépend de la capacité à les représenter avec le même exposant.
Dans le cas où vous essayez de faire la somme des deux nombres, les plus petits nombres correspondent en exposant avec le plus grand, ce qui donne un 0 parce que son chiffre significatif est hors de portée. Vous pouvez en apprendre plus par exemple sur wiki

+0

Pour le cas en question, l'exactitude du double * est * suffisante. – Henrik