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
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
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.
>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 !
Hier mal ein Beispielcode: dacs[channel] = cmd_val + (cmd_val < 0 ? -0.5 : 0.5); // rounding Peter
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 !!!!!!!!
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
Hi OK. Aber was soll dann das (int) vor floor()? Ist eindeutig das ich noch nicht wirklich viel mit float-Variablen gemacht hab. Matthias
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.