2010-11-19 150 views
6

Tôi không hiểu điều tiếp theo xảy ra khi sử dụng lệnh sprintf.Hiển thị số thập phân của biến có sprintf trong MATLAB

>> vpa(exp(1),53) 

ans = 

2.7182818284590455348848081484902650117874145507812500 


>> e = 2.7182818284590455348848081484902650117874145507812500 

e = 

2.7183 

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

ans = 

2.71828182845904550000000000000000000000000000000000000 

Tại sao sprintf chỉ cho tôi số e tròn thay vì số lượng và tôi lưu giữ tại địa điểm đầu tiên?

+0

Điều này có thể không liên quan gì đến câu hỏi của bạn, nhưng nếu bạn muốn các chữ số thực của 'e', bạn nên nhập' vpa ('exp (1)', 53) ' – MarkV

+0

@MarkV: Có, nhưng tôi thích nó. Cảm ơn bạn! – Peterstone

Trả lời

5

Biến là double precisiontheo mặc định trong MATLAB, do đó, biến số e mà bạn tạo bị giới hạn ở độ chính xác gấp đôi, khoảng 16 chữ số. Mặc dù bạn đã nhập nhiều chữ số hơn, một số không có độ chính xác để biểu thị chính xác tất cả các chữ số bổ sung đó và số vòng tròn đến số gần nhất mà nó có thể đại diện.

EDIT: Như đã giải thích một cách chi tiết hơn bằng cách Andrew Janke trong câu trả lời của mình để this follow-up question tôi được đăng, số lượng bạn đã chọn cho e chỉ xảy ra là một sự mở rộng số thập phân chính xác của giá trị nhị phân. Nói cách khác, đó là giá trị chính xác-đại diện cho một số dấu phẩy động lân cận sẽ được làm tròn thành. Tuy nhiên, trong trường hợp này, bất kỳ thứ gì có khoảng hơn 16 chữ số qua dấu thập phân không được coi là quan trọng vì nó không thể được biểu diễn chính xác bằng loại có độ chính xác gấp đôi. Do đó, các chức năng như SPRINTF sẽ tự động bỏ qua các giá trị nhỏ này, thay vào đó in các số 0.

+1

bạn bỏ qua một bước: Khi sử dụng sprintf, e được chuyển đổi hoàn toàn thành gấp đôi. Các biến là ... – Marc

+1

@Marc: Hm? Ở đây, e đã là một đôi vì nó được khởi tạo từ một chữ do sao chép và dán. Trong Matlab, tất cả các chữ số đều tạo ra các giá trị kép. Bạn có thể xác nhận nó với "class (2.7182818284590455348848081484902650117874145507812500)", trả về 'double'. class (exp (1)) cũng tăng gấp đôi. Hầu hết các chữ số được hiển thị là không có thật bởi vì chúng vượt quá giới hạn chính xác gấp đôi; vpa() không chỉ ra chúng như printf(). –

+0

Bạn nói đúng. Tôi đã bỏ lỡ điều đó trong đoạn mã. – Marc

Các vấn đề liên quan