Autor Beitrag
Sneedlewoods
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Do 18.04.13 13:40 
Hallo, ich führe folgende Berechnungen durch:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 18.04.13 14:54 
Oder aber ohne den Umweg über die Konvertierung:
ausblenden C#-Quelltext
1:
int h2 = (w2 * h1) / w1;					

;-)

Für diesen Beitrag haben gedankt: Ralf Jansen
Sneedlewoods Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 18.04.13 17:11 
Es ist nie was anderes als eine Ganzzahl. Gibt keinen Grund zur Umwandlung.
Sneedlewoods Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: Do 18.04.13 17:21 
Bei geteilt kannst Du nie sicher sein.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: 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:
Zitat:
w2 / w1

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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".

Für diesen Beitrag haben gedankt: Dude566, Webo
Dieses Thema ist gesperrt, Du kannst keine Beiträge editieren oder beantworten.

Das Thema wurde von einem Team-Mitglied geschlossen. Wenn du mit der Schließung des Themas nicht einverstanden bist, kontaktiere bitte das Team.