Difference between revisions of "LogZp1oZm1"

From aemwiki
Jump to: navigation, search
m
m
Line 19: Line 19:
 
     for minor speed gains.
 
     for minor speed gains.
 
  Modified 2008 01 11 by Ph. Le Grand:
 
  Modified 2008 01 11 by Ph. Le Grand:
     Reduced some operations for minor speed gains.
+
     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 26: Line 27:
 
  double y(Z.imag());
 
  double y(Z.imag());
 
  double r2=x*x+y*y;  
 
  double r2=x*x+y*y;  
double den(r2+x+x+1.0);
+
 
double add=0.0;
+
  return cmplex(0.5*log(1.0-4.0*x/(r2+x+x+1.0)),
if ((r2)<1.0){
+
        atan2( y+y, r2-1.0 ));   
add=-PI;
 
if (y>=0.0){add=PI;}
 
}
 
  return cmplex(0.5*log(1.0-4.0*x/den),
 
        add+atan( (y+y) /(r2-1.0) ));   
 
 
  }
 
  }

Revision as of 14:55, 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 ));   
}