Pergunta

Você pode por favor me dizer o quanto é (-2) % 5?De acordo com a minha interpretador Python 3, mas você tem uma sábia explicação para isso?

Eu li que em alguns idiomas, o resultado pode ser dependente de máquina, mas não tenho certeza se embora.

Foi útil?

Solução

A propósito:a maioria das linguagens de programação discordam com Python e dar o resultado -2.Dependendo da interpretação do módulo de elasticidade isso é correto.No entanto, o mais acordado definição matemática indica que o módulo de elasticidade do um e b é o (estritamente positivo) resto r da divisão de um / b.Mais precisamente, 0 <= r < b por definição.

Outras dicas

O resultado do módulo de elasticidade operação negativos parece ser uma linguagem de programação dependentes e aqui está uma listagem http://en.wikipedia.org/wiki/Modulo_operation

O seu interpretador Python é correto.Um (estúpido) forma de cálculo de um módulo é para subtrair ou adicionar o módulo até que o valor resultante é entre 0 e (módulo de elasticidade − 1).

por exemplo:13 mod 5 = (13 − 5) mod 5 = (13 − 10) mod 5 = 3

ou no seu caso:-2 mod 5 = (-2 + 5) mod 5 = 3

Como diz a documentação em Aritmética binária operações, Python, assegura que:

A divisão e módulo operadores são ligados pela seguinte identidade: x == (x/y)*y + (x%y).A divisão e módulo também estão conectados com o built-in função de divmod(): divmod(x, y) == (x/y, x%y).

E verdadeiramente,

>>> divmod(-2, 5)
(-1, 3).

Outra forma de visualizar a uniformidade deste método é calcular divmod para uma pequena sequência de números:

>>> for number in xrange(-10, 10):
...     print divmod(number, 5)
...
(-2, 0)
(-2, 1)
(-2, 2)
(-2, 3)
(-2, 4)
(-1, 0)
(-1, 1)
(-1, 2)
(-1, 3)
(-1, 4)
(0, 0)
(0, 1)
(0, 2)
(0, 3)
(0, 4)
(1, 0)
(1, 1)
(1, 2)
(1, 3)
(1, 4)

Bem, 0 % 5 deve ser de 0, certo?

-1 % 5 deve ser de 4, porque essa é a próxima permitido dígitos indo no sentido inverso (isto é, não pode ser de 5, desde que fora do alcance).

E seguindo por essa lógica, -2 deve ser de 3.

A maneira mais fácil de pensar como vai funcionar é que você continue adicionando ou subtraindo 5 até que o número se situa entre 0 (inclusive) e 5 (exclusive).

Eu não tenho certeza sobre a máquina de dependência - eu nunca vi uma implementação que foi, mas eu não posso dizer que nunca fez.

Como explicado em outras respostas, existem muitas opções para um módulo de operação com valores negativos.Em geral, diferentes línguas e diferentes arquiteturas de máquina) dará um resultado diferente.

De acordo com o Python reference manual,

O operador módulo sempre produz um resultado com o mesmo sinal que o seu segundo operando (ou zero);o valor absoluto do resultado é estritamente menor do que o valor absoluto do segundo operando.

é a escolha tomada por Python.Basicamente, o módulo é definido de modo a que esta sempre contém:

x == (x/y)*y + (x%y)

portanto, faz sentido que (-2)%5 = -2 - (-2/5)*5 = 3

Bem, -2 dividido por 5 seria a 0 com um resto de 3.Eu não acredito que deve ser muito dependente de plataforma, mas eu já vi coisas estranhas.

Na verdade, é 3.No a aritmética modular, um módulo é simplesmente o resto de uma divisão, e o restante de -2 dividido por 5 a 3.

O resultado depende do idioma.Python retorna o sinal do divisor, onde, por exemplo, c# retorna o sinal do dividendo (ie.-2 % 5 retorna -2 em c#).

Uma explicação pode ser que os números negativos são armazenados usando 2 complemento.Quando o interpretador de python e tenta fazer o módulo operação converte em valor não assinados.Como tal, em vez de fazer (-2) % 5 é, na verdade, calcula 0xFFFF_FFFF_FFFF_FFFD % 5 a 3.

Tenha cuidado para não contar sobre este mod comportamento em C/C++ em todos os Sos e arquiteturas.Se bem me lembro, eu tentei confiar em código C/C++ como

float x2 = x % n;

para manter x2 no intervalo de 0 a n-1, mas os números negativos surgiram quando eu iria compilar em um sistema operacional, mas as coisas iriam funcionar bem em outro sistema operacional.Isso fez com que por um mal momento de depuração, pois ocorreu apenas metade do tempo!

Parece ser comum a confusão entre os termos "módulo" e o "restante".

Em matemática, um resto deve sempre ser definido consistente com o quociente, para que se a / b == c rem d em seguida, (c * b) + d == a.Dependendo de como você volta o seu quociente, você recebe diferentes resíduos.

No entanto, o modulo deve sempre dar um resultado 0 <= r < divisor, o que só é consistente com rodada-ao-menos-infinito divisão de se permitir números inteiros negativos.Se a divisão rodadas para zero (que é comum), o modulo e o restante são apenas equivalentes, para valores não-negativos.

Algumas línguas (especialmente C e C++) não definem o necessário arredondamento/restante de comportamentos e % é ambíguo.Muitos definir o arredondamento para zero, ainda usam o termo módulo onde restante seria mais correto.Python é relativamente incomum em que ele arredonda para o infinito negativo, pelo módulo e o restante são equivalentes.

Ada rodadas para zero, IIRC, mas tem tanto mod e rem operadores.

A política de C destina-se a permitir compiladores para escolher o mais eficiente implementação da máquina, mas IMO é um falso optimização, pelo menos nos dias de hoje.Um bom compilador irá provavelmente ser capaz de usar a equivalência de otimização, onde quer que um número negativo não pode ocorrer (e quase de certeza que se você usar unsigned tipos).Por outro lado, onde os números negativos podem ocorrer, você quase certamente preocupam com os detalhes - por motivos de portabilidade, você tem que usar com muito cuidado projetado overcomplex algoritmos e/ou verificações para garantir que você obtenha os resultados que você deseja, independentemente de o arredondamento e o restante de comportamento.

Em outras palavras, o ganho para isso "otimização" é em sua maior parte (se não sempre) uma ilusão, uma vez que existem custos reais, em alguns casos - isso é uma falsa otimização.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top