www.mikrocontroller.net

Forum: GCC Kein float möglich?


Important announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Christian R. (cris06)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Hallo,

ich programmiere unter AVR Studio 5 und habe ein Problem.

Ich habe ein einfaches Testprogramm geschrieben, aber es klappt einfach 
nicht, gibt es irgendwo ne Einstellung die dafür zuständig ist?
int main(void)
{
    float test;
    float test2;

    while(1)
    {
        test = 300 / 200;
        test2 = 1 / 2;
    }
}
Das ganze lasse ich durch den Simulator laufen und was kommt bei raus?

test = 1;
test2 = 0;

Optimierung ist aus.

Jemand ne Idee, wie ich die Kommazahlen hinbekomme?

Autor: Lasse S. (cowz) Benutzerseite
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Die Berechnungen führst du als int aus. Versuch's mal mit

((float)300)/200


Aber: Floats auf nem AVR ist eher schlecht.

Gruß
Lasse

Autor: ax (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
test = 300 *(100) / 200;

ergebnis 1(.)50
o wunder der ?Technik

Autor: Christian R. (cris06)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Ja klar, aber bei float müste es mir jaKommastellen anzeigen oder bin 
ich jetzt blöd?

Autor: Krapao (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
test = 300f / 200;
oder
        test = 300.0 / 200;
oder
        test = ((float) 300) / 200;
oder
        test = 300 / 200f;
oder
        test = 300 / 200.0;
oder
        test = 300 / (float) 200;
oder
        test = 300f / 200f;
...

Autor: Mike S. (thesealion)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Ohne böse zu sein:

Such dir mal ein Buch über C-Grundlagen, das ist eins der typischen
C Probleme, die immer auftreten.

Autor: Oliver (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
300 ist eine Integer-Konstamte. 200 ist auch eine Integer-Konstante. 
Also rechnet der Compiler brav die Division in Integer, und wandelt erst 
danach das Ergebnis nach float. Das ist so im C-Standard definiert.

Möchtest du die Division in float durchführen lassen, muß mindestens 
einer der Faktoren ein float sein. Float-Konstanten in C sind als 
Zahlenwerte mit Dezimalpunkt definiert.

Also tut

>test = 300.0 / 200.0;

das, was du erwartest.

Oliver

Autor: Christian R. (cris06)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
test = (float) 1 / 2;  //klappt
test = 1.0 / 2.0;      //klappt
test = 1f / 2f;        // Fehlermeldung:invalid suffix "f" on integer constant

Schonmal vielen dank :)
Jetzt noch die Fehlermeldung weg und ich bin Glücklich, weil die dritte 
Variante wäre meine favorisierte Schreibweise :D

Autor: Simon Huwyler (simi)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Cris R. schrieb:
> Ja klar, aber bei float müste es mir jaKommastellen anzeigen oder bin
> ich jetzt blöd?

Nein, Du bist nicht blöd. Aber Du denkst anders als der Compiler. Du 
weisst, dass test ein Float ist. Also soll doch bitte der Compiler 
300/200 auch mit 300 als float und mit 200 als float berechnen.

Fakt ist aber: Dem Compiler ist schnurzegal, was test für einen Typ hat. 
Er rechnet 300/200 als int, weil nämlich sowohl 300 als auch 200 a 
priori mal int sind (der Compiler nimmt einfach mal an, es seien int, 
weil sie ja ganzzahlig sind.

So. Er kommt also folgerichtig auf 1.

Und jetzt schreibt er eine 1 in die Variable test. Natürlich macht er 
zuvor brav die Typenumwandlung. 1 wird also zu 1.0

Gruäss
Simon

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Cris R. schrieb:
> Jetzt noch die Fehlermeldung weg und ich bin Glücklich, weil die dritte
> Variante wäre meine favorisierte Schreibweise :D

Die gibt es nicht. Float-Konstanten werden mit Dezimalpunkt geschrieben.

Autor: Rolf Magnus (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Cris R. schrieb:
> test = (float) 1 / 2;  //klappt

Wandelt die 1 nach float. Die Regeln legen fest, daß dann der andere 
auch nach float konvertiert wird und damit die Berechnung in float 
druchgeführt wird.

> test = 1.0 / 2.0;      //klappt

Hier sind beide Operanden vom Typ double, also wird auch die Berechnung 
in double durchgeführt und das Ergebnis nachher nach float reduziert 
(wobei speziell auf dem AVR double das gleiche wie float ist)

> test = 1f / 2f;        // Fehlermeldung:invalid suffix "f" on integer constant
>
> Schonmal vielen dank :)
> Jetzt noch die Fehlermeldung weg und ich bin Glücklich, weil die dritte
> Variante wäre meine favorisierte Schreibweise :D

Wie der Compiler schon sagt: 1 ist eine Integer-Konstante, und der 
kannst du keinen float-Suffix geben. So würde es gehen;
test = 1.f / 2.f;

denn 1. ist eine floatingpoint-Konstante vom Typ double. Das f sagt 
dann, daß statt double der Typ float sein soll.

Autor: Krapao (Gast)
Datum:

Diesen Beitrag bewerten:
lesenswert
nicht lesenswert
Sorry für die Verwirrung, die ich mit meinem Fehler beim 
floating-suffix gestiftet habe.

1 ist ein integer Wert, 1.0 ist ein double Wert. 1.0f ist ein 
float Wert.

Der optionale floating-suffix 
(http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf 6.4.4.2 
Floating constants) setzt voraus, dass ein Dezimalpunkt vorhanden ist.

test = 300.f/200 geht (test = 300./200 geht auch)

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




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 erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net