Hi, ich berechne mir die Package Size meiner Übertragung wie folt Anzahl der Packete = Dateigrösse / (Datenpaketgrösse - 6) // Formel vorgegeben Bei einer Dateigrösse von 0x0650 => 1560 und einer Datenpaketgrösse von 128 bekomme ich als Ergebns 12. Allerdings sollte nach der Mathe 12,787 => 13 rauskommen. Was mache ich falsch ? size = ceil(i_size/(128-6));
Das Runden geht natürlich nur bei Berechnungen, die in Gleitkommaarithmetik durchgeführt werden. So lange keiner der Datentypen in der Rechnung ein Gleitkommatyp ist (was ich vermute, da es recht sinnfrei sein dürfte, eine Datenpaketgröße in Gleitkomma anzugeben), wird die Berechnung ganzzahlig durchgeführt. Und da kommt im Beispiel eben 12 raus. Und ceil(12) ist selbstverständlich immer noch 12... Es ist bei solchen Sachen aber auch völlig sinnfrei, die Datentypen der Variablen bei einer solchen Anfrage zu verschweigen...
Deine Integer-Division schneidet das Ergebnis auf 12 zusammen, da der Ergebnistyp `int' ist. Daran ändert es dann auch nichts mehr, dass du diese 12 umständlich in eine Gleitkommazahl wandeln lässt, um sie ceil() zu übergeben. [Edit: Johannes war schneller...] Du müsstest die Division bereits im Gleitkommabereich erledigen:
1 | size = ceil((double)i_size/(128-6)); |
Besser ist es allerdings, die Rundung gleich im Integerbereich zu erledigen:
1 | size = (i_size+128-6-1)/(128-6); |
>Deine Integer-Division schneidet das Ergebnis auf 12 zusammen, da >der Ergebnistyp `int' ist. Oh ja nich gut... >Und da kommt im Beispiel >eben 12 raus. Und ceil(12) ist selbstverständlich immer noch 12... q.e.d. ;-) Habe verstanden, die Rundung findet bereits vorher statt etc. Jörgs Vorschlag werde ich nun mal ausprobieren. Danke euch
Matthias wrote:
> Habe verstanden, die Rundung findet bereits vorher statt
Nein. Es findet überhaupt keine Rundung statt!
Die Division wird als Ganzzahldivision ausgeführt.
Die Nachkommastellen entstehen erst gar nicht.
Ja das mein ich ja wie das ganzzahlige Ergebnis einer modulo division wobei der Rest nicht berücksichtigt wird.
ceil rundet immer auf den naechsten Integer auf floor tut das Gegenteil ceil/floor ist mit round nicht zu verwechseln Michael
Michael G. wrote: > ceil rundet immer auf den naechsten Integer auf > floor tut das Gegenteil > > ceil/floor ist mit round nicht zu verwechseln > > Michael Hehe, ziemlich späte Information. Und ich wette mit dir, dass der Threadopener das wusste, bevor er den Thread eröffnet hat. Sonst hieße der Threadtitel nicht so...
Tja, manche Leute lesen sich nicht mal die anderen Postings durch. Hauptsache, Senf dazugeben, auch wenn's redundant ist...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.