Entwickler-Ecke
Basistechnologien - Problem mit Berechnung und (int)
Sneedlewoods - Do 18.04.13 13:40
Titel: Problem mit Berechnung und (int)
Hallo, ich führe folgende Berechnungen durch:
C#-Quelltext
1: 2: 3: 4:
| int w1 = Math.Abs(p1.X - p2.X); int w2 = (int)(c.Width / 2); int h1 = Math.Abs(p1.Y - p2.Y); int h2 = (int)((w2 / w1) * h1); |
Irgendwo hatte ich das mit dem (int) gelesen und habe es einfach mal benutzt. h2 liefert allerdings 0 zurück was nicht sein sollte.
Beispiel:
p1.X = 353
p1.Y = 239
p2.X = 477
p2.Y = 102
c.Width = 100
h2 = 0 :(
was läuft da falsch?
richtig wäre:
h2 = 55
Ralf Jansen - Do 18.04.13 14:12
w2/w1 (wenn ich rechnen kann wäre das 50/124) wird 0 sein. Es ist ja eine Ganzzahldivision. Du solltest w1 und w2 vor der Division auf double (irgendeinen Fließkommatyp halt) casten und dann dividieren.
Th69 - Do 18.04.13 14:54
Oder aber ohne den Umweg über die Konvertierung:
C#-Quelltext
1:
| int h2 = (w2 * h1) / w1; |
;-)
Sneedlewoods - Do 18.04.13 17:04
@Th69 wandelt er das Ergebnis dann selbstständig in eine Ganzzahl um? Dann wäre ja mal ein positives Verhalten :p Ich bin das noch von früher gewohnt, dass ich Komma-Ergebnisse noch umwandeln muss.
Ralf Jansen - Do 18.04.13 17:11
Es ist nie was anderes als eine Ganzzahl. Gibt keinen Grund zur Umwandlung.
Sneedlewoods - Do 18.04.13 17:21
Bei geteilt kannst Du nie sicher sein.
Ralf Jansen - Do 18.04.13 17:26
Doch man kann sich sicher sein. Integer/Integer ergibt immer einen Integer. Es ist vielleicht nicht immer das was der Programmierer wollte aber das was er bekommt.
Sneedlewoods - Do 18.04.13 17:30
Ja danke Ralf. Weißt Du, es hätte also gereicht wenn Du dazugesagt hättest, dass es vom Compiler als Int behandelt wird. Dir hätte auffallen können dass ich vom mathematischen Standpunkt ausgehe, und da ist geteilt nunmal nicht immer Ganzzahl!
So hätten wir uns die letzten Posts also sparen können. Und genau das war meine Frage an Th69 gewesen -.-
Palladin007 - Do 18.04.13 19:37
Fals ich was dazu sagen dürfte: Wir befinden uns auf einen Forum zum Thema Softwareentwicklung, ich denke, daher sollten wir hier auch immer von diesem Punkt ausgehen ^^
Und unter dem Punkt ist der Satz
Zitat: |
Bei geteilt kannst Du nie sicher sein. |
schlicht falsch, da kannst du dich wehren, wie du willst. ^^
Deshalb die Korrektur von Ralf.
(Ganz abgesehen davon stimmt der Satz unter keinem Betrachtungspunkt :D)
Warum die kleine mathematische Umstellung funktioniert, ist allerdings ganz einfach und zwar, wenn du erst rechnest:
Und das ergibt eine Zahl mit einer 0 vor dem Komma (was ja durchaus möglich sein kann), verwendet der Compiler nur 0, da es eine Ganzzahl ist. Die Multiplikation mit h1 ist danach völlig egal.
Was Th69 daher gemacht hat, ist Formel so umgestellt, dass die Division an letzter Stelle steht und das h1 vorher mit eingerechnet wird, ohne dass die Begrenzungen einer Ganzzahl die Funktion der Formel behindern. Das ist eine simple Umstellung.
w2 * h1 kann also ohne Umformung gerechnet werden, da bei einer Multiplikation zweier Ganzzahlen auch eine Ganzzahl heraus kommt. Da du ja sowieso eine Ganzzahl haben willst, können ja auch Kommastellen abgeschnitten werden, allerdings erst am Ende, wenn bereits alles andere durchgrechnet wurde.
Sneedlewoods - Do 18.04.13 20:55
Sag mal red ich spanisch? wenn ich vom mathematischen Standpunkt ausgehe, und da kannst du nunmal nicht dran ändern,
dann ist z.B. 3/2 = 1,5 und das ist keine ganze Zahl.
Ich weiß gar nicht wieso man über so eine banale Sache hier Schwanzvergleich machen muss.
Ansonsten danke für die Antworten.
Christian S. - Do 18.04.13 21:06
Hallo, Sneedlewoods!
Ich möchte Dich bitten, ein bisschen auf Deinen Tonfall zu achten. Missverständnisse können passieren, das ist aber kein Grund direkt so pampig zu werden.
Ralf hat völlig korrekt geantwortet und bezog sich dabei auf Deinen Programmquelltext. Und der ist nun mal in C# geschrieben, also bezog Ralf sich konsequenterweise auf das Verhalten von C# (und allen anderen C-artigen Sprachen, die ich kenne). Wenn Du ab einem gewissen Punkt einen mathematischen statt einem programmier-technischen Standpunkt einnimmst, kann das halt zu diesen Missverständnissen führen. :nixweiss:
Da das Thema erledigt zu sein scheint, mache ich hier dann auch mal zu.
Grüße
Christian
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!