2009-06-26 10 views
8

Soy un principiante de MATLAB. Aquí está el problema:MATLAB - pregunta de piso

>> 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 se introduce b = 2 directamente como sigue:

>> b = 2 

b = 

     2.00 

>> c = floor(b/2) 

c = 

     1.00 

Respuesta

11

en dos palabras: errores de truncamiento.

Tiene razón, c debe ser 1.0 en aritmética exacta. Sin embargo, como usaste un flotador en los argumentos de rem, obtienes la respuesta como un 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ándote un 0 como el valor entero. Si desea evitar esto, use piso y cielo, y compare los valores.

Si quiere convertir la respuesta a entero, solo use la ronda en vez del piso.

+0

Muchas gracias. Convertí el resultado de la función rem en single. Entonces, al menos mi problema ha sido resuelto. –

+0

convertir el resultado de rem en un int. Siempre será (al igual que piso, ceil y redondo son siempre números enteros) – KitsuneYMG

+2

Cuidado con la terminología "convertir a entero": round no convierte a un tipo entero, sino que devuelve el valor entero más cercano, aún como un doble. Esto es generalmente lo que quieres. Los tipos enteros reales de Matlab como int32 tienen una precedencia mayor que el doble, y harán que todas las operaciones subsiguientes sobre ellos se realicen con aritmética de enteros. –

6

Si se agrega la línea

d = b-a 

a su ejemplo, usted verá el resultado

d = 

-4.4409e-016 

significado Matlab calcula un número cercano a, pero no exactamente, 2 para b. Esto viene bastante al trabajar con números de coma flotante. Pruebe

help eps 

para obtener más información.

+0

Gracias por la sugerencia. –

2

problemas numéricos de este tipo también se tratan en el MATLAB FAQ

0

Sí que es una cuestión numérica. Debe usar tales cosas con cuidado. Si quieres una aritmética exacta, debes probar con 'sym' para tu número, p.

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

Entonces no cometerá ninguno de esos errores, pero sus cómputos serán mucho más lentos.