Difference between revisions of "LogZp1oZm1"
From aemwiki
Analytophile (talk | contribs) (revised summary of speedup, changed y=0 to y>=0 for consistency with c++ complex library) |
m |
||
(2 intermediate revisions by 2 users not shown) | |||
Line 18: | Line 18: | ||
member functions of Z and reduce number of operations | member functions of Z and reduce number of operations | ||
for minor speed gains. | for minor speed gains. | ||
+ | Modified 2008 01 11 by Ph. Le Grand: | ||
+ | Reduced some operations for minor speed gains, | ||
+ | used atan2, for speed and reduction of logic. | ||
-------------------------------------------------------------------------------*/ | -------------------------------------------------------------------------------*/ | ||
inline cmplex logZm1oZp1(const cmplex &Z) | inline cmplex logZm1oZp1(const cmplex &Z) | ||
Line 24: | Line 27: | ||
double y(Z.imag()); | double y(Z.imag()); | ||
double r2=x*x+y*y; | double r2=x*x+y*y; | ||
− | + | ||
− | + | return cmplex(0.5*log(1.0-4.0*x/(r2+x+x+1.0)), | |
− | + | atan2( y+y, r2-1.0 )); | |
− | |||
− | |||
− | |||
− | return cmplex(0.5*log(1.0-( | ||
− | |||
} | } |
Latest revision as of 14:56, 12 January 2008
- Language
- c++
- Purpose
- Calculates <math>\ln\left(\frac{Z-1}{Z+1}\right)</math>
- Author
- James R. Craig, Ph. Le Grand
#include <math.h> #include <complex> typedef std::complex<double> cmplex; const double PI=3.141592653589793238462643; // pi /******************************************************************************* logZm1oZp1 optimized version of log ((Z-1.0)/(Z+1.0)): ~13% of the cost of a direct call- 1 order of magnitude speedup! Author: James R. Craig Modified 2007 12 06 by Ph. Le Grand: Added local variables x,y,r2 to reduce number of calls to member functions of Z and reduce number of operations for minor speed gains. Modified 2008 01 11 by Ph. Le Grand: Reduced some operations for minor speed gains, used atan2, for speed and reduction of logic. -------------------------------------------------------------------------------*/ inline cmplex logZm1oZp1(const cmplex &Z) { double x(Z.real()); double y(Z.imag()); double r2=x*x+y*y; return cmplex(0.5*log(1.0-4.0*x/(r2+x+x+1.0)), atan2( y+y, r2-1.0 )); }