Warum ist die division Ergebnis zwischen zwei ganzen zahlen gekürzt?
Alle erfahrene Programmierer in C# (ich denke, das kommt von C) verwendet werden, um Zauber auf den ganzen zahlen in eine division zu kommen, die decimal /double /float Ergebnis statt der int - (das eigentliche Ergebnis abgeschnitten).
Ich würde gerne wissen, warum diese umgesetzt wie dieses? Gibt es irgendeinen guten Grund zum abschneiden der Ergebnis, wenn beide zahlen sind integer?
- Das ist, wie integer-Mathematik funktioniert.
- Ich würde sagen, die Abwärtskompatibilität und die logische (
int
/int
=int
und nichtint
/int
=double
). Wer haben eine andere Programmiersprache benutzt würde erwarten, dass dieses Verhalten. Gibt es irgendeine andere Sprache, die tun es auf andere Weise? - Dokumentation zu diesem Thema ist Recht klar.
- Wie viele Seiten würde Sie haben, wenn jede Seite hätte 20 Stück und Sie haben 219 Elemente, um Sie zu füllen mit?
- Pascal und Basic haben unterschiedliche Betreiber für double-und int-division, wo der Typ des Ergebnisses hängt von der Betreiber nicht auf die Argumente ein.
- Wenn es nicht funktioniert, die Art, die Nummer 1 am meisten benutzt, die Bedienung nach einer division wäre ein abschneiden der Konvertierung..
- ja - Pascal (oder Delphi mindestens) implementiert das Ergebnis der integer-division als float. Es verwendet, um mich richtig ärgern, wenn ich wechselte zu C, das Ergebnis war ein abgerundetes-down-integer. Nachdem alle, in der Schule, wenn Sie sagte, 3 geteilt durch 2 = 1, Ihre Mathe-Lehrer wäre nicht beeindruckt!
- Python 3 gibt
int / int = double
. Python 2 gearbeitet, der andere Weg aber jetzt Sie ' ve Hinzugefügt eine zweite Betreiber//
wenn Sie eine ganze Zahl als Ergebnis.
Du musst angemeldet sein, um einen Kommentar abzugeben.
C# Spuren Ihr Erbe zu C, so ist die Antwort auf die Frage "warum ist es so in C#?" ist eine Kombination von "warum ist es so in C?" und "gab es keinen guten Grund, das zu ändern?"
Den Ansatz von C ist eine relativ enge Korrespondenz zwischen den high-level-Sprache und low-level-Operationen. Prozessoren im Allgemeinen implementieren Sie die division als eine Rückkehr ein quotient und ein Rest, beide sind vom gleichen Typ wie die Operanden.
(So meine Frage wäre, "warum nicht integer-division in C-ähnlichen Sprachen zurück zwei Ganzzahlen", nicht "warum nicht es wieder eine floating-point-Wert?")
War die Lösung, um verschiedene Operationen division und Rest, von denen jede eine ganze Zahl zurückgibt. Im Zusammenhang mit C, ist es nicht verwunderlich, dass das Ergebnis jeder dieser Operationen ist eine ganze Zahl. Dies ist Häufig genauer als floating-point-Arithmetik. Betrachten wir das Beispiel aus Ihrem Kommentar
7 /3
. Dieser Wert nicht dargestellt werden kann durch eine endliche Binärzahl noch durch eine endliche Dezimalzahl. In anderen Worten, auf den heutigen Computern, können wir nicht exakt darstellen7 /3
, es sei denn, verwenden wir Integer! Der Genaueste Darstellung dieser Bruchteil ist "quotient 2, Rest 1".So, gab es keinen guten Grund, das zu ändern? Ich kann nicht jeder denken, und ich kann denken Sie an ein paar gute Gründe nicht zu ändern. Keine der anderen Antworten erwähnt hat Visual Basic die (zumindest bis version 6) hat zwei Operatoren für die Division Ganzzahlen:
/
wandelt die Integer zu double und gibt ein double zurück, während\
führt den normalen integer-Arithmetik.Habe ich gelernt, über die
\
Betreiber nach kämpfen zu implementieren, wird eine binäre Suche Algorithmus mit Gleitkomma-division. Es war wirklich schmerzhaft, und die division kam im wie ein Atem der frischer Luft. Ohne es, es gab viele Besondere Behandlung, cover edge-Fällen und off-by-one-Fehler in den ersten Entwurf des Verfahrens.Aus dieser Erfahrung ziehe ich den Schluss, dass mit verschiedenen Operatoren für die Division Ganzzahlen sind, ist verwirrend.
Andere alternative wäre nur eine integer-operation, die immer wieder ein Doppel -, und erfordert Programmierer, um es abschneiden. Dies bedeutet, dass Sie durchführen müssen zwei int->doppelte Konvertierungen, abgeschnitten, und ein Doppel->int Konvertierung jedes mal, wenn Sie wollen, integer-division. Und wie viele Programmierer würden fälschlicherweise Runde oder Boden das Ergebnis, anstatt es abschneiden? Es ist ein etwas kompliziertes system, und mindestens so anfällig für Programmierer Fehler, und langsamer.
Schließlich, zusätzlich zu binäre Suche, es gibt viele standard-algorithmen, mit deren Ganzzahl-Arithmetik. Ein Beispiel ist die Aufteilung von Sammlungen von Objekten, die in der sub-Sammlungen von ähnlicher Größe. Eine andere ist die Umwandlung zwischen Indizes, die in einem 1-d-array und die Koordinaten in einer 2-d-matrix.
Soweit ich das sehen kann, keine alternative zu "int /int ergibt int" überlebt eine Kosten-nutzen-Analyse in Bezug auf die Sprache, die usability, also gibt es keinen Grund zu ändern, das Verhalten geerbt von C.
Fazit:
(double)a /b
eher alsa /b
div
Funktion inmath.h
.Natürlich; ich denke, der kann ein Dutzend solcher Szenarien einfach. Zum Beispiel: Sie haben ein großes Bild, und eine thumbnail-version des Bildes, die ist 10-mal kleiner in beiden Dimensionen. Wenn der Benutzer klickt auf einen Punkt in das große Bild, Sie wollen sich identifizieren, die entsprechenden pixel im verkleinerten Bild. Klar, so zu tun, Sie teilen beide die x-und y-Koordinaten durch 10. Warum würden Sie wollen, um ein Ergebnis zu erhalten in dezimal? Die entsprechenden Koordinaten werden auf ganzzahligen Koordinaten in der thumbnail-bitmap.
Doppelzimmer sind ideal für die Physik-Berechnungen und Dezimalstellen sind ideal für finanzielle Berechnungen, aber fast alle die Arbeit, die ich mit Computern, hat jeder Mathe überhaupt nicht vollständig in Ganzzahlen. Ich will nicht ständig zum konvertieren von Doppel-oder Dezimalzahlen zurück zu ganzen zahlen, nur weil ich einige division. Wenn Sie die Lösung Physik oder finanzielle Probleme, dann warum verwenden Sie ganze zahlen in den ersten Platz? Verwenden nichts aber verdoppelt oder Dezimalzahlen. Verwenden Sie Ganzzahlen, um zu lösen, finite Mathematik Probleme.
Berechnung auf ganzen zahlen ist schneller (in der Regel) als floating-point-Werte. Außerdem werden alle anderen integer/integer-Operationen (
+
,-
,*
) eine Ganzzahl zurück.BEARBEITEN:
Wie pro die Anforderung des OP, hier ist etwas dazu:
Den OP ' s problem ist, dass Sie denken, der
/
als division im mathematischen Sinne, und die/
- operator in der Sprache führt einen anderen Vorgang aus (das ist nicht die Mathematik. division). Durch diese Logik sollten Sie hinterfragen die Gültigkeit aller anderen Operationen (+
,-
,*
) als gut, da diese spezielle überlauf Regeln, die nicht die gleiche ist, wie zu erwarten wäre aus Ihrem Mathe-Kollegen. Wenn dies lästig für jemanden, der Sie finden sollte, eine andere Sprache, wo die Operationen ausführen, wie erwartet, von der person.Als für den Anspruch auf perfomance-Unterschied zu Gunsten von integer-Werten: Wenn ich schrieb, die Antwort hatte ich nur "folk" wissen und "intuition" zu sichernden Forderung (hece meine "Regel" disclaimer). In der Tat, wie Frank wies darauf hin, es gibt Plattformen, wo dies nicht halten. Auf der anderen Seite fand ich diese link (Punkt 12) zeigt, dass gemischte Darbietungen, die auf einer Intel-Plattform (die verwendete Sprache ist Java, obwohl).
Den mitnehmen sollte sein, dass mit einer Leistung, die viele Ansprüche und intuition sind unbegründet, bis gemessen und fand die richtige.
int
, wäre es nicht mehr integer math! Dies ist, wie es funktioniert mit allen Typen: das Ergebnis eineruint
division ist einuint
, das Ergebnis einerfloat
division ist einfloat
usw. In der Abwesenheit von jeder Besetzung, wie soll die Berechnung erfolgen, wiefloat
,double
oderdecimal
? Der compiler hat zu wählen. Wenn Sie möchten, dass eines dieser Ergebnisse, die Sie wählen.positive + positive
ist positiv, auch das Produkt oder die Abteilung, die so toll! lets makepositive - positive
immer positiv sein.. richtig?/
Häufig genannte Abteilung, wenn es nicht ist. 3 geteilt durch 2 gleich 1,5: jeder weiß, doch die Entwickler sind also verwendet, um integer-Mathematik, die es nicht registrieren, dass das " / " - operator nicht mit der mathematischen Korrektheit der anderen Betreiber.uint
in C#, by the way);uint-uint
istuint
, so dass Sie nie am Ende mit einer negativen Zahl, auch wenn das zweite argument größer ist als der erste. Können Sie damit Leben?/
ist einfach nicht Sparte./
als division im mathematischen Sinne, und die/
- operator in der Sprache führt einen anderen Vorgang aus (das ist nicht die Mathematik. division), dann sollte man halt auch Frage ist die Gültigkeit aller anderen Operationen (+
,-
,*
), da Sie spezielle überlauf Regeln, die nicht die gleichen, wie Sie erwarten würden von Ihren mathematischen Entsprechungen. Wenn dies der Fall ist, vielleicht finden Sie eine andere Sprache, wo diese Operationen ausführen, wie Sie erwarten würde.Ja, wenn das Ergebnis muss eine ganze Zahl sein. Es würde hängen von den Anforderungen.
Wenn diese zwar Ihre Anforderungen, dann würden Sie nicht wollen, um zu speichern eine Dezimalzahl und es abschneiden. Sie verschwenden Speicherplatz und Verarbeitungszeit etwas zu erreichen, das ist bereits built-in-Funktionalität.
Den Bediener ist entworfen, um wieder den gleichen Typ als Eingabe.
Bearbeiten (Kommentar-Antwort):
Warum? Ich glaube nicht, design-Sprachen, aber ich würde davon ausgehen, die meisten der Zeit werden Sie kleben mit den Datentypen, die Sie mit gestartet und in der verbleibenden Instanz, welche Kriterien würden Sie verwenden, um automatisch davon ausgehen, welche Art der Nutzer will? Würde Sie automatisch erwarten, dass eine Zeichenfolge, wenn Sie es brauchen? (Aufrichtigkeit beabsichtigt)
Wenn Sie ein int ein int, die Sie erwarten, zu bekommen, eine int. Wenn Sie subtrahieren eines int aus int, die Sie erwarten, zu bekommen, eine int. Wenn Sie mehrere ein int durch einen int, die Sie erwarten, zu bekommen, eine int. Also warum würden Sie nicht erwarten ein int-Ergebnis, wenn Sie teilen ein int durch einen int? Und wenn Sie erwarten, dass ein int, dann müssen Sie abgeschnitten werden.
Wenn Sie das nicht wollen, dann müssen Sie werfen Sie Ihre ints auf etwas anderes zuerst.
Edit: ich würde auch beachten, dass, wenn Sie wirklich wollen, um zu verstehen, warum das so ist, dann sollten Sie Beginn der Suche in wie binäre Mathematik funktioniert und wie es umgesetzt wird in eine elektronische Schaltung. Es ist sicherlich nicht notwendig, es zu verstehen, im detail, aber mit einem kurzen überblick, es würde wirklich helfen Ihnen zu verstehen, wie die low-level-details der hardware durch filter, um die details der high-level-Sprachen.