Forum: Compiler & IDEs ceil() tut abrunden?


von Matthias (Gast)


Lesenswert?

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));

von Johannes M. (johnny-m)


Lesenswert?

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...

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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);

von Matthias (Gast)


Lesenswert?

>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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Matthias (Gast)


Lesenswert?

Ja das mein ich ja wie das ganzzahlige Ergebnis einer modulo division 
wobei der Rest nicht berücksichtigt wird.

von Oberlehrer (Gast)


Lesenswert?

>ceil() tut abrunden?

Du tust kein Deutsch können!

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

ceil rundet immer auf den naechsten Integer auf
floor tut das Gegenteil

ceil/floor ist mit round nicht zu verwechseln

Michael

von Simon K. (simon) Benutzerseite


Lesenswert?

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...

von Johannes M. (johnny-m)


Lesenswert?

Tja, manche Leute lesen sich nicht mal die anderen Postings durch. 
Hauptsache, Senf dazugeben, auch wenn's redundant ist...

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

You are one to talk.

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
Noch kein Account? Hier anmelden.