2012-06-07 35 views
6

Nếu mã sau được thi hành MATLAB gây nhầm lẫn. Ai đó có thể xác minh điều này?Matlab đưa ra câu trả lời sai

floor([0.1:0.1:2]/0.01) 

Vậy 129 làm gì ở đây ??

ans = 10 20 30 40 50 60 70 80 90 100 110 120 129 140 150 160 170 180 190 200 
+8

129. Tên khốn lén lút đó. –

+4

Có lẽ tôi đang tách tóc, nhưng không phải bạn đã làm được '10: 10: 200'? – kevlar1818

+1

liên quan: [Giới thiệu về độ chính xác của dấu phẩy động: tại sao các số lặp lại không bằng nhau?] (Http://stackoverflow.com/a/6478526/97160) – Amro

Trả lời

9

Đây là lỗi làm tròn dấu phẩy động do vectơ do đại diện tạo ra.
Giống như RasMan nói, nếu bạn làm:

floor((0.1:0.1:2 + eps)/0.01) 

Sẽ không có lỗi làm tròn.

Tuy nhiên, dựa trên how the colon operator works, tôi đề nghị bạn nên thực hiện tính toán tương tự như thế này:

floor([(1:20)/10]/0.01) 

[Sửa: sau bình luận RasMan, tôi sẽ bổ sung thêm rằng tiếp cận thứ hai làm việc cho tiêu cực cũng như khi thêm eps đôi khi không thành công]

Dòng dưới cùng là tốt hơn khi sử dụng toán tử dấu hai chấm với i nteger số để giảm thiểu lỗi làm tròn.

4

Nó có lẽ làm một phép tính dấu chấm động kết quả là một giá trị không chính xác của 129,99999999999999 ... một cái gì đó thay vì 130. và sau đó bạn sàn nó để 129.

4

nó một xấp xỉ tròn trong khoảng thời gian mảng xây dựng. Giải pháp sẽ là để thêm eps:

floor([0.1:0.1:2]/0.01+ eps([0.1:0.1:2]/0.01)) 
+0

Cảm ơn bạn, đây có phải là giải pháp cho tình huống cụ thể này không? Hay bạn có đề xuất loại mã này luôn trong những trường hợp như vậy không? – mmumboss

+0

Hầu hết thời gian tôi thấy một vấn đề làm tròn nó là bởi vì nó bị tắt bởi một bit ít quan trọng nhất (có lẽ là 2, mặc dù tôi không thể nhớ lại khi nhìn thấy nó. Bạn có thể siêu an toàn bằng cách thêm 2 * eps, nhưng đối với loại vấn đề này, nó hoạt động: 'bất kỳ ((tầng ([0,1: 0,1: 200] /0,01 + eps ([0,1: 0,1: 200] /0,01))) - (10: 10: 20000))' – Rasman

+1

I lấy lại nó, nó hoạt động trong khi bạn đang ở trong lãnh thổ tích cực – Rasman

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