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
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top