2012-06-07 18 views
6

Se viene eseguito il codice seguente, MATLAB commette un errore. Qualcuno può verificare questo?Matlab fornisce una risposta errata

floor([0.1:0.1:2]/0.01) 

Quindi cosa sta facendo il 129 qui ??

ans = 10 20 30 40 50 60 70 80 90 100 110 120 129 140 150 160 170 180 190 200 
+8

129. Quel bastardo furtivo. –

+4

Forse sto dividendo i capelli, ma non potevi aver appena fatto "10: 10: 200"? – kevlar1818

+1

related: [Informazioni sulla precisione in virgola mobile: perché i numeri di iterazione non sono uguali?] (Http://stackoverflow.com/a/6478526/97160) – Amro

risposta

9

È un errore di arrotondamento a virgola mobile a causa del vettore generato dal colon.
Come Rasman ha detto, se si fa:

floor((0.1:0.1:2 + eps)/0.01) 

Non ci saranno errori di arrotondamento.

Tuttavia, sulla base how the colon operator works, vi suggerisco di fare lo stesso calcolo come questo:

floor([(1:20)/10]/0.01) 

[Edit: seguente commento di Rasman, vorrei aggiungere che quest'ultimo approccio funziona per negativo valori, mentre l'aggiunta di eps talvolta non riesce]

La linea di fondo è che è meglio utilizzare l'operatore del colon con i nte numeri per ridurre gli errori di arrotondamento.

4

E 'probabilmente facendo un calcolo a virgola mobile ottenendo un valore inesatto di 129,99999999999999 ... qualcosa invece di 130. e poi piano a 129.

4

è un'approssimazione arrotondamento causata dalla costruzione di array. La soluzione sarebbe aggiungere eps:

floor([0.1:0.1:2]/0.01+ eps([0.1:0.1:2]/0.01)) 
+0

Grazie, è una soluzione per questa situazione specifica? O raccomanderesti questo tipo di codice sempre in questi casi? – mmumboss

+0

Il più delle volte che ho visto un problema di arrotondamento è perché è disattivato da un singolo bit meno significativo (forse 2, anche se non ricordo di averlo visto. Puoi essere super sicuro aggiungendo 2 * eps, ma per questo tipo di problema funziona: 'any ((floor ([0.1: 0.1: 200] /0.01 + eps ([0.1: 0.1: 200] /0.01))) - (10: 10: 20000))' – Rasman

+1

I riprendilo, funziona mentre sei in territorio positivo – Rasman