Estou fazendo o módulo errado? Porque em Java -13 % 64
é suposto avaliar, -13
mas eu consigo 51
.
%
é um operador de resto.
Estou fazendo o módulo errado? Porque em Java -13 % 64
é suposto avaliar, -13
mas eu consigo 51
.
%
é um operador de resto.
Respostas:
Ambas as definições de módulo de números negativos estão em uso - algumas linguagens usam uma definição e outras a outra.
Se você deseja obter um número negativo para entradas negativas, você pode usar isto:
int r = x % n;
if (r > 0 && x < 0)
{
r -= n;
}
Da mesma forma, se você estiver usando um idioma que retorna um número negativo em uma entrada negativa e preferir o positivo:
int r = x % n;
if (r < 0)
{
r += n;
}
x % y
, A) se x
for negativo, o resto é negativo, ou seja x % y == -(-x % y)
. B) o sinal de y
não tem efeito, ou sejax % y == x % -y
Uma vez que "matematicamente" ambos estão corretos:
-13 % 64 = -13 (on modulus 64)
-13 % 64 = 51 (on modulus 64)
Uma das opções teve que ser escolhida pelos desenvolvedores da linguagem Java e eles escolheram:
o sinal do resultado é igual ao sinal do dividendo.
Diz nas especificações do Java:
https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.17.3
-13 % 64 = 51
quando eu estava esperando -13
?".
int result = (-5) % 3;
dá -2. int result = (-3) % 5;
dá -3. Em geral, int result = (-a) % b;
dá a resposta certa quando | -a | > b. Para obter o resultado adequado quando | -a | <b devemos envolver o divisor. int result = ((-a) % b) + b;
para a negativo ou int result = (((-a) % b) + b) % b;
para a positivo ou negativo
Seu resultado está errado para Java. Forneça algum contexto de como você chegou a isso (seu programa, implementação e versão do Java).
Da especificação da linguagem Java
15.17.3 Operador restante%
[...]
A operação restante para operandos que são inteiros após a promoção numérica binária (§5.6.2) produz um valor de resultado tal que (a / b) * b + (a% b) é igual a uma.
15.17.2 Operador de divisão / divisão
[...]
inteiro rodadas para 0.
Como / é arredondado para zero (resultando em zero), o resultado de% deve ser negativo neste caso.
int result = (-5) % 3;
dá -2 int result = (-3) % 5;
dá -3 Em geral, int result = (-a) % b;
dá a resposta certa quando | -a | > b Para obter o resultado adequado quando | -a | <b devemos envolver o divisor. int result = ((-a) % b) + b;
para a negativo ou int result = (((-a) % b) + b) % b;
para a positivo ou negativo.
(-3) % 5
o resultado correto de acordo com a definição é -3
, e uma implementação correta de Java deve produzir esse resultado.
(-3)%5
realmente dá -3
, e se quisermos o resto positivo, devemos adicionar 5 a ele, e então o resultado será2
você pode usar
(x % n) - (x < 0 ? n : 0);
((x % k) + k) % k
. (Embora o seu seja provavelmente mais legível.)
[0, sign(divisor) * divisor)
vez de [0, sign(dividend) * divisor)
.
Sua resposta está na wikipedia: modulo operation
Ele diz que em Java o sinal sobre a operação do módulo é o mesmo que o do dividendo. e como estamos falando sobre o resto da operação de divisão está tudo bem, ele retorna -13 no seu caso, uma vez que -13/64 = 0. -13-0 = -13.
EDIT: Desculpe, não entendi sua pergunta ... Você está certo, java deve dar -13. Você pode fornecer mais código circundante?
O módulo aritmético com operandos negativos é definido pelo designer da linguagem, que pode deixar para a implementação da linguagem, que pode adiar a definição para a arquitetura da CPU.
Não consegui encontrar uma definição de linguagem Java.
Obrigado Ishtar, Java Language Specification for the Remainder Operator% diz que o sinal do resultado é o mesmo que o sinal do numerador.
x = x + m = x - m
em módulo m
.
então -13 = -13 + 64
em módulo 64
e -13 = 51
em módulo 64
.
suponha Z = X * d + r
, se 0 < r < X
então na divisão Z/X
chamamos r
o resto.
Z % X
retorna o restante de Z/X
.
A função mod é definida como o valor pelo qual um número excede o maior múltiplo inteiro do divisor que não é maior que esse número. Então, no seu caso de
-13 % 64
o maior múltiplo inteiro de 64 que não excede -13 é -64. Agora, quando você subtrai -13 de -64, é igual a 51-13 - (-64) = -13 + 64 = 51
Na minha versão do Java JDK 1.8.0_05 -13% 64 = -13
você poderia tentar -13- (int (-13/64)) em outras palavras, fazer a divisão do cast para um inteiro para se livrar da parte da fração e depois subtrair do numerador Assim, numerador- (int (numerador / denominador)) deve fornecer o correto resto e sinal
Nas versões mais recentes do Java você obtém -13%64 = -13
. A resposta sempre terá sinal de numerador.
De acordo com a seção 15.17.3 do JLS, "A operação restante para operandos que são inteiros após a promoção numérica binária produz um valor de resultado tal que (a / b) * b + (a% b) é igual a a. Essa identidade é válida mesmo no caso especial em que o dividendo é o inteiro negativo de maior magnitude possível para o seu tipo e o divisor é -1 (o resto é 0). "
Espero que ajude.
Não acho que Java retorne 51 neste caso. Estou executando o Java 8 em um Mac e recebo:
-13 % 64 = -13
Programa:
public class Test {
public static void main(String[] args) {
int i = -13;
int j = 64;
System.out.println(i % j);
}
}