Hallo, ich habe gerade festgestellt, dass bei der Verwendung von floats das Ergebnis von der Optimierungstiefe abhängt (-Os --> liefert falschen Code | -O3 --> Code läuft) BSP: #include <math.h> #include <stdio.h> . . . float var1 = 10.1; float var2 = 10.2; if ((fabs(var1-var2)>0.2)) { } Der Ausdruck ist false bei -O3, jedoch true für -Os... Ist dieses Verhalten normal oder mache ich etwas falsch? Vielen Dank im Voraus! Beste Grüße,
:
Verschoben durch Admin
-lm angegeben? Ansonsten: Übersetzbaren Testcase bauen. Normal ist das natürlich nicht aber mit deinem Beispiel kann man nichts anfangen.
Ich habe hier avr-gcc version 4.3.2 und damit geht dein Beispiel bei mir sowohl mit -Os als auch -O3 gleichermaßen und korrekterweise NICHT in den if-Zweig.
Für folgendes Programmmodul
1 | #include <math.h> |
2 | |
3 | float var1 = 10.1; |
4 | float var2 = 10.2; |
5 | char x; |
6 | |
7 | void sub(void) { |
8 | if ((fabs(var1-var2)>0.2)) |
9 | x = 1; |
10 | }
|
ist bei den Compilerversionen 4.2.4, 4.3.4 und 4.4.2 das Ergebnis (erzeugter Assemblercode) unabhängig davon, ob mit -Os oder -O3 optimiert wird. Der fabs-Aufruf wird jedesmal als
1 | andi r25,0x7f |
also als Löschen des Vorzeichenbits der FP-Zahl übersetzt. Der Fehler liegt damit eindeutig innerhalb der Zeilen 3 bis 5 in deinem oben geposteten Programmbeispiel, die ich in meinem Test aus syntakti- schen Gründen weggelassen habe ;-)
> ... > ist bei den Compilerversionen 4.2.4, 4.3.4 und 4.4.2 das Ergebnis > (erzeugter Assemblercode) unabhängig davon, ob mit -Os oder -O3 > optimiert wurde. ... Ich sehe gerade, dass der GCC 4.4.2 seit zwei Monaten nicht mehr aktuell ist. Update .../^H-^H\^H|^H/^H-^H\^H| Fertig. Aber für 4.4.3 gilt das oben Geschriebene ebenso. Und in WinAVR 20100110 steckt, der Versionsnummer nach zu urteilen, sowieso noch eine ältere GCC-Version.
St S. schrieb: > > Der Ausdruck ist false bei -O3, jedoch true für -Os... > bei mir läuft auch mit WinAVR 20100110, es muss noch etwas in deinem code sein.
Solange er keinen entsprechenden Code rausrückt halte ich eine weitere Diskussion für sinnlos.
Vielen Dank für eure Hilfe. Hab jetzt Winavr nochmal neu installiert (Verzweiflungstat). Jetzt läuft es...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.