MATLAB - pregunta del piso
-
20-08-2019 - |
Pregunta
Soy un principiante de MATLAB. Aquí está el problema:
>> a = floor(7/2.5)
a =
2.00
>> b = rem(7,2.5)
b =
2.00
>> c = floor(b/2)
c =
0
c debería ser 1, ¿verdad? ¿Por qué es 0 ???
Es diferente cuando b = 2 se ingresa directamente de la siguiente manera:
>> b = 2
b =
2.00
>> c = floor(b/2)
c =
1.00
Solución
En dos palabras: errores de truncamiento.
Tienes razón, c debería ser 1.0 en aritmética exacta. Sin embargo, dado que usó un flotante en los argumentos de rem, obtiene la respuesta como flotante. Aparentemente, b no es exactamente 2, sino 2.0, lo que significa que es un doble muy cercano a 2. Por lo tanto, b / 2 se convierte en el doble 1.0, aparentemente en este caso su valor es ligeramente menor que uno, dándole un 0 como El valor entero. Si desea evitar esto, use suelo y techo, y compare los valores.
Si quieres convertir la respuesta a entero, solo usa round en lugar de floor.
Otros consejos
Si agrega la línea
d = b-a
a tu ejemplo verás el resultado
d =
-4.4409e-016
significa que Matlab calculó un número cercano, pero no exactamente, 2 para b. Esto surge bastante al trabajar con números de coma flotante. Probar
help eps
para más información.
Los problemas numéricos de este tipo también se tratan en el Preguntas frecuentes de MATLAB
Sí, ese es un problema numérico. Debes usar esas cosas con cuidado. Si desea una aritmética exacta, debe intentar 'sym' para su número, por ejemplo,
b=rem(sym(7),sym(2.5))
Entonces no tendrá tales errores, pero sus cálculos serán mucho más lentos.