Próbuję porównać tablicę podwójnych do skalarnego podwójnego dla równości, ale równość nigdy nie jest rozpoznawana w pewnych okolicznościach. Podejrzewam, że ma to związek ze sposobem reprezentacji podwójnej (np. 1.0 vs 1.00), ale nie mogę tego rozgryźć.podwójne porównanie matlab
Na przykład, mam generowane tablicę złożoną z tysięcy wartości podwójnych, ostatnie kilka, które w pewnym momencie w czasie podane przez
10.6000
-11.0000
10.2000
22.6000
3.4000
Gdybym przetestować dla równości do 10.2 (lub 10.2000) komendą array==10.2
(lub array=10.2000
) zwracam tablicę 0s. Jeśli ręcznie wstawię podane wartości do tablicy (np. array=[10.6000 -11.0000 10.2000 22.6000 3.4000]
), polecenie zakończy się pomyślnie (tj. array==10.2
zwraca 0 0 1 0 0
). Czy ktoś mógłby wyjaśnić, dlaczego równość się powiedzie, jeśli wprowadzę wartości ręcznie, ale nie powiedzie się, jeśli tablica zostanie wygenerowana w kontekście programu? Jestem w stanie naprawić błąd porównania, używając raczej przybliżonego niż dokładnego porównania (np. (array<10.20001) & (array>10.19999)
), ale wydaje się to niesatysfakcjonujące.
Edytuj: Wartości w tablicy są generowane przez wielokrotne dodawanie lub odejmowanie stałego podwójnego (np. 0.2
). Moduł tej tablicy przez 0.2
powinien więc być wszędzie równy 0
. W rzeczywistości moduł każdego elementu jest równa albo 0
lub 0.2
, jak pokazano poniżej dla powyższej sekwencji liczb w tablicy:
mod(array,0.2)
...
0.2000
0
0.2000
0.2000
0
Ponownie, jeśli wartości są umieszczone w układzie ręcznego i modułu zostanie pobrana oczekiwana wartość wszystkich 0
s.
Bardzo pomocna. Jednym z dalszych pytań jest to, że moje liczby zostały wygenerowane przez dodanie lub odjęcie stałej wartości (np. "0,2") przez wiele cykli w pętli, więc w matematyce liczby w tablicy powinny wynosić 0, gdy modulo 0.2 ('mod (array) , 0,2) '). W rzeczywistości nie są. Są równe 0 lub 0,2. Jednak oczywiście, kiedy zastosuję modulo 0.2 do dowolnej liczby w tablicy, wpisując je ręcznie, podana jest oczekiwana wartość 0. Czy możesz wyjaśnić to zachowanie? Dzięki! – user001
Dotyczy to sposobu, w jaki liczby zmiennoprzecinkowe są reprezentowane na komputerach. Dobrze znany jest fakt, że komputery używają raczej plików binarnych niż dziesiętnych. Jednak pojawia się problem z binarną, tj. Skończoną frakcją, np. 0,2 w systemie dziesiętnym nie może być reprezentowane przez skończone cyfry w systemie binarnym. Oznacza to, że binarna reprezentacja 0,2 w komputerze jest w rzeczywistości 0,001110011100111 ..., która jest nieskończona. Jednak MATLAB używa 64 bitów do reprezentowania 'Single', co może powodować błąd 2^(- 65). Ten błąd jest raczej niewielki, ale gdy pojawi się sporo iteracji, może się on gromadzić. – grapeot
Cudowne wytłumaczenie. Dziękuję bardzo. – user001