Só estou pensando, se quero dividir a por b, e estou interessado no resultado ce no restante (por exemplo, digamos que tenho o número de segundos e quero dividi-lo em minutos e segundos), qual é a melhor maneira de ir sobre isso?
Seria
int c = (int)a / b;
int d = a % b;
ou
int c = (int)a / b;
int d = a - b * c;
ou
double tmp = a / b;
int c = (int)tmp;
int d = (int)(0.5+(tmp-c)*b);
ou
talvez haja uma função mágica que dá a ambos ao mesmo tempo?
double
(seu último item) parece-me uma má ideia, você acabará com números que não se alinham e podem custar em desempenho e tamanho do executável (sempre foi um problema para mim em certos sistemas embarcados).Respostas:
No x86, o resto é um subproduto da própria divisão, então qualquer compilador decente deve ser capaz de apenas usá-lo (e não executar a
div
novamente). Isso provavelmente também é feito em outras arquiteturas.fonte
idivl
instrução e usando os resultados em eax e edx. Eu ficaria chocado se não o fizesse.idivl
instruções, mas com-O1
ou superior, você obtém uma. Como diz o manual, “Sem qualquer opção de otimização… as declarações são independentes” .std::div
retorna uma estrutura com resultado e resto.fonte
long long
, mas é altamente provável que seu compilador tenha umalong long
sobrecarga destd::div
como uma extensão.No x86, pelo menos, g ++ 4.6.1 apenas usa IDIVL e obtém ambos dessa única instrução.
Código C ++:
código x86:
fonte
/=
- você pode precisar usar uma variável temporária para manter a divisão primeiro.Amostra de teste de código div () e divisão e mod combinados. Compilei isso com gcc -O3, tive que adicionar a chamada para doNothing para impedir o compilador de otimizar tudo (a saída seria 0 para a solução division + mod).
Tome com um grão de sal:
Saídas: 150
Saídas: 25
fonte
Além da família de funções std :: div mencionada anteriormente , há também a família de funções std :: remquo , retorna o rem -ainder e obtém o quo- tient por meio de um ponteiro passado.
[Edit:] Parece que std :: remquo realmente não retorna o quociente .
fonte
Com tudo o mais sendo igual, a melhor solução é aquela que expressa claramente sua intenção. Assim:
é provavelmente a melhor das três opções apresentadas. Porém, conforme observado em outras respostas, o
div
método calculará os dois valores para você de uma vez.fonte
Você não pode confiar no g ++ 4.6.3 aqui com inteiros de 64 bits em uma plataforma Intel de 32 bits. a / b é calculado por uma chamada para divdi3 e a% b é calculado por uma chamada para moddi3. Posso até dar um exemplo que calcule a / be ab * (a / b) com essas chamadas. Portanto, uso c = a / be ab * c.
O método div dá uma chamada para uma função que calcula a estrutura div, mas uma chamada de função parece ineficiente em plataformas que têm suporte de hardware para o tipo integral (ou seja, inteiros de 64 bits em plataformas intel / amd de 64 bits).
fonte
Você pode usar um módulo para obter o restante. Embora a resposta de @cnicutar pareça mais limpa / direta.
fonte