Estou fazendo o módulo errado? Porque em Java -13 % 64
é suposto avaliar, -13
mas eu consigo 51
.
java
math
modulo
negative-number
Jakir00
fonte
fonte
%
é 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:
Da mesma forma, se você estiver usando um idioma que retorna um número negativo em uma entrada negativa e preferir o positivo:
fonte
x % y
, A) sex
for negativo, o resto é negativo, ou sejax % y == -(-x % y)
. B) o sinal dey
não tem efeito, ou sejax % y == x % -y
Uma vez que "matematicamente" ambos estão corretos:
Uma das opções teve que ser escolhida pelos desenvolvedores da linguagem Java e eles escolheram:
Diz nas especificações do Java:
https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.17.3
fonte
-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 ouint result = (((-a) % b) + b) % b;
para a positivo ou negativoTem certeza de que está trabalhando em Java? porque o Java dá -13% 64 = -13 conforme o esperado. O sinal do dividendo!
fonte
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
Como / é arredondado para zero (resultando em zero), o resultado de% deve ser negativo neste caso.
fonte
int result = (-5) % 3;
dá -2int 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 ouint 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
fonte
((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?
fonte
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.
fonte
Para superar isso, você pode adicionar
64
(ou qualquer que seja a sua base de módulo) ao valor negativo até que seja positivoO resultado ainda estará na mesma classe de equivalência.
fonte
x = x + m = x - m
em módulom
.então
-13 = -13 + 64
em módulo64
e-13 = 51
em módulo64
.suponha
Z = X * d + r
, se0 < r < X
então na divisãoZ/X
chamamosr
o resto.Z % X
retorna o restante deZ/X
.fonte
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
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
fonte
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
fonte
Nas versões mais recentes do Java você obtém
-13%64 = -13
. A resposta sempre terá sinal de numerador.fonte
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.
fonte
Não acho que Java retorne 51 neste caso. Estou executando o Java 8 em um Mac e recebo:
Programa:
fonte