2010-11-19 5 views
6

Je ne comprends pas la prochaine chose qui arrive en utilisant la commande sprintf.Affichage des décimales d'une variable avec sprintf dans MATLAB

>> vpa(exp(1),53) 

ans = 

2.7182818284590455348848081484902650117874145507812500 


>> e = 2.7182818284590455348848081484902650117874145507812500 

e = 

2.7183 

>> sprintf('%0.53f', e) 

ans = 

2.71828182845904550000000000000000000000000000000000000 

Pourquoi sprintf me montrer le nombre e arrondi au lieu du nombre et je continuais à la première place?

+0

Cela n'a peut-être rien à voir avec votre question, mais si vous voulez les vrais chiffres de 'e' vous devriez taper' vpa ('exp (1)', 53) ' – MarkV

+0

@MarkV: Oui, mais j'aime il. Je vous remercie! – Peterstone

Répondre

5

Les variables sont double precisionpar défaut dans Matlab, de sorte que la e variable que vous créez est limitée à la précision d'un double, qui est d'environ 16 chiffres. Même si vous avez entré plus de chiffres, un double n'a pas la précision de représenter exactement tous ces chiffres supplémentaires et arrondit au nombre le plus proche qu'il peut représenter.

EDIT: Comme expliqué plus en détail par Andrew Janke dans sa réponse à this follow-up question j'ai posté, le numéro que vous avez choisi pour e se trouve être une expansion décimale exacte de la valeur binaire. En d'autres termes, c'est la valeur exactement représentable à laquelle un nombre à virgule flottante proche serait arrondi. Cependant, dans ce cas, quelque chose de plus de 16 chiffres au-delà de la virgule décimale n'est pas considéré significatif car il ne peut pas vraiment être représenté avec précision par un type à double précision. Par conséquent, des fonctions telles que SPRINTF ignorent automatiquement ces petites valeurs, imprimant des zéros à la place.

+1

vous avez sauté une étape: Lors de l'utilisation de sprintf, e est implicitement converti en un double. Les variables sont ... – Marc

+1

@Marc: Hm? Ici, e est déjà un double car il est initialisé à partir d'un littéral en raison de la copie et du collage. Dans Matlab, tous les littéraux numériques produisent des valeurs doubles. Vous pouvez le confirmer avec "class (2.7182818284590455348848081484902650117874145507812500)", qui renvoie 'double'. class (exp (1)) est double, aussi. La plupart des chiffres affichés sont faux parce qu'ils dépassent la limite de précision du double; vpa() ne les supprime pas comme printf(). –

+0

Vous avez raison. J'ai manqué ça dans le code. – Marc

Questions connexes