Ich frage mich nur, ob ich a durch b teilen möchte und sowohl am Ergebnis c als auch am Rest interessiert bin (z. B. wenn ich die Anzahl der Sekunden habe und diese in Minuten und Sekunden aufteilen möchte), was der beste Weg ist mach es?
Wäre es
int c = (int)a / b;
int d = a % b;
oder
int c = (int)a / b;
int d = a - b * c;
oder
double tmp = a / b;
int c = (int)tmp;
int d = (int)(0.5+(tmp-c)*b);
oder
Vielleicht gibt es eine magische Funktion, die beides gleichzeitig ermöglicht?
double
(Ihrem letzten Artikel) für mich eine schlechte Idee ist. Sie werden am Ende Zahlen haben, die nicht in einer Reihe stehen und Sie in Leistung und Leistung kosten können Größe der ausführbaren Datei (war für mich auf bestimmten eingebetteten Systemen immer ein Problem).Antworten:
Auf x86 ist der Rest ein Nebenprodukt der Division selbst, sodass jeder halbwegs anständige Compiler ihn nur verwenden kann (und kein erneutes ausführen kann
div
). Dies wird wahrscheinlich auch auf anderen Architekturen durchgeführt.quelle
idivl
Anweisung und den Ergebnissen in eax und edx. Ich wäre schockiert gewesen, wenn es nicht so gewesen wäre.idivl
Anweisungen erhalten, mit-O1
oder höher jedoch eine. Wie im Handbuch steht: „Ohne Optimierungsoption… sind Aussagen unabhängig“ .std::div
Gibt eine Struktur mit Ergebnis und Rest zurück.quelle
long long
, aber es ist sehr wahrscheinlich, dass Ihr Compiler einelong long
Überladungstd::div
als Erweiterung hat.Zumindest unter x86 verwendet g ++ 4.6.1 nur IDIVL und erhält beide von dieser einzelnen Anweisung.
C ++ - Code:
x86-Code:
quelle
/=
Sie möglicherweise eine temporäre Variable verwenden, um die Division zuerst beizubehalten.Beispielcode-Test div () und kombinierte Division & Mod. Ich habe diese mit gcc -O3 kompiliert und musste den Aufruf von doNothing hinzufügen, um zu verhindern, dass der Compiler alles optimiert (die Ausgabe wäre 0 für die Division + Mod-Lösung).
Nehmen Sie es mit einem Körnchen Salz:
Ausgänge: 150
Ausgänge: 25
quelle
Zusätzlich zu den oben genannten std :: div Familie von Funktionen, gibt es auch die std :: remquo Familie von Funktionen, kehren die rem -ainder und bekommen die quo -tient über eine bestandene-in - Zeiger.
[Edit:] Es sieht so aus, als würde std :: remquo den Quotienten doch nicht wirklich zurückgeben .
quelle
Wenn alles andere gleich ist, ist die beste Lösung eine, die Ihre Absicht klar zum Ausdruck bringt. So:
ist wahrscheinlich die beste der drei von Ihnen vorgestellten Optionen. Wie in anderen Antworten angegeben,
div
berechnet die Methode jedoch beide Werte gleichzeitig für Sie.quelle
Sie können g ++ 4.6.3 hier mit 64-Bit-Ganzzahlen auf einer 32-Bit-Intel-Plattform nicht vertrauen. a / b wird durch einen Aufruf von divdi3 berechnet und a% b wird durch einen Aufruf von moddi3 berechnet. Ich kann mir sogar ein Beispiel ausdenken, das mit diesen Aufrufen a / b und ab * (a / b) berechnet. Also benutze ich c = a / b und ab * c.
Die div-Methode ruft eine Funktion auf, die die div-Struktur berechnet, aber ein Funktionsaufruf scheint auf Plattformen mit Hardwareunterstützung für den integralen Typ ineffizient zu sein (dh 64-Bit-Ganzzahlen auf 64-Bit-Intel / AMD-Plattformen).
quelle
Sie können einen Modul verwenden, um den Rest zu erhalten. Obwohl die Antwort von @ cnicutar sauberer / direkter erscheint.
quelle