Kein float möglich?

OP #2634076
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 #2634089
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;
...
Gast #2634102
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
OP #2634108
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
#2634112
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
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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.