All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines
Public Member Functions | Static Public Attributes
QGpCoreTools::Complex Class Reference

#include <Complex.h>

List of all members.

Public Member Functions

double abs () const
double abs2 () const
 Complex (const Complex &c)
 Complex (double re=0, double im=0)
bool fromString (const StringSection &str)
double im () const
bool isNull () const
Complex operator* (const Complex &c) const
Complex operator* (const double &d) const
Complexoperator*= (const Complex &c)
Complexoperator*= (const double &d)
Complex operator+ (const Complex &c) const
Complex operator+ (const double &d) const
Complexoperator+= (const Complex &c)
Complexoperator+= (const double &d)
Complex operator- (const Complex &c) const
Complex operator- (const double &d) const
Complexoperator-= (const Complex &c)
Complexoperator-= (const double &d)
Complex operator/ (const Complex &c) const
Complex operator/ (const double &d) const
Complexoperator/= (const Complex &c)
Complexoperator/= (const double &d)
Complexoperator= (const Complex &c)
Complexoperator= (const double &d)
bool operator== (const Complex &c) const
double phase () const
double re () const
void set (double re, double im)
void setAbs (double fac)
void setExp (double fac, double arg)
void setIm (double im)
void setPhase (double arg)
void setRe (double re)
void setUnitExp (double arg)
QString toString (int precision=6) const
 ~Complex ()

Static Public Attributes

static const Complex null

Detailed Description

Implementation of the complex arithmetics

A useful web site for function of complex numbers is http://staff.jccc.net/swilson/mathtopics/complex/functionsofi.htm


Constructor & Destructor Documentation

QGpCoreTools::Complex::Complex ( const Complex c) [inline]

References values, and vector.

Referenced by operator*(), operator+(), operator-(), and operator/().

{
#ifdef QT_HAVE_SSE
  _data.vector=c._data.vector;
#else
  _data.values.re=c._data.values.re;
  _data.values.im=c._data.values.im;
#endif
}
QGpCoreTools::Complex::Complex ( double  re = 0,
double  im = 0 
) [inline]

References im(), and re().

{
  _data.values.re=re;
  _data.values.im=im;
}
{}

Member Function Documentation

double QGpCoreTools::Complex::abs ( ) const [inline]
double QGpCoreTools::Complex::abs2 ( ) const [inline]

Referenced by QGpCoreTools::abs2(), QGpCoreTools::inverse(), operator/(), QGpCoreTools::operator/(), operator/=(), ArrayCore::FKHorizontal::value(), FKArrayMap::value(), and ArrayCore::FK::value().

{return _data.values.re * _data.values.re + _data.values.im * _data.values.im;}

References QGpCoreTools::StringSection::isValid(), QGpCoreTools::StringSection::nextField(), QGpCoreTools::StringSection::toDouble(), and TRACE.

Referenced by QGpCoreTools::StringSection::toComplex().

{
  TRACE;
  const QChar * ptr=0;
  StringSection f;
  f=str.nextField(ptr);
  if(f.isValid()) _data.values.re=f.toDouble(); else return false;
  f=str.nextField(ptr);
  if(f.isValid()) _data.values.im=f.toDouble(); else return false;
  return true;
}
double QGpCoreTools::Complex::im ( ) const [inline]

Referenced by Complex().

{return _data.values.im;}
bool QGpCoreTools::Complex::isNull ( ) const [inline]

Referenced by QGpCoreTools::ComplexExponential::value().

{return _data.values.re==0 && _data.values.im==0;}
Complex QGpCoreTools::Complex::operator* ( const Complex c) const [inline]
{
  Complex r(*this);
  r*=c;
  return r;
}
Complex QGpCoreTools::Complex::operator* ( const double &  d) const [inline]

References Complex().

{
  return Complex(_data.values.re*d, _data.values.im*d);
}
Complex & QGpCoreTools::Complex::operator*= ( const Complex c) [inline]

References values, and vector.

Referenced by operator/=().

{
#if defined(QT_HAVE_3DNOW) && defined(QT_HAVE_SSE)
  v2df thisIm=__builtin_ia32_shufpd(_data.vector, _data.vector,3);       // Im part of this in both
  v2df thisRe=__builtin_ia32_shufpd(_data.vector, _data.vector,0);       // Re part of this in  both
  // Next two lines not accepted by gcc ?? even with -msse3 option
  //v2df thisIm=__builtin_ia32_movddup(_data.values.im);                    // Im part of this in both
  //v2df thisRe=__builtin_ia32_movddup(_data.values.re);                    // Re part of this in  both
  v2df c_flipped=__builtin_ia32_shufpd(c._data.vector,c._data.vector,1); // Swap re and im parts of c
  _data.vector=__builtin_ia32_addsubpd(__builtin_ia32_mulpd(thisRe, c._data.vector),
                                          __builtin_ia32_mulpd(thisIm, c_flipped));
#elif defined(QT_HAVE_SSE2)
  v2df thisIm=__builtin_ia32_shufpd(_data.vector, _data.vector,3);       // Im part of this in both
  v2df thisRe=__builtin_ia32_shufpd(_data.vector, _data.vector,0);       // Re part of this in both
  v2df c_flipped=__builtin_ia32_shufpd(c._data.vector,c._data.vector,1); // Swap re and im parts of c
  static const union {                                                  // (signbit,0)
    int i[4]; v2df v;
  } signbitlow={{0,0x80000000,0,0}};
  thisIm=__builtin_ia32_xorpd(thisIm, signbitlow.v);                 // Change sign of low
  // Multiply and add:
  _data.vector=__builtin_ia32_mulpd(thisRe, c._data.vector) +
                 __builtin_ia32_mulpd(thisIm, c_flipped);
#else
  double tmpre=_data.values.re * c._data.values.re - _data.values.im * c._data.values.im;
  _data.values.im=_data.values.re * c._data.values.im + _data.values.im * c._data.values.re;
  _data.values.re=tmpre;
#endif
  return *this;
}
Complex & QGpCoreTools::Complex::operator*= ( const double &  d) [inline]
{
#if defined(QT_HAVE_3DNOW) && defined(QT_HAVE_SSE)
  v2df factor=__builtin_ia32_movddup(d);
  __builtin_ia32_mulpd(_data.vector, factor);
#else
  _data.values.re *= d;
  _data.values.im *= d;
#endif
  return *this;
}
Complex QGpCoreTools::Complex::operator+ ( const Complex c) const [inline]

References values, and vector.

{
  Complex r;
#ifdef QT_HAVE_SSE
  r._data.vector=_data.vector+c._data.vector;
#else
  r._data.values.re=_data.values.re+c._data.values.re;
  r._data.values.im=_data.values.im+c._data.values.im;
#endif
  return r;
}
Complex QGpCoreTools::Complex::operator+ ( const double &  d) const [inline]

References Complex().

{
  return Complex(_data.values.re+d, _data.values.im);
}
Complex & QGpCoreTools::Complex::operator+= ( const Complex c) [inline]

References values, and vector.

{
#ifdef QT_HAVE_SSE
  _data.vector+=c._data.vector;
#else
  _data.values.re+=c._data.values.re;
  _data.values.im+=c._data.values.im;
#endif
  return *this;
}
Complex & QGpCoreTools::Complex::operator+= ( const double &  d) [inline]
{
  _data.values.re += d;
  return *this;
}
Complex QGpCoreTools::Complex::operator- ( const Complex c) const [inline]

References values, and vector.

{
  Complex r;
#ifdef QT_HAVE_SSE
  r._data.vector=_data.vector-c._data.vector;
#else
  r._data.values.re=_data.values.re-c._data.values.re;
  r._data.values.im=_data.values.im-c._data.values.im;
#endif
  return r;
}
Complex QGpCoreTools::Complex::operator- ( const double &  d) const [inline]

References Complex().

{
  return Complex(_data.values.re-d, _data.values.im);
}
Complex & QGpCoreTools::Complex::operator-= ( const Complex c) [inline]

References values, and vector.

{
#ifdef QT_HAVE_SSE
  _data.vector -= c._data.vector;
#else
  _data.values.re-=c._data.values.re;
  _data.values.im-=c._data.values.im;
#endif
  return *this;
}
Complex & QGpCoreTools::Complex::operator-= ( const double &  d) [inline]
{
  _data.values.re -= d;
  return *this;
}
Complex QGpCoreTools::Complex::operator/ ( const Complex c) const [inline]

References abs2(), and QGpCoreTools::conjugate().

{
  double m2=c.abs2();
  Complex r(*this);
  r*=conjugate(c);
  r/=m2;
  return r;
}
Complex QGpCoreTools::Complex::operator/ ( const double &  d) const [inline]

References Complex().

{
  return Complex(_data.values.re/d, _data.values.im/d);
}
Complex & QGpCoreTools::Complex::operator/= ( const Complex c) [inline]

References abs2(), QGpCoreTools::conjugate(), and operator*=().

{
  operator*=(conjugate(c));
  operator/=(c.abs2());
  return *this;
}
Complex & QGpCoreTools::Complex::operator/= ( const double &  d) [inline]
{
  double invd=1.0/d;
  _data.values.re*=invd;
  _data.values.im*=invd;
  return *this;
}
Complex & QGpCoreTools::Complex::operator= ( const Complex c) [inline]

References values, and vector.

{
#ifdef QT_HAVE_SSE
  _data.vector=c._data.vector;
#else
  _data.values.re=c._data.values.re;
  _data.values.im=c._data.values.im;
#endif
  return *this;
}
Complex & QGpCoreTools::Complex::operator= ( const double &  d) [inline]
{
  _data.values.re=d;
  _data.values.im=0;
  return *this;
}
bool QGpCoreTools::Complex::operator== ( const Complex c) const [inline]

References values.

{
  return _data.values.re==c._data.values.re && _data.values.im==c._data.values.im;
}
double QGpCoreTools::Complex::phase ( ) const [inline]
double QGpCoreTools::Complex::re ( ) const [inline]

Referenced by Complex().

{return _data.values.re;}
void QGpCoreTools::Complex::set ( double  re,
double  im 
) [inline]

Referenced by GeopsyCore::DoubleSignal::convolution(), and QGpCoreTools::operator>>().

{_data.values.re=re; _data.values.im=im;}
void QGpCoreTools::Complex::setAbs ( double  fac) [inline]
void QGpCoreTools::Complex::setExp ( double  fac,
double  arg 
) [inline]

References QGpCoreTools::cos(), and QGpCoreTools::sin().

  {
    _data.values.re=fac*::cos(arg);
    _data.values.im=fac*::sin(arg);
  }
void QGpCoreTools::Complex::setIm ( double  im) [inline]
void QGpCoreTools::Complex::setPhase ( double  arg) [inline]
void QGpCoreTools::Complex::setRe ( double  re) [inline]
void QGpCoreTools::Complex::setUnitExp ( double  arg) [inline]
QString QGpCoreTools::Complex::toString ( int  precision = 6) const

References TRACE.

Referenced by GeopsyCore::DoubleSignal::convolution(), and QGpCoreTools::Number::toString().

{
  TRACE;
  QString tmp;
  tmp+=QString::number(_data.values.re,'g',precision);
  tmp+=" ";
  tmp+=QString::number(_data.values.im,'g',precision);
  return tmp;
}

Member Data Documentation


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines