template-sinus
-
Hallo.
In nem Buch bin ich grade drüber gestolpert, wie man sin/cos etc. zur Compilezeit ausrechnen kann. Das Beispiel anhand des sinus in dem Buch funktioniert natürlich nicht, da non-type Parameter int oder enums sein müssen.
// Serienbildung für sin( R ). // Bei standardgemäßen Compilern bitte double R durch double& R ersetzen template< double R > struct Sinus { enum { MaxTerms = 10 } ; // Erhöhen für mehr Genauigkeit static inline double sin() { return R * Term< R, 0, MaxTerms >::val(); } } ; template< double R, int I, int MaxTerms > struct Term { enum { // Continue ist true, bis wir M Terme ausgewertet haben Continue = I + 1 != MaxTerms, NxtI = ( I + 1 ) * Continue, NxtMaxTerms = MaxTerms * Continue } ; // Rekursive Definition, einmal pro Term aufzurufen static inline double val() { return 1 - R * R / (2.0 * I + 2.0) / (2.0 * I + 3.0) * Term< R * Continue, NxtI, NxtMaxTerms >::val(); } } ; // Spezialisierung, um die Schleife zu terminieren template <> struct Term< 0.0, 0, 0 > { static inline double val() { return 1.0; } } ;Warum hat der Autor das im Buch? Ging das vor C++03 noch? (Das Buch ist aus dem Jahr 2000).
Das kann man doch bestimmt irgendwie umschreiben, dass es trotzdem noch hinhaut, oder?
-
Die Ersetung von double zu double& macht was ganz anderes, als man sich erhofft.
Keine Ahnung, weshalb der Autor das geschrieben hat.
-
Falls dies keine rein akademische Übung ist: So etwas zur Compilezeit auszurechnen, ist eine grundlegende Compileroptimierung von der man immer erwarten darf, dass sie gemacht wird.