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