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.
'der erste ist deutlich schneller' Haben Sie Timing-Tests durchgeführt, um diesen Anspruch zu bestätigen? – PaulMcKenzie
Die Implementierung wird nicht vom C++ - Standard festgelegt. Welche Standardbibliothek sehen Sie? – juanchopanza
Ich fand es in Mingw, gcc 4.8.1, und ich testete es mit einem Standard-Mandelbrot. – tly