2010-11-19 23 views
6

我不明白使用sprintf命令發生的下一件事。在MATLAB中使用sprintf顯示變量的小數點

>> vpa(exp(1),53) 

ans = 

2.7182818284590455348848081484902650117874145507812500 


>> e = 2.7182818284590455348848081484902650117874145507812500 

e = 

2.7183 

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

ans = 

2.71828182845904550000000000000000000000000000000000000 

爲什麼sprintf告訴我圓潤,而不是數數e和我保持在首位?

+0

這可能與你的問題無關,但如果你想要'e'的真實數字,你應該輸入'vpa('exp(1)',53)' – MarkV 2010-11-22 21:46:46

+0

@MarkV:是的,但我喜歡它。謝謝! – Peterstone 2010-11-24 10:40:27

回答

5

變量是double precision在MATLAB默認,讓你創建變量e被限制在一個雙精度,大約是16位。即使你輸入了更多的數字,double也沒有精確度來精確地表示所有這些額外的數字並舍入到它可以表示的最接近的數字。

編輯:如更詳細的他的回答this follow-up question我貼解釋由Andrew Janke,你選擇了e數恰好是二進制值的精確十進制擴展。換句話說,它就是附近的浮點數將四捨五入到的完全可表示的值。然而,在這種情況下,超過小數點後16位以上的數字不被認爲是重要的,因爲它不能用雙精度類型準確表示。因此,像SPRINTF這樣的函數將自動忽略這些小值,而是打印0。

+1

您跳過了一個步驟:使用sprintf時,e隱式轉換爲double。變量是... – Marc 2010-11-19 14:58:42

+1

@Marc:嗯?在這裏,e已經是雙重因爲它由於複製和粘貼而從文字初始化。在Matlab中,所有數字文字都會生成雙精度值。你可以用「class(2.7182818284590455348848081484902650117874145507812500)」確認它,它返回'double'。 class(exp(1))也是雙倍的。大部分顯示的數字都是假的,因爲它們超出了雙精度的極限; vpa()只是不會像printf()那樣將它們歸零。 – 2010-11-19 17:16:56

+0

你說得對。我錯過了代碼。 – Marc 2010-11-19 19:42:35