Forum: Compiler & IDEs -Os fabs() WinAVR 20100110 falscher Code


von St. S. (clean-energy)


Lesenswert?

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
von (prx) A. K. (prx)


Lesenswert?

-lm angegeben?

Ansonsten: Übersetzbaren Testcase bauen. Normal ist das natürlich nicht 
aber mit deinem Beispiel kann man nichts anfangen.

von Klaus W. (mfgkw)


Lesenswert?

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.

von Yalu X. (yalu) (Moderator)


Lesenswert?

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

von Yalu X. (yalu) (Moderator)


Lesenswert?

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

von Thomas R. (tinman) Benutzerseite


Lesenswert?

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.

von (prx) A. K. (prx)


Lesenswert?

Solange er keinen entsprechenden Code rausrückt halte ich eine weitere 
Diskussion für sinnlos.

von St. S. (clean-energy)


Lesenswert?

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
Noch kein Account? Hier anmelden.