ceil() tut abrunden?

Gast #620920
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));
#620934
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...
Moderator Persönliche Seite #620936
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);
Gast #620955
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren