Opérateur Modulo en Python

Que fait modulo dans le morceau de code suivant?

from math import * 3.14 % 2 * pi 

Comment calcule-t-on modulo sur un nombre à virgule flottante?

Lorsque vous avez l’expression:

 a % b = c 

Cela signifie vraiment qu’il existe un entier n qui rend c aussi petit que possible, mais non négatif.

 a - n*b = c 

À la main, vous pouvez simplement soustraire 2 (ou append 2 si votre nombre est négatif) jusqu’à ce que le résultat final soit le plus petit nombre positif possible:

  3.14 % 2 = 3.14 - 1 * 2 = 1.14 

Aussi, 3.14 % 2 * pi est interprété comme (3.14 % 2) * pi . Je ne suis pas sûr que vous vouliez écrire 3.14 % (2 * pi) (dans les deux cas, l’algorithme est le même. Il suffit de soustraire / append jusqu’à ce que le nombre soit aussi petit que possible).

En plus des autres réponses, la documentation de fmod a des choses intéressantes à dire sur le sujet:

math.fmod(x, y)

Renvoie fmod(x, y) , tel que défini par la bibliothèque de la plate-forme C. Notez que l’expression Python x % y peut ne pas renvoyer le même résultat. L’intention du standard C est que fmod(x, y) soit exactement (mathématiquement, à une précision infinie) égal à x - n*y pour un entier n tel que le résultat ait le même signe que x et une magnitude inférieure à abs(y) . x % y de Python renvoie un résultat avec le signe de y place, et peut ne pas être exactement calculable pour les arguments float. Par exemple, fmod(-1e-100, 1e100) est -1e-100 , mais le résultat de -1e-100 % 1e100 est 1e100-1e-100 , qui ne peut pas être représenté exactement comme un flottant, et arrondit au surprenant 1e100 . Pour cette raison, la fonction fmod() est généralement préférable lorsque vous travaillez avec des flottants, tandis que x % y de Python est préférable lorsque vous travaillez avec des nombres entiers.

identique à un modulo normal 3.14 % 6.28 = 3.14 , tout comme 3.14%4 =3.14 3.14%2 = 1.14 (le rest …)

Même chose que vous attendez d’un modulo normal. Par exemple, 7 % 4 = 3 , 7.3 % 4.0 = 3.3

Attention aux problèmes de précision en virgule flottante.

vous devriez utiliser fmod (a, b)

While abs(x%y) < abs(y) is true mathématiquement, pour les floats il peut ne pas être vrai numériquement en raison de l' roundoff .

Par exemple, et en supposant qu'une plate-forme sur laquelle un Python float est un nombre à double précision IEEE 754 , afin que -1e-100 % 1e100 ait le même signe que 1e100 , le résultat calculé est -1e-100 + 1e100 , ce qui est numériquement exactement égal à 1e100 .

La fonction fmod() dans le module mathématique renvoie à la place un résultat dont le signe correspond au signe du premier argument et renvoie donc -1e-100 dans ce cas. La meilleure approche dépend de l'application.

where x = a%b est utilisé pour le modulo entier