Forum: Mikrocontroller und Digitale Elektronik Runden von FLOAT Werten


von Tom (Gast)


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

von Horst-Otto (Gast)


Lesenswert?

+0.5

von Tom (Gast)


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.

von peter dannegger (Gast)


Lesenswert?

Stimmt aber nur für positive Zahlen !

Peter

von Tom (Gast)


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

von Marko B. (Gast)


Lesenswert?

Das kann man noch etwas kompakter ausdrücken:

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

;-)

von peter dannegger (Gast)


Lesenswert?

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


Peter

von A.K. (Gast)


Lesenswert?

floor() könnte helfen.

von Marko B. (Gast)


Lesenswert?

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

A.K:

Wobei?

von A.K. (Gast)


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.

von TOM (Gast)


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

von Unbekannter (Gast)


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

von Profi (Gast)


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.

von A.K. (Gast)


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.

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.