2009-06-26 9 views
8

Je suis un débutant MATLAB. Voici le problème:MATLAB - question d'étage

>> a = floor(7/2.5) 

a = 

     2.00 

>> b = rem(7,2.5) 

b = 

     2.00 

>> c = floor(b/2) 

c = 

     0 

c devrait être 1, non? Pourquoi est-ce 0 ???

Il est différent lorsque b = 2 est entré directement comme suit:

>> b = 2 

b = 

     2.00 

>> c = floor(b/2) 

c = 

     1.00 

Répondre

11

En deux mots: les erreurs de troncature.

Vous avez raison, c devrait être 1.0 en arithmétique exacte. Cependant, puisque vous avez utilisé un float dans les arguments de rem, vous obtenez la réponse sous forme de float. Apparemment, b n'est pas exactement 2, mais 2.0, ce qui signifie que c'est un double très proche de 2. Donc, b/2 devient le double 1.0, apparemment dans ce cas sa valeur est légèrement inférieure à un, vous donnant un 0 la valeur entière. Si vous voulez éviter cela, utilisez à la fois le sol et le plafond et comparez les valeurs.

Si vous voulez convertir la réponse en entier, utilisez simplement round au lieu de floor.

+0

Merci beaucoup. J'ai converti le résultat de la fonction rem en single. Ensuite, au moins mon problème a été résolu. –

+0

convertit le résultat de rem en int. Il sera toujours (tout comme floor, ceil et round sont toujours des nombres entiers) – KitsuneYMG

+2

Attention avec la terminologie "convert to integer": round ne convertit pas en un entier, mais renvoie plutôt la valeur entière la plus proche, toujours en double. C'est généralement ce que vous voulez. Les types d'entiers Matlab réels comme int32 ont une priorité plus élevée que le double, et entraîneront toutes les opérations suivantes sur eux avec l'arithmétique entière. –

6

Si vous ajoutez la ligne

d = b-a 

à votre exemple, vous verrez le résultat

d = 

-4.4409e-016 

sens Matlab a calculé un nombre proche de, mais pas exactement, 2 pour b. Cela revient un peu à travailler avec des nombres à virgule flottante. Essayez

help eps 

pour plus d'informations.

+0

Merci pour le conseil. –

2

questions numériques de ce genre sont également traitées dans le MATLAB FAQ

0

Ouais, c'est une question numérique. Vous devriez utiliser ces choses avec soin. Si vous voulez une arithmétique exacte, vous devriez essayer 'sym' pour votre numéro par ex.

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

Ensuite, vous ne serez pas de telles erreurs, mais vos calculs seront beaucoup plus lent.