2014-04-30 11 views
5

in C++ norm einer komplexen Zahl c ist definiert als abs(c)^2. das bedeutet seine re(c)^2+im(z)^2.std :: norm (std :: komplex) verwendet Quadratwurzel anstelle von schneller Implementierung

dies ist die Umsetzung:

template<bool> 
struct _Norm_helper 
{ 
    template<typename _Tp> 
    static inline _Tp _S_do_it(const complex<_Tp>& __z) 
    { 
     const _Tp __x = __z.real(); 
     const _Tp __y = __z.imag(); 
     return __x * __x + __y * __y; 
    } 
}; 

template<> 
struct _Norm_helper<true> 
{ 
    template<typename _Tp> 
    static inline _Tp _S_do_it(const complex<_Tp>& __z) 
    { 
     _Tp __res = std::abs(__z); 
     return __res * __res; 
    } 
}; 

warum die zweite Implementierung verwendet jemand wollen?

der erste ist deutlich schneller, weil es nicht abs verwendet, wo sqrt beteiligt ist.

+2

'der erste ist deutlich schneller' Haben Sie Timing-Tests durchgeführt, um diesen Anspruch zu bestätigen? – PaulMcKenzie

+0

Die Implementierung wird nicht vom C++ - Standard festgelegt. Welche Standardbibliothek sehen Sie? – juanchopanza

+0

Ich fand es in Mingw, gcc 4.8.1, und ich testete es mit einem Standard-Mandelbrot. – tly

Antwort

2

Da std :: abs-Funktion von einem Benutzer spezialisiert werden kann, wird erwartet, dass Norm sollte eine spezialisierte Version aufrufen. Die spätere Implementierung ruft die Bauchmuskeln des Benutzers auf, der erstere nimmt eine gemeinsame Implementierung an.

+0

Guter Punkt, aber, std :: complex ist ziemlich klar definiert, * nicht * nützlich für T anders als Float, double, long double (und ich kann mich über die letzte falsch sein :-)). Da der OP-Code nur für komplexe gilt, scheint es nicht viel Sinn zu machen, hier für einen komplexen Vorkehrung und dann std :: norm() arbeiten, weil std :: abs() für diesen Typ geliefert wurde . – greggo

+0

Wo ist definiert, um für andere T nicht nützlich zu sein? Ich kann mir viele verschiedene Implementierungen von reellen Zahlen vorstellen, andere als eingebaute – ivg

+0

Ich kann auch, bedeutet nicht, dass std :: complex für sie arbeiten wird :-). Wenn Sie dem vertrauen: http://en.cppreference.com/w/cpp/numeric/complex "Der Effekt der Instanziierung des Vorlagenkomplexes für jeden anderen Typ [jenseits Float, double, long double] ist nicht spezifiziert" – greggo

Verwandte Themen