Forum: Compiler & IDEs Kein float möglich?


von Christian R. (cris06)


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?
1
int main(void)
2
{
3
    float test;
4
    float test2;
5
6
    while(1)
7
    {
8
        test = 300 / 200;
9
        test2 = 1 / 2;
10
    }
11
}
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?

von Lasse S. (cowz) Benutzerseite


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

von ax (Gast)


Lesenswert?

test = 300 *(100) / 200;

ergebnis 1(.)50
o wunder der ?Technik

von Christian R. (cris06)


Lesenswert?

Ja klar, aber bei float müste es mir jaKommastellen anzeigen oder bin 
ich jetzt blöd?

von Krapao (Gast)


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

von Mike R. (thesealion)


Lesenswert?

Ohne böse zu sein:

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

von Oliver (Gast)


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

von Christian R. (cris06)


Lesenswert?

1
test = (float) 1 / 2;  //klappt
2
test = 1.0 / 2.0;      //klappt
3
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

von Simon H. (simi)


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

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Rolf Magnus (Gast)


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

von Krapao (Gast)


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)

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.