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
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top