Frage

Perl

print 2 % -18;

->

-16

Tcl

puts [expr {2 % -18}]

->

-16

aber VBScript

wscript.echo 2 mod -18

->

2

Warum der Unterschied?

War es hilfreich?

Lösung

Die wikipedia Antwort ist ziemlich hilfreich hier.

Eine kurze Zusammenfassung ist, dass jede ganze Zahl als

definiert werden

a = qn + r

, wo alle diese Buchstaben ganze Zahlen sind, und

0 <= | r | <| N |.

Fast jede Programmiersprache erfordert, dass (a / n) * n + (a% n) = a. So ist die Definition des Moduls wird fast immer abhängig von der Definition der Integer-Division. Es gibt zwei Möglichkeiten für ganzzahlige Division durch negative Zahlen 2 / -18 = 0 oder 2 / -18 = -1. Je nachdem, welche ist eine wahre für Ihre Sprache wird in der Regel den Operator% ändern.

Dies liegt daran, 2 = (-1) * -18 + (-16) und 2 = 0 * -18 + 2

Für Perl ist die Situation komplizierter. Die Manpage sagt: „Beachten Sie, dass bei der Verwendung ganze Zahl im Bereich ist,“% „ermöglicht Ihnen den direkten Zugriff auf den Modulo-Operator, wie von Ihrem C-Compiler implementiert. Dieser Operator nicht so gut definiert für negative Operanden ist, aber es wird schneller ausgeführt werden.“ so ist es entweder Option für Perl wählen kann (wie C), wenn die Verwendung ganze Zahl ist im Visier. Wenn die Verwendung integer in ihrem Umfang nicht, sagt das Handbuch "Wenn $ b negativ ist, dann $ a% $ b $ ist ein minus die kleinste Vielfache von $ b, dass nicht weniger als $ a (dh das Ergebnis sein wird, kleine oder gleich Null). „

Andere Tipps

Wikipedia "Modulo Operation" Seite es ganz gut erklärt. Ich werde nicht versuchen, besser hier zu tun, wie ich bin wahrscheinlich einen subtilen, aber wichtige Fehler machen.

Der Haken daran ist, dass Sie „Rest“ oder „Modul“ auf unterschiedliche Weise definieren können, und verschiedene Sprachen haben unterschiedliche Optionen gewählt zu implementieren.

Nachdem eine Nummer und einen Divisor, von denen negativ ist, hat man mindestens zwei Möglichkeiten, sie in einen Quotienten zu trennen und einen Rest, so daß Quotient * Divisor + Rest = Zahl: Sie können entweder rund um den Quotienten in Richtung negative Unendlichkeit, oder gegen Null.

Viele Sprachen nur ein wählen.

Ich kann nicht wider Hinweis darauf, dass Common Lisp Angebote beide.

Python, natürlich, ausdrücklich informiert Sie

>>> divmod(2,-18)
(-1, -16)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top