2012-06-07 15 views
6

Si se ejecuta el siguiente código, MATLAB comete un error. ¿Alguien puede verificar esto?Matlab da una respuesta incorrecta

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

¿Qué hace el 129 aquí?

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

129. Ese hijo de puta astuto. –

+4

Tal vez estoy partiendo pelos, pero ¿no podrías haber hecho '10: 10: 200'? – kevlar1818

+1

relacionado: [Acerca de la precisión de punto flotante: ¿por qué los números de iteración no son iguales?] (Http://stackoverflow.com/a/6478526/97160) – Amro

Respuesta

9

Es un error de redondeo de punto flotante debido al vector generado por dos puntos.
Como Rasman dijo, si lo hace:

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

No habrá errores de redondeo.

Sin embargo, en base a how the colon operator works, sugiero que lo hace el mismo cálculo de esta manera:

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

[Edición: siguiente comentario de Rasman, voy a añadir que este último enfoque funciona para el negativo valores también, mientras que agrega eps veces falla]

La conclusión es que es mejor usar el operador de dos puntos con i nteger números para minimizar los errores de redondeo.

4

Probablemente está haciendo un cálculo de coma flotante que resulta en un valor inexacto de 129.99999999999999 ... algo en lugar de 130. y luego se baja a 129.

4

Es una aproximación redondeo provocada por la construcción de matriz. La solución sería agregar eps:

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

Gracias, ¿esto es una solución para esta situación específica? ¿O recomienda este tipo de código siempre en tales casos? – mmumboss

+0

La mayoría de las veces que he visto un problema de redondeo es porque está desactivado en un solo bit menos significativo (quizás 2, aunque no recuerdo haber visto uno. Puede ser superseguro agregando 2 * eps, pero para este tipo de problema funciona: 'any ((floor ([0.1: 0.1: 200] /0.01 + eps ([0.1: 0.1: 200] /0.01))) - (10: 10: 20000))' – Rasman

+1

I retomarlo, funciona mientras estás en territorio positivo – Rasman

Cuestiones relacionadas