2009-06-26 4 views
8

Jestem początkującym MATLAB. Oto problem:MATLAB - pytanie podłogowe

>> a = floor(7/2.5) 

a = 

     2.00 

>> b = rem(7,2.5) 

b = 

     2.00 

>> c = floor(b/2) 

c = 

     0 

c powinno wynosić 1, prawda? Dlaczego to 0 ???

Jest to inaczej, gdy b = 2 jest wprowadzany bezpośrednio w następujący sposób:

>> b = 2 

b = 

     2.00 

>> c = floor(b/2) 

c = 

     1.00 

Odpowiedz

11

dwoma słowami: błąd metody.

Masz rację, c powinno być 1.0 w dokładnej arytmetyce. Ponieważ jednak użyłeś float w argumentach rem, otrzymujesz odpowiedź jako float. Wygląda na to, że b nie jest dokładnie 2, ale 2.0, co oznacza, że ​​jest podwójnym bardzo bliskim 2. Dlatego b/2 staje się podwójnym 1,0, najwyraźniej w tym przypadku jego wartość jest nieco mniejsza niż jeden, dając 0 jako wartość całkowita. Jeśli chcesz temu zapobiec, użyj zarówno podłogi, jak i sufitu i porównaj wartości.

Jeśli chcesz przekonwertować odpowiedź na liczbę całkowitą, po prostu użyj rundy zamiast podłogi.

+0

Wielkie dzięki. Przekształciłem wynik funkcji rem na pojedynczy. Następnie przynajmniej mój problem został rozwiązany. –

+0

przekonwertować wynik rem do int. Zawsze będzie (tak jak podłoga, sufit i runda są zawsze liczbami całkowitymi) – KitsuneYMG

+2

Ostrożnie z terminem "konwertuj na liczbę całkowitą": runda nie konwertuje na typ całkowity, ale raczej zwraca najbliższą wartość całkowitą, wciąż jako podwójną. Zwykle to jest to, czego chcesz. Rzeczywiste typy liczbowe Matlab, takie jak int32, mają wyższy priorytet niż podwójne i powodują, że wszystkie kolejne operacje na nich wykonywane są z arytmetyczną liczbą całkowitą. –

6

Jeśli dodać linię

d = b-a 

na swoim przykładzie zobaczysz wynik

d = 

-4.4409e-016 

znaczenie Matlab oblicza liczbę blisko, ale nie dokładnie, 2 dla b. Pojawia się całkiem sporo w pracy z liczbami zmiennoprzecinkowymi. Wypróbuj

help eps 

, aby uzyskać więcej informacji.

+0

Dziękuję za napiwek. –

0

Tak że jest to kwestia numeryczna. Powinieneś używać takich rzeczy ostrożnie. Jeśli chcesz mieć dokładną arytmetykę, powinieneś wypróbować "sym" dla swojej liczby, np.

b=rem(sym(7),sym(2.5)) 

Wtedy nie będzie żadnych takich błędów, ale obliczenia będą znacznie wolniejsze.