mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik FLOAT BERECHNUNG


Autor: stephan (Gast)
Datum:

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

Autor: Andre Groß (Gast)
Datum:

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

Autor: Michael (Gast)
Datum:

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.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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

Matthias

Autor: Michael (Gast)
Datum:

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 !

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

stimmt

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier mal ein Beispielcode:

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

Peter

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

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

(int)floor (x + 0.5)

Autor: Matthias (Gast)
Datum:

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 !!!!!!!!

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

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

Autor: Matthias (Gast)
Datum:

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

Autor: Andre Groß (Gast)
Datum:

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.