Comment java module de calculs avec des nombres négatifs?
14 réponses
les deux définitions du module des nombres négatifs sont utilisées - certaines langues utilisent une définition et d'autres l'autre.
Si vous voulez obtenir un nombre négatif pour les entrées, alors vous pouvez utiliser ceci:
int r = x % n;
if (r > 0 && x < 0)
{
r -= n;
}
de même, si vous utilisez une langue qui renvoie un nombre négatif sur un input négatif et que vous préférez 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)
une des options devait être choisie par les développeurs Java language et ils ont choisi:
le signe du résultat est égal au signe du dividende.
dit en Java specs:
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 erroné pour Java. S'il vous plaît fournir un certain contexte comment vous y êtes arrivé (votre programme, la mise en œuvre et la version de Java).
From the Java Language Specification
15.17.3 Opérateur Du Reste %
[...]
L'opération du reste pour les opérandes qui sont des entiers après la promotion numérique binaire (§5.6.2) produit une valeur de résultat telle que (a/B)*b+(A%b) est égal à un.
15.17.2 Exploitant De La Division /
[...]
La division entière tourne vers 0.
étant donné que / est arrondi à zéro (résultant en zéro), le résultat en % doit être négatif dans ce cas.
votre réponse est dans wikipedia: modulo
il est dit, Qu'en Java le signe sur l'opération modulo est le même que celui de dividende. et puisque nous parlons du reste de l'opération de la division est très bien, qu'il retourne -13 dans votre cas, depuis -13/64 = 0. - 13-0 = -13.
EDIT: Désolé, mal compris votre question...Tu as raison, java devrait donner -13. Pouvez-vous fournir plus de code d'environnement?
modulo arithmétique avec opérandes négatives est défini par le concepteur de langage, qui pourrait le laisser à l'implémentation de la langue, qui pourrait reporter la définition à L'architecture CPU.
Je n'ai pas trouvé de définition du langage Java.
Merci Ishtar, Java Language spécification pour le reste opérateur % dit que le signe du résultat est le même que le signe de la numérateur.
pour surmonter cela, vous pouvez ajouter 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.
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 plus grand que ce nombre. Donc dans votre cas de
-13 % 64
le plus grand nombre entier multiple de 64 qui ne dépasse pas -13 est -64. Maintenant, quand vous soustrayez -13 de -64 il égale 51 -13 - (-64) = -13 + 64 = 51
dans ma version de Java JDK 1.8.0_05 -13% 64=-13
vous pouvez essayer de la -13-(int(-13/64)) en d'autres termes, ne division mouler à un entier pour se débarrasser de la partie fraction puis soustraire numérateur Ainsi le numérateur - (int (numérateur / dénominateur)) devrait donner le reste correct et le signe
en 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 de reste pour les opérandes qui sont des entiers après la promotion numérique binaire produit une valeur de résultat telle que (A/b)*b+(A%b) est égale à A. Cette identité tient même dans le cas particulier que le dividende est l'entier négatif de la plus grande grandeur possible pour son type et le diviseur est -1 (le reste est 0)."
Espère que ça aide.
Je ne pense pas que Java retourne 51 dans ce cas. J'exécute Java 8 sur un Mac et j'obtiens:
-13 % 64 = -13
programme:
public class Test {
public static void main(String[] args) {
int i = -13;
int j = 64;
System.out.println(i % j);
}
}