If-Anweisung mit Gleitkommazahl

Gast #1774064
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..
#1774068
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?
Gast #1774117
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...
Gast #1774121
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.
Gast #1774140
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..
#1774145
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.
Gast #1774163
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?
#1774185
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren