Domanda

Sono un principiante MATLAB. Ecco il problema:

>> 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 ???

È diverso quando b = 2 viene inserito direttamente come segue:

>> b = 2

b =

      2.00

>> c = floor(b/2)

c =

      1.00
È stato utile?

Soluzione

In due parole: errori di troncamento.

Hai ragione, c dovrebbe essere 1.0 nell'aritmetica esatta. Tuttavia, poiché 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, dandoti uno 0 come il valore intero. Se vuoi impedirlo, usa sia floor che ceil e confronta i valori.

Se vuoi convertire la risposta in numero intero, usa solo round invece di floor.

Altri suggerimenti

Se aggiungi la linea

d = b-a

al tuo esempio vedrai il risultato

    d =

 -4.4409e-016

significa che Matlab ha calcolato un numero vicino, ma non esattamente, 2 per b. Questo risulta abbastanza nel lavorare con numeri in virgola mobile. Prova

help eps

per ulteriori informazioni.

Le questioni numeriche di questo tipo sono trattate anche nel FAQ MATLAB

Sì, questo è un problema numerico. Dovresti usare queste cose con cura. Se vuoi un'aritmetica esatta, dovresti provare 'sym' per il tuo numero, ad es.

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

Quindi non si verificheranno errori di questo tipo, ma i calcoli saranno molto più lenti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top