Forum: Mikrocontroller und Digitale Elektronik FLOAT BERECHNUNG


von stephan (Gast)


Lesenswert?

Hallo

...und zwar sollte die variable [test] rechnerisch am ende den wert 8
haben...
sie hat aber den wert 7.

sind das rundungsfehler ?

void main ()
{
  float value;
  unsigned char test;

  value = 1.8;

  test = 1;

  value = (value-(float)test)*10;

  test = (unsigned char)value;

  while(1);
}

SO WÜRDE ES FUNKTIONIEREN:

void main ()
{
  float value;
  unsigned char test;

  value = 1.8;

  test = 1;

>>>  value = (value*10-(float)test*10); <<<

  test = (unsigned char)value;

  while(1);
}

wieso?

danke

von Andre Groß (Gast)


Lesenswert?

Hallo Stephan !!

Bei einer Konvertierung von float nach int werden die
Nachkommastellen immer abgeschnitten.

(value-(float)test)*10 ergibt in deinem Fall 7.9999952

abgerundet also 7.

Wenn du dies umgehen willst kannst du entweder immer versuchen es auf
deine 2. Art zu machen, oder schöner du verwendest die Funktion
ceil (). Müssest du in Math.h finden. Diese rundet einen float-wert
auf die nächste ganze Zahl auf.

Andre

von Michael (Gast)


Lesenswert?

Bei float -> int mußt Du runden!
Offensichtlich wird bei Deinen float-Routinen intern 1.8 als 1,799999
dargestellt und bei float -> int abgeschnitten.

von Matthias (Gast)


Lesenswert?

Hi

einfach vor dem cast nach int 0,5 dazuaddieren und fertig.

Matthias

von Michael (Gast)


Lesenswert?

>einfach vor dem cast nach int 0,5 dazuaddieren und fertig.

Das ist einfach falsch.
Bei einer Rundung muß immer das Vorzeichen beachtet werden. Es gibt
zwar Teufel, die davon ausgehen, daß negative Zahlen nicht auftreten,
aber das sind eben die Teufel !

von Matthias (Gast)


Lesenswert?

Hi

stimmt

von Peter D. (peda)


Lesenswert?

Hier mal ein Beispielcode:

dacs[channel] = cmd_val + (cmd_val < 0 ? -0.5 : 0.5); // rounding

Peter

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Float-Zahlen runden (positiv und negativ):

(int)floor (x + 0.5)

von Matthias (Gast)


Lesenswert?

Hi

mach dir mal Gedanken darüber

7,4 + 0,5 = 7,9 -> 7
7,6 + 0,5 = 8,1 -> 8
-7,4 + 0,5 = 6,9 -> 6 !!!!!!!!
-7,6 + 0,5 = 7,1 -> 7 !!!!!!!!

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Hi Matthias,

floor(x) gibt per Definition die größte Ganzzahl zurück, die kleiner
oder gleich dem Parameter x ist. Wenn dein Compiler wirklich die oben
genannten Ergebnisse produziert, dann ist er nicht standardkonform.

-7,4 + 0,5 = -6,9 -> 7
-7,6 + 0,5 = -7,1 -> 8

von Matthias (Gast)


Lesenswert?

Hi

OK. Aber was soll dann das (int) vor floor()? Ist eindeutig das ich
noch nicht wirklich viel mit float-Variablen gemacht hab.

Matthias

von Andre Groß (Gast)


Lesenswert?

floor () und ceil () geben beide float-Werte zurück.
Diese mußt du dann noch nach int konvertieren.

Am besten schaust du dir einfach mal eine Beschreibung der
Funktionen an..

Meiner Meinung nach ist dies die sauberste Art zu runden. Welche
du verwendest hängt von deiner Anwendung ab.
Es gibt soweit ich weiss auch eine Funktion die "richtig" rundet,
aber mir fällt der Name gerade nicht ein. :-)

Andre

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.