www.mikrocontroller.net

Forum: Compiler & IDEs If-Anweisung mit Gleitkommazahl


Autor: Kaih (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich will einen einen ATMega 2561 programmieren und habe folgende Frage:
Gibt es eine Möglichkeit eine Gleitkommazahl in eine If-Anweisung 
einzusetzen? Oder muss man zuvor die Gleitkommazahl in einen 
ganzzahligen Integer verwandeln?


#include <avr/interrupt.h>
#include <avr/io.h>
#include <stdbool.h>
#include <util/delay.h>
#include <math.h>

int main (void)
{
volatile float Zahl = 1.2;

  while (1)
  {
        if (Zahl>=1.2)
        {
            p1_2++;
        }
  }

return 0;

}
Sobald ich versuche eine Rechenoperation (Multiplikation) mit dem float 
Wert auszuführen, zickt mein AVR-Studio.
Ebenso bei einer Typumwandlung á la " = (int)Zahl"
Die "math.h" Bibliothek ist vorsichtshalber eingebunden..

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

Bewertung
0 lesenswert
nicht lesenswert
Kaih schrieb:
> Hallo,
>
> ich will einen einen ATMega 2561 programmieren und habe folgende Frage:
> Gibt es eine Möglichkeit eine Gleitkommazahl in eine If-Anweisung
> einzusetzen?

Natürlich.
Einfach benutzen.

> Oder muss man zuvor die Gleitkommazahl in einen
> ganzzahligen Integer verwandeln?

Nein


> Sobald ich versuche eine Rechenoperation (Multiplikation) mit dem float
> Wert auszuführen, zickt mein AVR-Studio.

Was genau bedeutet "zickt mein AVR-Studio"

> Die "math.h" Bibliothek ist vorsichtshalber eingebunden..

math.h ist ein Header File. Dessen Verwendung hat erst mal gar nichts 
damit zu tun, dass die Mathe-Bibliothek beim Linken mit eingelinkt wird.

PS: Und was genau hat das ganze mit PC-Programmierung zu tun?

Autor: Kaih (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
naja wird am PC programmiert.


ne fehlermeldung poste ich jetzt aber nicht, sonst könnte ja noch wer 
draufkommen wo das Problem liegt!

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

Bewertung
0 lesenswert
nicht lesenswert
(Nur damit da jetzt kein falschen Verdächtigungen aufkommen.
 Der letzte Kaih ist nicht der originale Kaih)

Autor: Kaih_2 (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ok, falscher Thread, sorry.

Mein AVR Studio geht in den Disassembler rein wenn ich debugge. Zuvor 
sucht er noch 2 Ordner: siehe Anhang.

Btw. dass ich p1.2 nicht deklariert habe ist nicht das problem ;-) (und 
natürlich schon geändert)

Autor: Pete K. (pete77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast Du die float-lib mit eingebunden?

Ansonsten mal mit (Zahl-1.2)>=0 versuchen.

Kann es sein, dass die While-Schleife nicht terminiert und ein 
Stack-Overflow auftritt (je nachdem wie Zahl manipululiert wird)?

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Pete K. schrieb:
> Kann es sein, dass die While-Schleife nicht terminiert und ein
> Stack-Overflow auftritt (je nachdem wie Zahl manipululiert wird)?

Eine Rekursion kann ich hier beim besten Willen nicht erkennen. Und 
natürlich terminiert die äußerste while-Scheife nicht, wie das so üblich 
ist bei uC Programmen...

Autor: U.R. Schmitt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
>> ich will einen einen ATMega 2561 programmieren und habe folgende Frage:
>> Gibt es eine Möglichkeit eine Gleitkommazahl in eine If-Anweisung
>> einzusetzen?
>
> Natürlich.
> Einfach benutzen.

Wobei das Benutzen von Gleitkommazahlen im Falle des 
Gleichheitsoperators nicht danz unkritisch ist. Durch Rundungsfehler 
sind zwei Zahlen ungleich die mit dem gesunden Menschenverstand gleich 
sind. Insofern sollte man vor einem '=' Vergleich zweier Dezimalzahlen 
eine Rundung auf eine Schranke vornehmen ab der man die Zahlen logisch 
als übereinstimmend bewertet. Ansonsten kann man unliebsame 
Überraschungen erleben zumal durch das zur Rechnung benutzte duale 
Zahlensystem auch da Rundungsfehler auftreten wo man sie wegen unserer 
Fixierung auf das Dezimalsystem so gar nicht erwartet.

Autor: Kaih_2 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auch ohne While-Schleife geht er in den Disassembler.
#include <float.h> hat keinen Einfluss.
Der Vorschlag (Zahl-1.2)>=0 will auch nicht :-/

Behandel ich die If-Bedingung mit ganzahligen Werten geht es..

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

Bewertung
0 lesenswert
nicht lesenswert
Dein Problem hat erst mal nichts mit C an sich zu tun, sondern damit wie 
dein Compiler konfiguriert ist, mit welchen Einstellungen compiliert 
wird bzw. was alles zusammengelinkt wird.

Um das Problem lösen zu können, muss man in den Project-Configurations 
suchen. Dort steckt die Lösung zu dem was du siehst und nicht im 
C-Source-Code.

Autor: Kaih_2 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für den Tipp, er hat geholfen: Ich habe die "libc.a" unter Project 
-> Configuration Options -> Libraries hinzugefügt und es hat 
funktioniert.

Es ist vielleicht eine dumme Frage, aber was ist das besondere an dieser 
Bibliothek?

Autor: Michael Schikora (schiko)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>   while (1)
>   {
    Das ist kein atomarer Zugriff, d.h. "Zahl" wird eventuell
    genau dann von Deinem Interrupthandler geändert, während
    der Vergleich noch nicht abgeschlossen ist.
>         if (Zahl>=1.2)
>         {
>             p1_2++;
>         }
>   }


> Sobald ich versuche eine Rechenoperation (Multiplikation) mit dem float
> Wert auszuführen, zickt mein AVR-Studio.

..der Code der im Posting fehlt.
Ist "Zahl" nicht eher global deklariert?

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

Bewertung
0 lesenswert
nicht lesenswert
Hmm
Ich hätte jetzt eigentlich erwartet, dass die libm.a das Problem lösen 
wird. Denn die libc.a (die C-Runtime Library) wird normalerweise vom 
C-Linker sowieso immer mit dazugelinkt.

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.