Beispielsweise,
int result;
result = 125/100;
oder
result = 43/100;
Wird das Ergebnis immer der Boden der Division sein? Was ist das definierte Verhalten?
"I just throw the dam fraction part in the trash and move on with life"
Beispielsweise,
int result;
result = 125/100;
oder
result = 43/100;
Wird das Ergebnis immer der Boden der Division sein? Was ist das definierte Verhalten?
"I just throw the dam fraction part in the trash and move on with life"
Antworten:
Wird das Ergebnis immer der Boden der Division sein? Was ist das definierte Verhalten?
Ja, ganzzahliger Quotient der beiden Operanden.
6.5.5 Multiplikative Operatoren
6 Wenn ganze Zahlen geteilt werden, ist das Ergebnis des Operators / der algebraische Quotient, wobei jeder Bruchteil verworfen wird. 88) Wenn der Quotient a / b darstellbar ist, ist der Ausdruck (a / b) * b + a% b gleich a.
und die entsprechende Fußnote:
88) Dies wird oft als "Abschneiden gegen Null" bezeichnet.
Natürlich sind zwei Punkte zu beachten:
3 An den Operanden werden die üblichen arithmetischen Konvertierungen durchgeführt.
und:
5 Das Ergebnis des Operators / ist der Quotient aus der Division des ersten Operanden durch den zweiten; Das Ergebnis des Operators% ist der Rest. Wenn in beiden Operationen der Wert des zweiten Operanden Null ist, ist das Verhalten undefiniert.
[Anmerkung: Hervorhebung von mir]
(a / b) * b + a % b == a
befriedigt werden, und der absolute Wert von a % b
musste kleiner sein als a
, aber ob a % b
negativ für negativ war a
oder b
nicht angegeben wurde.
Dirkgently gibt eine hervorragende Beschreibung der Ganzzahldivision in C99, aber Sie sollten auch wissen, dass in C89 die Ganzzahldivision mit einem negativen Operanden eine implementierungsdefinierte Richtung hat.
Aus dem ANSI C-Entwurf (3.3.5):
Wenn einer der Operanden negativ ist, wird die Implementierung definiert, ob das Ergebnis des Operators / die größte Ganzzahl ist, die kleiner als der algebraische Quotient ist, oder die kleinste Ganzzahl, die größer als der algebraische Quotient ist, ebenso wie das Vorzeichen des Ergebnisses des Operators%. Wenn der Quotient a / b darstellbar ist, ist der Ausdruck (a / b) * b + a% b gleich a.
Achten Sie also auf negative Zahlen, wenn Sie mit einem C89-Compiler nicht weiterkommen.
Es ist eine lustige Tatsache, dass C99 die Kürzung gegen Null gewählt hat, weil FORTRAN das so gemacht hat. Siehe diese Nachricht auf comp.std.c.
reliable integer division
eine neue Sprachfunktion erwähnt . Erstaunlich *-*
.
expr1 / expr2
und expr1 % expr2
miteinander konsistent sein müsste, wenn beide Instanzen expr1
dieselben Objekte auf dieselbe Weise und ebenfalls für kombinieren expr2
, aber die Wahl zwischen Abschneiden und Aufteilen auf dem Boden ist ansonsten nicht spezifiziert. Das hätte eine effizientere Codegenerierung ermöglicht, ohne die Kompatibilität zu
Wenn das Ergebnis negativ ist, schneidet C eher auf 0 als auf den Boden ab. Ich habe in dieser Lektüre erfahren, warum die Python-Ganzzahldivision hier immer Stockwerke bildet: Warum Pythons Ganzzahldivisionsetagen
filtered = (k - 1) * filtered + value + carry; carry = filtered % factor; filtered /= factor
, iteriert mit sich ändernden Werten von value
. Es ist eine schöne ganzzahlige Annäherung an ein Tiefpassfilter erster Ordnung mit Zeitkonstante k
... aber es ist nur symmetrisch, wenn die Division abgeschnitten wird und carry
negative Werte erhält. Beide Verhaltensweisen für die Teilung sind von Zeit zu Zeit nützlich.
div
es sich um einen Bodenteilungsoperator handelt und factor
ungerade ist, filtered += (filter+(factor div 2)) div factor
würde dies für alle Werte bis zu einem sauberen und symmetrischen Verhalten ergeben INT_MAX-(factor div 2)
.
Ja, das Ergebnis wird immer gegen Null abgeschnitten. Es wird auf den kleinsten absoluten Wert gerundet.
-5 / 2 = -2
5 / 2 = 2
Für vorzeichenlose und nicht negativ vorzeichenbehaftete Werte entspricht dies dem Boden (Rundung in Richtung -Infinity).
Wird das Ergebnis immer der Boden der Division sein?
Nein. Das Ergebnis variiert, aber die Variation tritt nur bei negativen Werten auf.
Was ist das definierte Verhalten?
Um es klar zu machen, rundet der Boden in Richtung negativer Unendlichkeit, während die ganzzahlige Division in Richtung Null rundet (abgeschnitten).
Für positive Werte sind sie gleich
int integerDivisionResultPositive= 125/100;//= 1
double flooringResultPositive= floor(125.0/100.0);//=1.0
Bei negativem Wert ist dies anders
int integerDivisionResultNegative= -125/100;//=-1
double flooringResultNegative= floor(-125.0/100.0);//=-2.0
Ich weiß, dass die Leute Ihre Frage beantwortet haben, aber in Laienbegriffen:
5 / 2 = 2
// da sowohl 5 als auch 2 ganze Zahlen sind und die Ganzzahldivision immer Dezimalstellen abschneidet
5.0 / 2 or 5 / 2.0 or 5.0 /2.0 = 2.5
// hier hat entweder 5 oder 2 oder beide eine Dezimalzahl, daher ist der Quotient, den Sie erhalten, dezimal.