Kein float möglich?

#2634076
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?
Gast #2634102
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
#2634112
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
Gast #2634166
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.

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