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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.