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.


  • Mod

    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.


Anmelden zum Antworten