www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Runden von FLOAT Werten


Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@all,

ich versuche float Werte zu runden also auf bzw. abrunden und dann als
Integer zu speichern.
Habe schon einiges versucht aber irgentwie komme ich nicht auf einen
Lösungsansatz.
Hier noch ein paar Beispiele:

54.6547 --> 55
54.4357 --> 54

also so wie ein Taschenrechner ab 5 aufrunden darunter abrunden.

Danke schon mal !!!!!!!:-)

TOM

Autor: Horst-Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
+0.5

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Horst-Otto,

habe Deine Antwort erst als Scherz gesehen, jedoch nach einigen
Gedanken gängen musse ich feststellen das man manchmal einfach nicht
auf die einfachsten Dinge kommt.

Danke für den Denkanstoss.

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stimmt aber nur für positive Zahlen !

Peter

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Peter,

ich habe es bereit in eine funktion geschrieben die pos. und neg.
Zahlen  berücksichtigt.

int Runden(float x)
{
  int y;
  if(x>0)
  {
    x=x+0.5;
  }
  else
  {
    x=x-0.5;
  }
  y=x;
  return y;
}

Ist dies richtig ?!?!?

Danke an alle!!!!!!

TOM

Autor: Marko B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das kann man noch etwas kompakter ausdrücken:

y=x<0?x-0.5:x+0.5;

;-)

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
y=x+(x<0?-0.5:0.5);


Peter

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
floor() könnte helfen.

Autor: Marko B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter: Dein Code macht genau das gleiche, ist aber 1 Byte länger. Oder
hab ich da was übersehen?

A.K:

Wobei?

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
y=floor(x+0.5)

Ok, kürzer ist das eher nicht, weil man sich diese Routine einhandelt.
Aber der Mathematik ist man damit ein Stück näher.

Autor: TOM (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ all,

Danke für die zahlreichen antworten.
Wenn ich Eure Beispiele sehe muss ich mich für meinen 10zeiler ja fast
in der Ecke verkriechen :-).
Bin leider noch nicht so fitt da ich mich erst seit neusen mit
Controllern beschäftige.
Aber auf alle Fälle habe ich anhand Eurer Syntax mal wieder was
dazugelernt.

DAMKE !!!!!!!!!!!!!

TOM

Autor: Unbekannter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, wenn Du einmal scharf nachdenkst, solltest du x,5 nicht immer
generell aufrunden oder abrunden, sondern abwechselnd auf- oder
abrunden. Am besten bei x,5 immer zur nächsten geraden Zahl runden.
Erst dann rundest Du mathematisch/statistisch korrekt.

Das ganze nennt sich dann "round to even" oder "banker's
rounding".

Autor: Profi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mit floor habe ich auch gerade was probiert, ist in <math.h> definiert.
floor gibt aber einen double-Wert zurück.
Ganz korrekt müsste es mit type-casting

y=(integer)(floor(x+0.5))

heißen, dafür kann man gleich

y=(integer)(x+0.5)

schreiben. Das type-casting macht der Compiler meist automatisch.

Die Frage ist, ob man das ganze nicht auch mit Integern lösen kann,
wenn man z.b. die "Auflösung" gleich höher ansetzt.
z.B. muss ich gerade die Periodendauer eines Timers ausrechnen.
timer = TIMERFREQ / freq;         //z.B. 5000000 / 5000

Dafür schreibe ich
timer = 10 * TIMERFREQ / freq10;  //z.B. 50000000 / 50000
freq10 ist die gewünschte Frequenz in Zehntel-Hertz.

So spare ich den ganzen float-Kram.
Es muss nicht unbedingt zehntel sein, es gehen auch "gerade" Werte
wie 8tel oder 256stel.

Bei 256stel bedeutet das, ich habe ein Byte nach dem Komma.
Wenn ich dann runden will, zähle ich 1 auf den Vorkomma-Teil, wenn im
Nachkomma-Byte das höchste Bit gesetzt ist.

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"y=(integer)(floor(x+0.5))
heißen, dafür kann man gleich
y=(integer)(x+0.5)"

Ach ja?
floor(-0.3) == -1.

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.