mikrocontroller.net

Forum: Compiler & IDEs ceil() tut abrunden?


Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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));

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
size = ceil((double)i_size/(128-6));

Besser ist es allerdings, die Rundung gleich im Integerbereich
zu erledigen:
size = (i_size+128-6-1)/(128-6);

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias (Gast)
Datum:

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

Autor: Oberlehrer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>ceil() tut abrunden?

Du tust kein Deutsch können!

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ceil rundet immer auf den naechsten Integer auf
floor tut das Gegenteil

ceil/floor ist mit round nicht zu verwechseln

Michael

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
You are one to talk.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.