Ist "long x = 1/2" gleich 1 oder 0 und warum? [Duplikat]

8

wenn ich etwas wie:

habe %Vor%

sollte das nicht auf 1 aufgerundet werden? Wenn ich es auf dem Bildschirm drucke, sagt es 0.

    
user69514 02.02.2010, 20:33
quelle

6 Antworten

28

Es wird eine Ganzzahl-Division gemacht, die alles nach rechts vom Dezimalpunkt abschneidet.

    
tvanfosson 02.02.2010 20:34
quelle
6

Ganzzahlige Division hat ihre Wurzeln in der Zahlentheorie. Wenn Sie 1/2 tun, fragen Sie, wie oft 2 gleich 1 ist? Die Antwort ist niemals, also wird die Gleichung 0 * 2 + 1 = 1, wobei 0 der Quotient ist (was man von 1/2 erhält) und 1 ist der Rest (was man von 1% 2 erhält).

Es ist richtig, darauf hinzuweisen, dass% kein wahrer Modulus im mathematischen Sinne ist, sondern immer ein Rest aus der Division. Es gibt einen Unterschied, wenn Sie mit negativen ganzen Zahlen umgehen.

Ich hoffe, das hilft.

    
Johann Oskarsson 02.02.2010 21:26
quelle
5

Was dieser Ausdruck tut, ist, dass er zuerst die Existenz eines langen aufgerufenen x deklariert und ihm dann den Wert des Ausdrucks auf der rechten Seite zuweist. Der Ausdruck auf der rechten Seite ist 1/2, und da 1 und 2 beide Ganzzahlen sind, wird dies als ganzzahlige Division interpretiert. Bei einer Ganzzahldivision ist das Ergebnis immer eine Ganzzahl, also gibt etwas in der Form von 5/3 1 zurück, da nur eine Drei in eine Fünf passt. Also mit 1/2, wie viele 2s können in 1 passen? 0.

Dies kann in manchen Sprachen zu interessanten Ausgaben führen, wenn Sie etwas schreiben Doppel x = 1/2. Sie könnten in diesem Fall 0.5 erwarten, aber es wird oft den ganzzahligen Wert auf der rechten Seite zuerst auswerten, bevor Sie das Ergebnis in ein double umwandeln und konvertieren, was den Wert 0.0

ergibt

Es ist wichtig zu beachten, dass bei dieser Art der Typumwandlung das Ergebnis niemals umrundet wird. Also wenn du das Gegenteil tust: lang x = (lang) (1,0 / 2,0); then while (1.0 / 2.0) wird zu 0.5 ausgewertet, die (lange) Umsetzung erzwingt eine Kürzung auf 0. Selbst wenn ich long x = (long) (0.9) hätte, wäre das Ergebnis immer 0. Es wird einfach abgeschnitten nach dem Komma.

    
Jacob Bellamy 02.02.2010 21:16
quelle
4

Es kann nicht gerundet werden, weil es nie in einem Zustand gerundet wird

Der Ausdruck "1/2" ist niemals 0,5 vor dem Zuweisen zu lang

Nun, long x = 1.0/2.0 , weil der Ausdruck rechts vor dem Zuweisen für das Runden gilt. Es sei denn, Sie erhalten 0.499999999999997 ...

    
gbn 02.02.2010 20:36
quelle
2

Diese Frage wurde zuvor auf dieser Seite beantwortet, Sie machen eine Integer-Division, wenn Sie die 0.5 verwenden möchten:

%Vor%

und Sie erhalten den Wert von 0.5 .

    
Jorgesys 27.12.2013 23:58
quelle
1

Es gibt viele verschiedene Rundungskonventionen, die am häufigsten sind Rundungen in Richtung + inf, Rundungen in Richtung -inf und Rundungen in Richtung Null. Viele Leute nehmen an, dass es einen richtigen Weg gibt, aber sie alle haben unterschiedliche Vorstellungen darüber, was dieser eine Weg sein sollte; -)

Es gibt kein Zwischenergebnis ohne Ganzzahl für die Ganzzahldivision, aber natürlich erfolgt die Division deterministisch, und für eine bestimmte Plattform und einen Compiler wird immer eine bestimmte Rundungskonvention befolgt.

Mit Visual C ++ bekomme ich 5/2 = 2 und -5/2 = -2 und runde auf Null.

Die Rundung in C, C ++ und Java wird üblicherweise "truncation" genannt - das bedeutet, die unerwünschten Bits fallen zu lassen. Aber diese kann irreführend sein. Unter Verwendung von 4-Bit-2s-Komplement-Binärdateien bedeutet das, was Trunkierung impliziert, ...

%Vor%

Was auf Python aufruft, was Python tut (oder zumindest was es in Python 2.5 getan hat).

Trunkierung wäre das richtige Wort, wenn wir eine Vorzeichen-Magnituden-Repräsentation verwenden, aber Zweierkomplemente sind seit Jahrzehnten der De-facto-Standard.

In C und C ++ erwarte ich, dass es normalerweise "truncation" heißt, aber in Wirklichkeit ist dieses Detail in den Standards undefiniert und der Implementierung überlassen - eine Entschuldigung dafür, dass der Compiler die einfachste und schnellste Methode für die Plattform verwendet Prozessor Division Anweisung natürlich). Es ist nur ein Problem, wenn Sie negative Zahlen haben - ich habe noch keine Sprache oder Implementierung gesehen, die 5/2 = 3 ergeben würde.

Ich weiß nicht, was der Java-Standard sagt. Das Python-Handbuch gibt "floor" division an, was ein gebräuchlicher Begriff für das Runden auf -infinity ist.

BEARBEITEN

Eine zusätzliche Note - per Definition, wenn a / b = c Rest d, dann a = (b * c) + d. Um dies zu halten, müssen Sie einen Rest auswählen, der Ihrer Rundungskonvention entspricht.

Man geht davon aus, dass Reste und Modulos gleich sind, aber WRT signierte Werte, sie können unterschiedlich sein - abhängig von den Rundungsregeln. Modulo-Werte sind definitionsgemäß nie negativ, aber Reste können negativ sein.

Ich vermute, dass die Python-Rund-Negativ-Unendlichkeit-Regel sicherstellen soll, dass der einzelne% -Operator sowohl als Rest als auch als Modulo gültig ist. In C und C ++ bedeutet% (Rest oder Modulo), dass die Implementierung (ja, Sie haben es erraten) definiert wurde.

Ada hat eigentlich zwei getrennte Operatoren - mod und rem. Mit Division erforderlich, um auf Null zu runden, so dass mod und rem do zu anderen Ergebnissen führen.

    
Steve314 02.02.2010 21:36
quelle