Tôi đang cố gắng so sánh một mảng tăng gấp đôi với một vô hướng gấp đôi cho bình đẳng, nhưng bình đẳng không bao giờ được công nhận trong những trường hợp nhất định. Tôi nghi ngờ rằng điều này có liên quan đến cách nhân đôi được biểu diễn (ví dụ: 1.0 so với 1.00), nhưng tôi không thể hiểu được điều đó.matlab so sánh đôi
Ví dụ, tôi đã tạo ra một mảng gồm hàng ngàn các giá trị gấp đôi, vài cuối cùng trong đó có một số ngay lập tức trong thời gian được xác định bởi
10.6000
-11.0000
10.2000
22.6000
3.4000
Nếu tôi thử nghiệm cho sự bình đẳng cho 10,2 (hoặc 10,2000) bởi lệnh array==10.2
(hoặc array=10.2000
), tôi trả về một mảng 0s. Nếu tôi đặt các giá trị được hiển thị vào một mảng theo cách thủ công (ví dụ: array=[10.6000 -11.0000 10.2000 22.6000 3.4000]
), thì lệnh thành công (tức là, array==10.2
trả về 0 0 1 0 0
). Ai đó có thể vui lòng giải thích lý do tại sao bình đẳng thành công nếu tôi nhập các giá trị bằng tay, nhưng thất bại nếu mảng được tạo ra trong bối cảnh của một chương trình? Tôi có thể khắc phục lỗi so sánh bằng cách sử dụng gần đúng chứ không phải so sánh chính xác (ví dụ: (array<10.20001) & (array>10.19999)
), nhưng điều này có vẻ không hài lòng.
Chỉnh sửa: Các giá trị trong mảng được tạo bằng phép cộng hoặc phép trừ lặp lại của số double không đổi (ví dụ: 0.2
). Do đó, mô đun của mảng này theo số 0.2
nên ở mọi nơi bằng 0
. Trong thực tế, các module của mỗi phần tử là tương đương với một trong hai 0
hoặc 0.2
, như hình dưới đây cho chuỗi trên các số trong mảng:
mod(array,0.2)
...
0.2000
0
0.2000
0.2000
0
lần nữa, nếu các giá trị được đặt trong một mảng bằng tay và các module được lấy, giá trị kỳ vọng của tất cả các 0
s được lấy.
Rất hữu ích. Một câu hỏi tiếp theo là số của tôi được tạo ra bằng cách cộng hoặc trừ một số không đổi (ví dụ '0,2') qua nhiều chu kỳ trong một vòng lặp, do đó, các con số trong mảng phải bằng 0 khi modulo 0,2 (' mod (mảng) , 0,2) ') được áp dụng. Trong thực tế, họ không. Chúng bằng 0 hoặc 0,2. Tuy nhiên, khi tôi áp dụng modulo 0.2 cho bất kỳ số nào trong mảng bằng cách gõ chúng theo cách thủ công, giá trị kỳ vọng của 0 được cho. Bạn có thể giải thích hành vi này? Cảm ơn! – user001
Điều này liên quan đến cách các số phảy động được thể hiện trong các máy tính. Một thực tế nổi tiếng là máy tính sử dụng nhị phân chứ không phải là số thập phân. Tuy nhiên, có một vấn đề xảy ra với nhị phân, tức là một phân số hữu hạn, nói 0,2 trong thập phân không thể được biểu diễn bằng các số hữu hạn trong nhị phân. Đó là, biểu diễn nhị phân của 0,2 trong máy tính thực sự là 0.001110011100111 ..., là vô tận. Tuy nhiên, MATLAB sử dụng 64 bit để biểu diễn một 'Single', có thể gây ra lỗi 2^(- 65). Lỗi này khá nhỏ, nhưng khi có khá nhiều lần lặp lại, nó có thể tích lũy. – grapeot
Giải thích tuyệt vời. Cảm ơn bạn rất nhiều. – user001