Datum:
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?
Datum:
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
Datum:
test = 300 *(100) / 200; ergebnis 1(.)50 o wunder der ?Technik
Datum:
Ja klar, aber bei float müste es mir jaKommastellen anzeigen oder bin ich jetzt blöd?
Datum:
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;
...
Datum:
Ohne böse zu sein: Such dir mal ein Buch über C-Grundlagen, das ist eins der typischen C Probleme, die immer auftreten.
Datum:
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
Datum:
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
Datum:
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
Datum:
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.
Datum:
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.
Datum:
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)



