Existe uma razão, histórica ou não, para que o operador de módulo faça parte de um pequeno conjunto de operadores padrão no que parece ser muitos idiomas? ( +, -, *, /
e %
, para Java e C, com **
em Ruby e Python).
Parece estranho incluir mod como um "fundamental" (para não bater, eu uso bastante, mas também uso exponenciação, valor absoluto, piso / teto ou outros - eles parecem tão úteis e necessários). Foi uma decisão antiga tomada em alguma especificação que Java, C, Ruby e Python seguem ou uma linguagem da qual todos descendem? Até onde eu sei, a maioria dos dialetos Lisp inclui apenas +, -, /
e *
.
No começo, eu me perguntava se o mod era particularmente fácil de implementar no nível binário (isso faria alguma diferença, em relação às decisões sobre o que deveria ser um operador "fundamental" e o que não deveria?), Mas parece não ser. É muito mais comumente usado em programação do que eu acho?
fonte
Muitas linguagens de programação possuem um operador "restante" que pode ser usado como um operador de módulo quando ambos os operandos são positivos; o referido operador é freqüentemente chamado de operador "módulo", porque esse é seu uso principal. Os idiomas geralmente têm esse operador, porque o hardware de divisão de muitas plataformas de hardware fornece automaticamente um restante ao executar uma divisão, e computar um restante ou módulo por qualquer outro meio seria muito mais difícil.
Não conheço o histórico de suporte de hardware para divisão assinada; muitos processadores fornecem há anos hardware que pode executar automaticamente uma divisão assinada, sujeito à regra de que, se a / b produzir (q, r), -a / b ou a / -b produzirá (-q, -r), mas Não tenho certeza dos casos de uso em que a divisão usando essa regra é particularmente útil. Em quase todos os casos em que usei operações de divisão inteira ou "módulo" em valores negativos, eu queria infinito arredondado em direção ao infinito negativo na divisão e uma verdadeira operação de módulo (de modo que (a + b) / b sempre igual (a / b) +1 e (a + b)% b sempre seria igual a% b.). Como os operadores não funcionam dessa maneira, é necessário testar o sinal do dividendo e usar código diferente quando ele ' s negativo - negando essencialmente qualquer benefício de ter uma instrução de divisão assinada em primeiro lugar. Estou curioso para saber quais propósitos o suporte à divisão de assinaturas no hardware é realmente útil.
Retornando à pergunta original, o operador do módulo é frequentemente útil em situações em que certas coisas devem acontecer periodicamente, no espaço (por exemplo, coordenadas gráficas) ou no tempo. Por exemplo, se alguém deseja que um evento ocorra a cada 15 segundos, o tempo até o próximo evento será 15 - ((time_now - time_of_an_occurrence)% 15), supondo que
time_of_an_occurrence
não seja maior quetime_now
. Setime_of_an_occurrence
fosse maior quetime_now
, um operador de módulo poderia continuar usando a mesma fórmula, desde que a subtração não transbordasse, mas o operador restante exigirá uma fórmula diferente.fonte
rem
para o restante emod
para o módulo com as propriedades que você descreve.m = number % base; if (m < 0) m+=base;
. Não sei se já vi algum código que se beneficiou do operador restante ficar negativo, exceto talvezq = n/d; if (n%d < 0) q+=1;
, que poderia, em qualquer caso, ser melhor escrito de outras maneiras.O módulo está intimamente relacionado à teoria de grupos e anéis, que são teorias matemáticas muito fundamentais.
A exponenciação é apenas a terceira operação na adição, multiplicação, exponenciação, tetragem da sequência (e essa é uma sequência infinita). Torna-se importante principalmente com números complexos, que são mais raros na aritmética computacional. Uma exponenciação específica é suportada explicitamente: 2 n é normalmente escrita como
1<<n
, uma vez que os computadores são bastante binários.O piso e o teto são realmente raros em comparação: eles só se aplicam ao converter de ℝ para ℤ. (ponto flutuante para inteiro). Da mesma forma,
abs
está associado a um mapeamento de ℤ para ℕfonte
Desculpe, mas com o risco de transformar isso em um jogo de "Call My Bluff", acho que a resposta real a esta pergunta é bastante simples:
O Mod permite cálculos precisos em quantidades "não-decimais" e unidades como datas, hora, jardas, polegadas, onças etc. Nos cálculos decimais, ele também fornece um método para o programador trabalhar com uma precisão numérica além da fornecida pelo hardware da máquina. Isso tem um grande número de aplicações, desde as muito pequenas (por exemplo, cálculos quânticos) às muito grandes (por exemplo, descobrindo novos números primos).
É importante entender que chamamos essas coisas de computadores por um motivo. Às vezes, precisamos deles para nos dar a resposta correta!
fonte