MATLAB

2010-11-19 15 views
6

'da sprintf ile bir değişkenin ondalık sayılarını gösterme sprintf komutunu kullanarak gerçekleşen bir sonraki şeyi anlamıyorum.MATLAB

>> vpa(exp(1),53) 

ans = 

2.7182818284590455348848081484902650117874145507812500 


>> e = 2.7182818284590455348848081484902650117874145507812500 

e = 

2.7183 

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

ans = 

2.71828182845904550000000000000000000000000000000000000 

Neden sprintf bana gösterir numara e numara yerine yuvarlak ve ben ilk yerde muhafaza? Oluşturduğunuz değişken e yaklaşık 16 haneden oluşan double hassasiyeti, sınırlıdır böylece

+0

Sorunuzla ilgili hiçbir şey yapamazsınız, ancak "e" ifadesinin gerçek hanelerini istiyorsanız, "vpa ('exp (1)', 53)» – MarkV

+0

@MarkV: Evet, ancak hoşuma gidiyor o. Teşekkür ederim! – Peterstone

cevap

5

Değişkenler, MATLAB varsayılan tarafından double precisionvardır. Daha fazla rakam girmiş olmanıza rağmen, çifte fazla sayıdaki tüm rakamları doğru olarak temsil etme ve temsil edebilecek en yakın numaraya doğru çevirme hassasiyeti yoktur.

DÜZENLEME: olarak ben yayınlanmıştır this follow-up question için onun cevabını Andrew Janke tarafından daha ayrıntılı olarak açıklanmıştır, sen e için seçtiğimiz sayı sadece ikili bir değerin tam ondalık genişleme olur. Diğer bir deyişle, yakındaki bir kayan nokta sayısının yuvarlanacağı tam olarak temsil edilen değerdir. Bununla birlikte, bu durumda, ondalık noktadan yaklaşık 16 basamaktan fazla bir şey, çift duyarlıklı bir türle doğru bir şekilde tam olarak temsil edilemediğinden, önemli sayılmamaktadır. Bu nedenle, SPRINTF gibi işlevler, bu küçük değerleri otomatik olarak yok sayar, bunun yerine sıfırları yazdırır.

+1

Bir adım atladınız: Sprintf kullanırken e, dolaylı olarak ikiye dönüştürülür. Değişkenler ... – Marc

+1

@Marc: Hm? Burada e zaten çifte çünkü kopya ve yapıştırma nedeniyle bir edebi başlangıçtan başlatıldı. Matlab'da, tüm sayısal değişmezler çift değerler üretir. "Çift" i döndüren "class (2.7182818284590455348848081484902650117874145507812500)" ile onaylayabilirsiniz. sınıf (exp (1)) da iki katıdır. Gösterilen basamakların çoğu sahte, çünkü çiftin hassasiyet sınırını aşarlar; vpa() onları printf() gibi sıfırlamaz. –

+0

Haklısınız. Bunu kodda özledim. – Marc