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
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.
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
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
>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
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
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
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
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
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) |
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.