Je me demande simplement, si je veux diviser a par b, et si je suis intéressé à la fois par le résultat c et le reste (par exemple, disons que j'ai un nombre de secondes et que je veux le diviser en minutes et secondes), quelle est la meilleure façon de allez-y?
Serait-ce
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
peut-être y a-t-il une fonction magique qui donne les deux à la fois?
double
(votre dernier élément) me semble être une mauvaise idée, vous vous retrouverez avec des chiffres qui ne correspondent pas, et peuvent vous coûter en performances et taille de l'exécutable (a toujours été un problème pour moi sur certains systèmes embarqués).Réponses:
Sur x86, le reste est un sous-produit de la division elle-même, donc tout compilateur à moitié décent devrait pouvoir simplement l'utiliser (et ne pas en exécuter à
div
nouveau). Ceci est probablement également fait sur d'autres architectures.la source
idivl
instruction et en utilisant les résultats dans eax et edx. J'aurais été choqué si ce n'était pas le cas.idivl
instructions, mais avec-O1
ou plus, vous en obtenez une. Comme le dit le manuel, «Sans aucune option d'optimisation… les déclarations sont indépendantes» .std::div
renvoie une structure avec à la fois résultat et reste.la source
long long
, mais il est fort probable que votre compilateur ait unelong long
surcharge destd::div
en tant qu'extension.Sur x86 au moins, g ++ 4.6.1 utilise simplement IDIVL et obtient les deux à partir de cette seule instruction.
Code C ++:
code x86:
la source
/=
- vous devrez peut-être utiliser une variable temporaire pour conserver la division en premier.Exemple de test de code div () et division et mod combinés. Je les ai compilés avec gcc -O3, j'ai dû ajouter l'appel à doNothing pour empêcher le compilateur d'optimiser tout (la sortie serait 0 pour la solution division + mod).
Prenez-le avec un grain de sel:
Sorties: 150
Sorties: 25
la source
En plus de la famille de fonctions std :: div mentionnée ci-dessus , il y a aussi la famille de fonctions std :: remquo , qui retourne le rem -ainder et obtient le quo -tient via un pointeur passé.
[Edit:] Il semble que std :: remquo ne renvoie pas vraiment le quotient après tout.
la source
Toutes choses étant égales par ailleurs, la meilleure solution est celle qui exprime clairement votre intention. Alors:
est probablement la meilleure des trois options que vous avez présentées. Cependant, comme indiqué dans d'autres réponses, la
div
méthode calculera les deux valeurs pour vous en même temps.la source
Vous ne pouvez pas faire confiance à g ++ 4.6.3 ici avec des entiers 64 bits sur une plate-forme Intel 32 bits. a / b est calculé par un appel à divdi3 et a% b est calculé par un appel à moddi3. Je peux même proposer un exemple qui calcule a / b et ab * (a / b) avec ces appels. J'utilise donc c = a / b et ab * c.
La méthode div donne un appel à une fonction qui calcule la structure div, mais un appel de fonction semble inefficace sur les plates-formes qui ont un support matériel pour le type intégral (c'est-à-dire des entiers 64 bits sur les plates-formes Intel / AMD 64 bits).
la source
Vous pouvez utiliser un module pour obtenir le reste. Bien que la réponse de @ cnicutar semble plus claire / plus directe.
la source