it-swarm.com.de

Modulo-Operator in Python

Was macht modulo im folgenden Code?

from math import *
3.14 % 2 * pi

Wie berechnen wir Modulo auf einer Gleitkommazahl?

51
KodeWarrior

Wenn Sie den Ausdruck haben:

a % b = c

Das bedeutet wirklich, dass es eine Ganzzahl n gibt, die c so klein wie möglich, aber nicht negativ macht.

a - n*b = c

Von Hand können Sie einfach immer wieder 2 Abziehen (oder 2 Hinzufügen, wenn Ihre Zahl negativ ist), bis das Endergebnis die kleinstmögliche positive Zahl ist:

  3.14 % 2
= 3.14 - 1 * 2
= 1.14

Außerdem wird 3.14 % 2 * pi Als (3.14 % 2) * pi Interpretiert. Ich bin mir nicht sicher, ob Sie 3.14 % (2 * pi) schreiben wollten (in beiden Fällen ist der Algorithmus derselbe. Subtrahieren/addieren Sie einfach, bis die Zahl so klein wie möglich ist).

63
Blender

Zusätzlich zu den anderen Antworten enthält die fmod Dokumentation einige interessante Dinge zu diesem Thema:

math.fmod(x, y)

Geben Sie fmod(x, y) zurück, wie in der Plattform-C-Bibliothek definiert. Beachten Sie, dass der Python Ausdruck x % y Möglicherweise nicht dasselbe Ergebnis zurückgibt. Die Absicht des C-Standards ist, dass fmod(x, y) genau (mathematisch; mit unendlicher Genauigkeit) ist ) gleich x - n*y für eine ganze Zahl n, sodass das Ergebnis das gleiche Vorzeichen wie x und eine geringere Größe als abs(y) hat. Pythons x % y gibt ein Ergebnis zurück stattdessen mit dem Vorzeichen y und möglicherweise nicht genau berechenbar für float-Argumente. Beispiel: fmod(-1e-100, 1e100) ist -1e-100, aber das Ergebnis von Pythons -1e-100 % 1e100 ist 1e100-1e-100, das nicht genau als Float dargestellt werden kann, und rundet auf das überraschende 1e100. Aus diesem Grund wird die Funktion fmod() im Allgemeinen beim Arbeiten mit Floats bevorzugt. während Pythons x % y bevorzugt wird, wenn mit ganzen Zahlen gearbeitet wird.

24
Thomas

Dasselbe, was Sie von normalem Modulo erwarten würden. 7 % 4 = 3, 7.3 % 4.0 = 3.3

Achten Sie auf Probleme mit der Gleitkommagenauigkeit.

3
Xorlev

wie ein normales Modulo 3.14 % 6.28 = 3.14, so wie 3.14%4 =3.143.14%2 = 1.14 (der Rest ...)

2
Joran Beasley

Sie sollten fmod (a, b) verwenden

While abs(x%y) < abs(y) is true mathematisch, für floats kann es sein, dass es aufgrund von roundoff numerisch nicht wahr ist.

Angenommen, eine Plattform, auf der ein Python float Eine IEEE 754 - Zahl mit doppelter Genauigkeit ist, damit -1e-100 % 1e100 Dasselbe Vorzeichen hat wie 1e100. das berechnete Ergebnis ist -1e-100 + 1e100, was numerisch genau gleich 1e100 ist.

Die Funktion fmod() im Mathematikmodul gibt stattdessen ein Ergebnis zurück, dessen Vorzeichen mit dem Vorzeichen des ersten Arguments übereinstimmt, und gibt daher in diesem Fall -1e-100 Zurück. Welcher Ansatz besser geeignet ist, hängt von der Anwendung ab.

where x = a%b Wird für ganzzahliges Modulo verwendet

1
praveen kansara