Modulo négatif ou positif

a marqué ce sujet comme résolu.

Bonjour à tous :)

Au cours de mes péripéties en programmation, j’ai remarqué quelque chose d’étrange : Dans certains languages, le résultat d’un modulo peut être négatif, dans d’autres il est "arrondi" à l’équivalent positif.

J’ai décidé de voir quel languages/"calculateur" répondaient quoi, et voici mes résultats. Je me suis basé sur le calcul $-26 \mod 5$.

Voici la liste des languages/"calculateur" qui répondent forcément positif ou nul (ici $4$):

  • Ruby
  • Python
  • Perl
  • Lua
  • Wolfram alpha
  • Google

et voici ceux qui répondent possiblement un nombre négatif (ici $-1$) :

  • Kotlin
  • Java
  • Go
  • Ocaml
  • PHP
  • JS/Nodejs/CoffeScript
  • Powershell
  • C#
  • PostgreSQL
  • MySQL
  • D
  • Haskell
  • Rust
  • C++
  • C

Ma question est donc  : pourquoi ? Je pense que c’est surement une question d’optimisation , mais si quelqu’un a un réponse plus détaillée , ca pourrait être intéressant :D

+3 -0

Pour le python car c’est mathématiquement plus sympatique. On veut souvent la version positive du modulo. D’où le fait que Wolfram alpha donne ce résultat également.

Pour le C car la division euclidienne est définie par l’équation : $a = (a/b)*b + a \% b$
Ce qui implique du coup un modulo négatif.

Les deux étant mathématiquement correctes.

Je suppose que les autres langages se sont inspirés du C ou du Python.

PS: Cool ta petite expérimentation ^^

+0 -0

Tu t’es aussi trompé pour Python, dont le résultat n’est pas systématiquement positif : il est du signe du second opérande. Si tu calcules 1%(-2), tu obtiendras -1.

Le modulo de Python est fait en sorte que b * (a//b) + (a%b) soit toujours égal à a, quels que soient les signes.

Edit : Où a//b est en effet le plus grand nombre nombre entier inférieur à a/b. C’est-à-dire que -1//2 est par exemple égal à -1.

Banni

Il y a deux conventions raisonnables si on veut que b * (a/b) + (a%b) == a. Soit on prend l’arrondi inférieur pour a/b et dans ce cas a%b est du signe de b. Soit on prend l’arrondi vers 0 et dans ce cas a%b est du signe de a.

Ensuite on peut demander à ce que a%b soit « le représentant de la classe d’équivalence de $a$ modulo $b$ compris entre $0$ inclus et $|b|$ exclu ». C’est aussi intéressant à avoir mais dans le cas où c’est le comportement voulu il est probable que $b$ soit positif (par exemple si on prend modulo la taille d’un tableau et qu’on veut retrouver un résultat dans le tableau, la taille du tableau est positive).

@ache Dans ton LaTeX, le modulo est parti en commentaire.

Tu t’es aussi trompé pour Python, dont le résultat n’est pas systématiquement positif : il est du signe du second opérande.

Même résultat pour R, avec 4 ou -4 selon le signe du second opérande !

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte