mikrocontroller.net

Forum: Compiler & IDEs GCC (WinAVR) Cosinus


Autor: Karheinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bernhard R. (barnyhh)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karlheinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: OliverSo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: OliverSo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Luther Blissett (luther-blissett)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Bernhard R. (barnyhh)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Bernhard R. (barnyhh)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Luther Blissett (luther-blissett)
Datum:

Bewertung
0 lesenswert
nicht 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
$ cat x.c
#include <math.h>
double foo()
{
        return cos(M_PI/7);
}
$ avr-gcc -Os -S x.c
$ cat x.s
[...]
foo:
/* prologue: function */
/* frame size = 0 */
        ldi r22,lo8(0x3f66a5e5)
        ldi r23,hi8(0x3f66a5e5)
        ldi r24,hlo8(0x3f66a5e5)
        ldi r25,hhi8(0x3f66a5e5)
/* epilogue start */
        ret
[...]
$ avr-gcc -v
Using built-in specs.
Target: avr
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
Thread model: single
gcc version 4.3.0 (GCC)

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.