www.mikrocontroller.net

Forum: Compiler & IDEs Float vergleichen


Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
wie kann ich in einer if-abrage zwei Float-Zahlen miteinander 
vergleichen, so dass aber nur die Vorkommastelle verglichen wird?

Danke schonmal im Vorraus

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Indem du vor dem Vergleich in ein C-Buch deiner Wahl schaust und dich 
über Rundungsmethoden informierst.

$ man trunc

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stelle Dir vor, Du müsstest es per Hand machen.
Wie würdest Du vorgehen?
Runden oder Nachkommastellen abschneiden?
Genauso machst Du es dann im Programm.

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe es jetzt wie folgt gelöst

        int vswr_new = vswr;
        int vswr_cutout_value_new = vswr_cutout_value;

        if (vswr_new >= vswr_cutout_value_new)



ist das geschickt oder eher nicht ?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nur dann geschickt, wenn "int" gross genug für alle Werte ist.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jens schrieb:
> Habe es jetzt wie folgt gelöst
>
>         int vswr_new = vswr;
>         int vswr_cutout_value_new = vswr_cutout_value;
>
>         if (vswr_new >= vswr_cutout_value_new)
>
>
>
> ist das geschickt oder eher nicht ?

Das kommt drauf an :-)

Floating Point Rechnereien sind nicht so einfach, wie man das gerne 
hätte oder wie man sich das gemeinhin so vorstellt.

Wenn du zb zu einem Ausgangswert von 0, 10 mal 0.1 dazuzählst
  double result = 0;
  for( i = 0; i < 10; ++i )
    result += 0.1;

dann stehen die Chancen schlecht, dass da exakt 1.0 herauskommt. Wenn in 
deinem Floating Point System da 1.00000001 herauskommt, dann bist du mit 
dem einfachen Abschneiden der Nachkommastellen auf der sicheren Seite.

   int i = result;

bekommt den Wert 1.

Wenn sich aber da ein Wert von 0.99999999999 ergibt, dann ist der für 
praktische Zwecke zwar ebenfalls 1, aber er ist einen winzig kleinen 
Bruchteil kleiner als 1.

   int j = result;

wird zu 0.

Tja. Jetzt hast du ein Dilemma: Dem Buchstaben deiner Definition nach, 
ist der zu 0.999999999 gehörende Integer natürlich 0. Ob dir das aber 
klar ist, wenn du 10 mal 0.1 aufsummierst und dann 0 heraus kommt, ist 
eine andere Frage.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und nein:
Floating Point Arithmetik hat das Problem, dass man sich jeden einzelnen 
Fall genau ansehen muss. Es gibt da kein universal gültiges 
Patentrezept.

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay... Vielen Dank für euere schnellen Antworten @ Karl heinz 
Buchegger, danke für die ausfühliche Erklärung, da habe ich in der Tat 
nicht weiter drüber nach gedacht :)... nunja dann währe eventuell runden 
doch eher passend....




Danke und Gruß

Jens

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.