Comment java fait-il des calculs de module avec des nombres négatifs?

Est-ce que je me trompe de module? Parce qu’en Java -13 % 64 est censé évaluer à -13 mais je reçois 51 .

Les deux définitions du module des nombres négatifs sont utilisées – certaines langues utilisent une définition et l’autre.

Si vous voulez obtenir un nombre négatif pour les entrées négatives, vous pouvez utiliser ceci:

 int r = x % n; if (r > 0 && x < 0) { r -= n; } 

De même, si vous utilisiez un langage qui renvoie un nombre négatif sur une entrée négative et que vous préfériez positif:

 int r = x % n; if (r < 0) { r += n; } 

Puisque “mathématiquement” les deux sont corrects:

 -13 % 64 = -13 (on modulus 64) -13 % 64 = 51 (on modulus 64) 

L’une des options devait être choisie par les développeurs Java et ils ont choisi:

le signe du résultat est égal au signe du dividende.

Dit dans les spécifications Java:

https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.17.3

Êtes-vous sûr de travailler en Java? Parce que Java donne -13% 64 = -13 comme prévu. Le signe du dividende!

Votre résultat est faux pour Java. Veuillez indiquer le contexte dans lequel vous l’avez atteint (programme, implémentation et version de Java).

De la spécification du langage Java

15.17.3 Opérateur restant%
[…]
L’opération restante pour les opérandes qui sont des nombres entiers après la promotion numérique binary (§5.6.2) produit une valeur de résultat telle que (a / b) * b + (a% b) est égal à a.

15.17.2 Opérateur de division /
[…]
La division entière arrondit vers 0.

Puisque / est arrondi vers zéro (résultant en zéro), le résultat de% doit être négatif dans ce cas.

vous pouvez utiliser

 (x % n) - (x < 0 ? n : 0); 

Votre réponse est dans wikipedia: opération modulo

Il est dit qu’en Java, l’opération «Sign On Modulo» est identique à celle du dividende. et puisque nous parlons du rest de l’opération de division, c’est bien, qu’elle renvoie -13 dans votre cas, puisque -13/64 = 0. -13-0 = -13.

EDIT: Désolé, votre question a été mal comprise. Vous avez raison, java devrait donner -13. Pouvez-vous fournir plus de code environnant?

L’arithmétique modulo avec des opérandes négatifs est définie par le concepteur de langage, qui peut en laisser le soin à l’implémentation du langage, qui peut reporter la définition à l’architecture du processeur.

Je n’ai pas pu trouver de définition de langage Java.
Merci Ishtar, Spécification du langage Java pour l’ opérateur restant% indique que le signe du résultat est le même que le signe du numérateur.

Pour surmonter cela, vous pouvez append 64 (ou quelle que soit votre base de module) à la valeur négative jusqu’à ce qu’elle soit positive

 int k = -13; int modbase = 64; while (k < 0) { k += modbase; } int result = k % modbase; 

Le résultat sera toujours dans la même classe d'équivalence.

x = x + m = x - m dans le module m .
so -13 = -13 + 64 en module 64 et -13 = 51 en module 64 .
supposons que Z = X * d + r , si 0 < r < X alors dans la division Z/X on appelle r le rest.
Z % X renvoie le rest de Z/X

La fonction mod est définie comme la quantité par laquelle un nombre dépasse le plus grand multiple entier du diviseur qui n’est pas supérieur à ce nombre. Donc dans votre cas de

 -13 % 64 

le plus grand nombre entier de 64 qui ne dépasse pas -13 est de -64. Maintenant, lorsque vous soustrayez -13 de -64, cela équivaut à 51 -13 - (-64) = -13 + 64 = 51

Dans ma version de Java JDK 1.8.0_05 -13% 64 = -13

vous pourriez essayer -13- (int (-13/64)) en d’autres termes faire diviser la dissortingbution en un entier pour se débarrasser de la partie fractionnaire puis soustraire du numérateur Donc numérateur- (int (numérateur / dénominateur)) devrait donner le bon rest et signe

Dans Java les dernières versions, vous obtenez -13%64 = -13 . La réponse aura toujours un signe de numérateur.

Selon la section 15.17.3 du JLS, “l’opération restante pour les opérandes qui sont des nombres entiers après la promotion numérique binary produit une valeur de résultat telle que (a / b) * b + (a% b) soit égal à a. Cette identité contient même dans le cas particulier où le dividende est le nombre entier négatif de la plus grande grandeur possible pour son type et le diviseur est -1 (le rest est 0). ”

J’espère que cela pourra aider.

Je ne pense pas que Java retourne 51 dans ce cas. Je lance Java 8 sur un Mac et je reçois:

 -13 % 64 = -13 

Programme:

 public class Test { public static void main(Ssortingng[] args) { int i = -13; int j = 64; System.out.println(i % j); } }