2010-11-19 2 views
6

Ich verstehe nicht die nächste Sache, die mit dem sprintf Befehl passiert.Zeige Dezimalstellen einer Variablen mit sprintf in MATLAB

>> vpa(exp(1),53) 

ans = 

2.7182818284590455348848081484902650117874145507812500 


>> e = 2.7182818284590455348848081484902650117874145507812500 

e = 

2.7183 

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

ans = 

2.71828182845904550000000000000000000000000000000000000 

Warum zeigen Sie mir nicht sprintf die Zahl e anstelle der Zahl gerundet und ich an erster Stelle gehalten?

+0

Das hat vielleicht nichts mit Ihrer Frage zu tun, aber wenn Sie die wahren Ziffern von 'e' wollen, sollten Sie stattdessen' vpa ('exp (1)', 53) eingeben ' – MarkV

+0

@MarkV: Ja, aber ich mag es. Vielen Dank! – Peterstone

Antwort

5

Variablen sind double precisionstandardmäßig in MATLAB, so wird die Variable e, die Sie erstellen, um die Präzision eines Doppel begrenzt ist, die etwa 16 Stellen ist. Obwohl Sie mehr Ziffern eingegeben haben, verfügt ein Double nicht über die Genauigkeit, um alle zusätzlichen Ziffern genau darzustellen, und es wird auf die nächste Zahl abgerundet, die es darstellen kann.

EDIT: Wie ausführlicher erklärt Andrew Janke in seiner Antwort auf this follow-up question ich gepostet, die Nummer, die Sie für e wählte nur zufällig eine exakte Dezimalentwicklung des binären Wert. Mit anderen Worten, es ist der genau darstellbare Wert, auf den eine nahegelegene Gleitkommazahl gerundet werden würde. In diesem Fall wird jedoch alles, was mehr als ungefähr 16 Stellen nach dem Dezimalpunkt ist, nicht als signifikant betrachtet, da es nicht wirklich genau durch einen Typ mit doppelter Genauigkeit dargestellt werden kann. Daher werden Funktionen wie SPRINTF diese kleinen Werte automatisch ignorieren und stattdessen Nullen drucken.

+1

Sie haben einen Schritt übersprungen: Wenn Sie sprintf verwenden, wird e implizit in ein Double konvertiert. Variablen sind ... – Marc

+1

@Marc: Hm? Hier ist e bereits ein Double, weil es aufgrund des Kopierens und Einfügens aus einem Literal initialisiert wird. In Matlab erzeugen alle numerischen Literale doppelte Werte. Sie können dies mit "class (2.7182818284590455348848081484902650117874145507812500)" bestätigen, was "double" zurückgibt. Klasse (exp (1)) ist auch doppelt. Die meisten der angezeigten Ziffern sind falsch, weil sie die Genauigkeitsgrenze des Doppelten überschreiten. vpa() zerlegt sie nicht wie printf(). –

+0

Sie haben Recht. Das habe ich im Code verpasst. – Marc