2009-06-26 17 views
8

Sono un principiante di MATLAB. Ecco il problema:MATLAB - domanda di piano

>> a = floor(7/2.5) 

a = 

     2.00 

>> b = rem(7,2.5) 

b = 

     2.00 

>> c = floor(b/2) 

c = 

     0 

c dovrebbe essere 1, giusto? Perché è 0 ???

È differente quando b = 2 viene immesso direttamente come segue:

>> b = 2 

b = 

     2.00 

>> c = floor(b/2) 

c = 

     1.00 

risposta

11

in due parole: errori di troncamento.

Hai ragione, c dovrebbe essere 1.0 in aritmetica esatta. Tuttavia, dal momento che hai usato un float negli argomenti di rem, ottieni la risposta come float. Apparentemente, b non è esattamente 2, ma 2.0, il che significa che è un doppio molto vicino a 2. Pertanto, b/2 diventa il doppio 1.0, apparentemente in questo caso il suo valore è leggermente inferiore a uno, dandovi uno 0 come il valore intero. Se vuoi impedirlo, usa sia floor che ceil e confronta i valori.

Se si desidera convertire la risposta in numero intero, utilizzare solo rotondo anziché piano.

+0

Grazie mille. Ho convertito il risultato della funzione rem in single. Quindi, almeno il mio problema è stato risolto. –

+0

converte il risultato di rem in un int. (Sempre come floor, ceil e round sono sempre numeri interi) – KitsuneYMG

+2

Attenzione con la terminologia "convert to integer": round non converte in un tipo intero, ma restituisce il valore intero più vicino, sempre come un double. Questo è solitamente quello che vuoi. I tipi interi Matlab effettivi come int32 hanno precedenza più alta del doppio e faranno tutte le operazioni successive su di essi con aritmetica intera. –

6

Se si aggiunge la linea

d = b-a 

al tuo esempio si vedrà il risultato

d = 

-4.4409e-016 

significato Matlab calcolato un numero vicino a, ma non esattamente, 2 per b. Questo risulta un bel po 'nel lavorare con i numeri in virgola mobile. Prova

help eps 

per ulteriori informazioni.

+0

Grazie per il suggerimento. –

2

questioni numeriche di questo tipo sono anche trattati nel MATLAB FAQ

0

Sì che è una questione numerica. Dovresti usare queste cose con cura. Se vuoi l'aritmetica esatta, dovresti provare "sym" per il tuo numero, ad es.

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

Quindi non si verificheranno tali errori, ma i calcoli saranno molto più lenti.