2010-02-07 10 views
14

Ich habe festgestellt, unterschiedliche Implementierungen der Modulo-Operator in Python und Java.Unterschied zwischen Modul Implementierung in Python Vs Java

Zum Beispiel in Python:

>>> print -300 % 800 
>>> 500 

Während in Java:

System.out.println(-300 % 800); 
-300 

Dieser erwischte mich unvorbereitet, da ich etwas so Grundlegendes gedacht als Modul universell auf die gleiche Weise interpretiert wurde. Ich bin ein Fan von Pythons Interpretation (die vermutlich von C übernommen wurde), obwohl ich die Logik hinter der Implementierung von Java sehe.

Welche bevorzugen Sie normalerweise? Gibt es einen bestimmten Grund für die unterschiedlichen Interpretationen? Ich habe nicht die Absicht, einen Sprachkrieg zu beginnen, einfach neugierig.

+1

Wenn ich die Wikipedia-Seite lese, die Alex korrekt gepostet hat, würde Pythons math.fmod das gleiche Ergebnis liefern wie der Java-Mod. –

Antwort

6

Ich bevorzuge C-Interpretation (auch in Python verwendet), wo % tatsächlich ein Modulo-Operator ist. Gute Diskussion in der wikipedia page und die Links von ihm (einschließlich ein bisschen darüber, warum anstelle der Zeichen der Dividende kann zu einem dummen Bug führen, wenn man vorsichtig ist ;-).

+0

C99 verwendet das Vorzeichen der Dividende, C89 ist abhängig von der Implementierung, zumindest nach dem Artikel, den Sie verknüpft haben. – ergosys

+0

Sie können '%' in Java verwenden, um eine Funktion zu schreiben, die dasselbe wie Python macht; siehe http://stackoverflow.com/a/3417242/320036 – z0r

+0

C verhält sich wie Java, nicht Python. – ryancerium

1

Im C-Standard ist der negative Modulo nicht definiert, und viele C-Compiler geben Ihnen das, was Java Ihnen bietet. In Python erhalten Sie jedoch immer eine positive Zahl, was oft nützlicher ist, weil Sie damit Modulo-Addition und Subtraktion durchführen können. Wenn negative Modulo Ihnen ein Negativ geben würden, würde es nicht richtig funktionieren.

Ich habe keine Ahnung, welche Vorteile eine negative Zahl von einem Modulo hat.

0

Ich bevorzuge x mod n, um Zahlen zwischen 0 und n-1 oder zwischen Boden (n/2) -n und Boden (n/2) zu geben; das macht es am einfachsten, die Mathematik im Kopf zu machen.

Solange alles gleich ist, ist es mir egal, wenn es um Sprachen geht - obwohl man sich der Konvention bewusst sein muss.

übrigens Java kann nicht ganz seine Meinung bilden -% auf negativen ganzen Zahlen gibt einen negativen Wert, die mod Methode der java.math.BigInteger kehrt Werte zwischen 0 und n-1 (einschließlich) und die divideAndRemainder Methode gibt wieder negativ Werte für negative ganze Zahlen.

3

Nun ist diese versuchen:

>>> print 300 % -800 
-500 

Der Grund für den Unterschied ist, dass Sprachdesigner können nicht zu entscheiden, scheinen ob der Rest nach der Teilung oder Divisor das Vorzeichen der Dividende haben sollte. Einige Sprachen spezifizieren nicht einmal das eine oder das andere, also liegt es am Implementierer.

Auf der Wikipedia-Seite Modulo operation gibt es eine Liste der Sprachen, des Betreibers und des zu erwartenden Zeichens. Es ist ein guter Anfang, aber normalerweise mache ich einfach ein paar einfache Tests, um sicherzugehen, dass ich genau weiß, wie sich das Verhalten verhält, bevor ich es in irgendeiner Sprache verwende, in der ich es vorher noch nicht getestet habe.

Verwandte Themen