Pourquoi le module est-il différent dans différents langages de programmation?
Question
Perl
print 2 % -18;
- >
-16
Tcl
puts [expr {2 % -18}]
- >
wscript.echo 2 mod -18
mais VBScript
2
- >
<*>Pourquoi cette différence?
La solution
La la réponse wikipedia est assez utile ici.
En résumé, tout entier peut être défini comme
a = qn + r
où toutes ces lettres sont des entiers et
0 < = | r | < | n |.
Presque tous les langages de programmation nécessiteront que (a / n) * n + (a% n) = a. Ainsi, la définition du module dépendra presque toujours de la définition de la division entière. Il existe deux choix pour la division entière par des nombres négatifs 2 / -18 = 0 ou 2 / -18 = -1. En fonction de celui qui est vrai pour votre langue, l’opérateur% changera généralement.
Cela est dû au fait que 2 = (-1) * -18 + (-16) et 2 = 0 * -18 + 2.
Pour Perl, la situation est compliquée. La page de manuel indique: " Notez que lorsque l'utilisation est un entier, portée, "% " vous donne un accès direct à l'opérateur de module tel qu'il est implémenté par votre compilateur C. Cet opérateur n'est pas aussi bien défini pour les opérandes négatifs, mais il s'exécutera plus rapidement. " Donc, il peut choisir l'une ou l'autre option pour Perl (comme C) si use entier est dans la portée. Si use integer n’est pas dans le champ d’application, le manuel indique & Quot; Si $ b est négatif, alors $ a% $ b est $ a moins le plus petit multiple de $ b qui n’est pas inférieur à $ a (c’est-à-dire que le résultat sera inférieur ou égal à zéro). "
Autres conseils
Le hic, c’est que vous pouvez définir & "reste <>>"; ou " module " de différentes manières, et différentes langues ont choisi différentes options à mettre en œuvre.
Après avoir divisé un nombre et un diviseur, dont l'un est négatif, vous avez au moins deux façons de les séparer en un quotient et un reste, tels que quotient * diviseur + reste = nombre: vous pouvez arrondir le quotient vers infini négatif, ou vers zéro.
De nombreuses langues n'en choisissent qu'une.
Je ne peux m'empêcher de souligner que offres Common Lisp les deux.
python, bien sûr, vous informe explicitement
>>> divmod(2,-18)
(-1, -16)