GCC (WinAVR) Cosinus

#808539
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
Gast #808663
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
Gast #808695
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
#808765
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
#808800
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
#808830
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)
Gast #808844
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren