Forum: Mikrocontroller und Digitale Elektronik FLOAT BERECHNUNG


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von stephan (Gast)


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


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


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


Bewertung
0 lesenswert
nicht lesenswert
Hi

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

Matthias

von Michael (Gast)


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


Bewertung
0 lesenswert
nicht lesenswert
Hi

stimmt

von Peter D. (peda)


Bewertung
0 lesenswert
nicht lesenswert
Hier mal ein Beispielcode:

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

Peter

von Andreas S. (andreas) (Admin) Benutzerseite Flattr this


Bewertung
0 lesenswert
nicht lesenswert
Float-Zahlen runden (positiv und negativ):

(int)floor (x + 0.5)

von Matthias (Gast)


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


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


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


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

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.