Forum: Compiler & IDEs If-Anweisung mit Gleitkommazahl


von Kaih (Gast)


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 User
von Karl H. (kbuchegg)


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?

von Kaih (Gast)


Lesenswert?

naja wird am PC programmiert.


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

von Karl H. (kbuchegg)


Lesenswert?

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

von Kaih_2 (Gast)


Angehängte Dateien:

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)

von Pete K. (pete77)


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)?

von Klaus (Gast)


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

von U.R. Schmitt (Gast)


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.

von Kaih_2 (Gast)


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

von Karl H. (kbuchegg)


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.

von Kaih_2 (Gast)


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?

von Michael S. (schiko)


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?

von Karl H. (kbuchegg)


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.

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
Noch kein Account? Hier anmelden.