MATLAB - question de plancher
-
20-08-2019 - |
Question
Je suis un débutant avec MATLAB. Voici le problème:
>> 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 en va différemment lorsque b = 2 est entré directement comme suit:
>> b = 2
b =
2.00
>> c = floor(b/2)
c =
1.00
La solution
En deux mots: 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 qu’il s’agit d’un double très proche de 2. Par conséquent, b / 2 devient le double 1.0, apparemment dans ce cas, sa valeur est légèrement inférieure à un, ce qui vous donne un 0 la valeur entière. Si vous souhaitez éviter cela, utilisez à la fois le plancher et le plafond et comparez les valeurs.
Si vous souhaitez convertir la réponse en entier, utilisez simplement round au lieu de floor.
Autres conseils
Si vous ajoutez la ligne
d = b-a
à votre exemple, vous verrez le résultat
d =
-4.4409e-016
signifiant Matlab a calculé un nombre proche de, mais pas exactement, 2 pour b. Cela revient souvent à travailler avec des nombres à virgule flottante. Essayez
help eps
pour plus d'informations.
Les problèmes numériques de ce type sont également traités dans la FAQ MATLAB
Oui, c’est un problème numérique. Vous devriez utiliser ces choses avec précaution. Si vous voulez une arithmétique exacte, vous devriez essayer "sym" pour votre nombre, par exemple.
b=rem(sym(7),sym(2.5))
Ensuite, vous ne ferez plus de telles erreurs, mais vos calculs seront beaucoup plus lents.