J'ai trouvé un comportement étrange dans Python concernant les nombres négatifs :
>>> -5 % 4
3
Quelqu'un peut-il expliquer ce qui se passe ?
J'ai trouvé un comportement étrange dans Python concernant les nombres négatifs :
>>> -5 % 4
3
Quelqu'un peut-il expliquer ce qui se passe ?
Il n'existe pas de meilleure façon de gérer la division d'entiers et les mods avec des nombres négatifs. Il serait bon que a/b
était de la même magnitude et de signe opposé à (-a)/b
. Ce serait bien si a % b
était en effet a modulo b. Puisque nous voulons vraiment a == (a/b)*b + a%b
les deux premiers sont incompatibles.
La question de savoir lequel garder est difficile, et il y a des arguments pour les deux côtés. Le C et le C++ arrondissent la division des entiers vers zéro (donc a/b == -((-a)/b)
), et apparemment Python ne le fait pas.
Vous pouvez utiliser :
result = numpy.fmod(x,y)
il gardera le signe, voir documentation numpy fmod() .
Modulo, classes d'équivalence pour 4 :
Voici un lien vers le comportement de modulo avec des nombres négatifs . (Oui, je l'ai googlé)
Je pensais aussi que c'était un comportement étrange de Python. Il s'avère que je ne résolvais pas bien la division (sur le papier) ; je donnais une valeur de 0 au quotient et une valeur de -5 au reste. Terrible... J'avais oublié la représentation géométrique des nombres entiers. En rappelant la géométrie des nombres entiers donnée par la droite numérique, on peut obtenir les valeurs correctes pour le quotient et le reste, et vérifier que le comportement de Python est correct. (Même si je suppose que vous avez déjà résolu votre problème il y a longtemps).
Il convient également de mentionner que la division en python est différente de celle en C : Considérons
>>> x = -10
>>> y = 37
en C, vous attendez le résultat
0
qu'est-ce que x/y en python ?
>>> print x/y
-1
et % est le modulo - pas le reste ! Alors que x%y en C donne
-10
les rendements en python.
>>> print x%y
27
Vous pouvez obtenir les deux comme dans C
La division :
>>> from math import trunc
>>> d = trunc(float(x)/y)
>>> print d
0
Et le reste (en utilisant la division ci-dessus) :
>>> r = x - d*y
>>> print r
-10
Ce calcul n'est peut-être pas le plus rapide, mais il fonctionne pour toutes les combinaisons de signes de x et y pour obtenir les mêmes résultats qu'en C, et il évite les instructions conditionnelles.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
35 votes
Ça me semble correct
9 votes
..., -9, -5, -1, 3, 7, ...
3 votes
Duplicata possible de C,Python - comportement différent de l'opération modulo (%)
15 votes
Vous pouvez utiliser
math.fmod
pour obtenir le même comportement qu'en C ou en Java.