Forum: Compiler & IDEs GCC (WinAVR) Cosinus


von Karheinz (Gast)


Lesenswert?

Hallo,

ist es möglich unter GCC (WinAVR) den Cosinus zur Übersetzungszeit zu 
berechnen?

Die Zeile - f = cos ( Pi / 7 ) ; - führt zum Aufruf der eingebauten 
Cosinusfunktion während der Laufzeit.

Grüße
Karlheinz

von Kai G. (runtimeterror)


Lesenswert?

Ein Compiler könnte das auflösen, da alle Parameter konstant sind und 
keine Seiteneffekte auftreten. Ich unterstelle dennoch, dass der das 
nicht macht/kann.

Interessiert mich aber auch, ob es da eine Lösung zu gibt.

von Bernhard R. (barnyhh)


Lesenswert?

Der C-Compiler weiß nicht, welche Funktion der Linker mit dem Aufruf 
cos() verbindet. Schließlich hindert niemand den Programmierer daran, in 
seiner Laufzeitbibliothek unter dem Namen cos irgend etwas anderes (z.B. 
arcsin) zu verbergen. Dementsprechend kann er die Funktion nicht zur 
Compile-Zeit auflösen.

Falls cos allerdings als intrinsic definiert und so als Bestandteil des 
Compilers implementiert ist, ist eine derartige Optimierung möglich. Das 
Ganze hängt vom jeweiligen C-Compiler ab. In grauer Vorzeit ist mir so 
etwas mal untergekommen (Microsoft oder IBM C-Compiler).

Bernhard

von Karlheinz (Gast)


Lesenswert?

Hallo Bernhard,

danke für Deine Antwort.

Der Compiler 'kennt' die Funktion 'cos', denn er gibt zwei Warnings aus.

sinus.c:10: warning: implicit declaration of function 'cos'
sinus.c:10: warning: incompatible implicit declaration of built-in 
function 'cos'

Grüße
Karlheinz

von OliverSo (Gast)


Lesenswert?

>Der Compiler 'kennt' die Funktion 'cos', denn er gibt zwei Warnings aus.

Dagegen hilft ein
#include <math.h>

Nur bringt das den Compiler leider auch nicht dazu, den cos schon zur 
Compilezeit zu berechenen.

Oliver

von OliverSo (Gast)


Lesenswert?

Und schon haben die gcc-Entwickler reagiert :-)

http://www.heise.de/newsticker/meldung/104888

Ob das allerdings mit der avr-floatlib funktioniert, wissen die Götter.

Oliver

von Luther B. (luther-blissett)


Lesenswert?

Karheinz wrote:
> Hallo,
>
> ist es möglich unter GCC (WinAVR) den Cosinus zur Übersetzungszeit zu
> berechnen?

gcc 4.3 kann das jetzt. Siehe http://gcc.gnu.org/gcc-4.3/changes.html

von Bernhard R. (barnyhh)


Lesenswert?

Hallo Karlheinz
Dieser Compiler kann die cos Funktion halt nicht zur Compilezeit 
berechnen, sondern ausschließlich eine entsprechende Instruktion(sfolge) 
generieren.

Notlösung: selber in Tabelle / Taschenrechner o.ä. nachschauen, 
Konstante benutzen und alles gut kommentieren.

Grüße
Bernhard

von Bernhard R. (barnyhh)


Lesenswert?

Kurze Ergänzung:
Hier http://www.heise.de/newsticker/meldung/104888 .

Zitat:
"Das GCC-Team hat die Version 4.3.0 seiner GNU Compiler Collection 
freigegeben. Sie integriert die MPFR-Bibliothek (multiple-precision 
floating-point computations with correct rounding) mit mathematischen 
Funktionen beliebiger Genauigkeit. Das soll der GCC erlauben, 
Funktionsaufrufe mit konstanten Argumenten gegen das mathematisch 
äquivalente Ergebnis auszutauschen. Optimierungen sind auf diesem Wege 
unabhängig von der Gleitkommabibliothek des Zielsystems bereits zur 
Compile-Zeit möglich."

Im Umkehrschluß bedeutet das:
Diese Optimierungen (z.B Compiler berechnet cos-Funktion bei konstantem 
Argument) werden z.Zt. deshalb nicht durchgeführt, weil Compiler und 
Compilat unterschiedliche Ergebnisse liefern könnten.
Das macht Sinn!

Bernhard

von Luther B. (luther-blissett)


Lesenswert?

OliverSo wrote:
> Und schon haben die gcc-Entwickler reagiert :-)
>
> http://www.heise.de/newsticker/meldung/104888
>
> Ob das allerdings mit der avr-floatlib funktioniert, wissen die Götter.
>
> Oliver
1
$ cat x.c
2
#include <math.h>
3
double foo()
4
{
5
        return cos(M_PI/7);
6
}
7
$ avr-gcc -Os -S x.c
8
$ cat x.s
9
[...]
10
foo:
11
/* prologue: function */
12
/* frame size = 0 */
13
        ldi r22,lo8(0x3f66a5e5)
14
        ldi r23,hi8(0x3f66a5e5)
15
        ldi r24,hlo8(0x3f66a5e5)
16
        ldi r25,hhi8(0x3f66a5e5)
17
/* epilogue start */
18
        ret
19
[...]
20
$ avr-gcc -v
21
Using built-in specs.
22
Target: avr
23
Configured with: ../../source/gcc-4.3.0/configure --prefix=/opt/avr --program-prefix=avr --target=avr --enable-languages=c,c++ --disable-nls --disable-libssp --with-swarf2
24
Thread model: single
25
gcc version 4.3.0 (GCC)

von yalu (Gast)


Lesenswert?

@OliverSo und  Luther Blissett:

Danke für den Hinweis. Der neue Compiler scheint ein paar recht
schicke Features zu haben. Muss ich bei nächster Gelegenheit mal
ausprobieren.

> Ob das allerdings mit der avr-floatlib funktioniert, wissen die
> Götter.

Da der Compiler nicht die Laufzeitbibliothek zum Berechnen der
Ausdrücke benutzt (was bei Crossentwicklung ohnehin nicht möglich
ist), sollte auch AVR-Entwickler in den Genuss des neuen Features
kommen.

Und siehe da: Luther hat gerade gezeigt, dass es tatsächlich geht.

Eine mäßig elegante Lösung des Problems für ältere GCCs bestünde
darin, cos(pi/7) gesteuert durch das Makefile mit einem Rechentool ala
bc zu berechnen und das Ergebnis dem Compiler mit -D als Makro zu
übergeben. Nur mäßig elengant deswegen, weil dadurch ein Teil des
C-Programms effektiv in das Makefile verlagert wird. Dafür braucht für
die Berechnung nicht zum Taschenrechner gegriffen werden, was
besonders dann ein Vorteil ist, wenn sich der zu berechnende Ausdruck
öfter ändert.

Wenn ganze Tabellen mit kompliziert zu berechnenden Inhalten benötigt
werden, können diese auch mittels eines Scripts oder eines weiteren
(C-)Programms als C-Code generiert und anschließend in das eigentliche
Programm eingebunden werden. Die Generierung der Tabelle und ggf. das
Kompilieren des Generatorprogramms kann ebenfalls über das Makefile
gesteuert werden.

> Diese Optimierungen (z.B Compiler berechnet cos-Funktion bei
> konstantem Argument) werden z.Zt. deshalb nicht durchgeführt, weil
> Compiler und Compilat unterschiedliche Ergebnisse liefern könnten.

Unterschiedliche Ergebnisse gibt es mit der neuen Version immer noch.
Allerdings kann garantiert werden, dass durch die Verwendung der MPFR
die vom Compiler ein Ergebnis liefert, das mindestens so genau wie das
der Laufzeitbibliothek ist, so dass für die meisten Anwendungen keine
Nachteile entstehen.

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.