#include <Complex.h>
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 |
Complex & | operator*= (const Complex &c) |
Complex & | operator*= (const double &d) |
Complex | operator+ (const Complex &c) const |
Complex | operator+ (const double &d) const |
Complex & | operator+= (const Complex &c) |
Complex & | operator+= (const double &d) |
Complex | operator- (const Complex &c) const |
Complex | operator- (const double &d) const |
Complex & | operator-= (const Complex &c) |
Complex & | operator-= (const double &d) |
Complex | operator/ (const Complex &c) const |
Complex | operator/ (const double &d) const |
Complex & | operator/= (const Complex &c) |
Complex & | operator/= (const double &d) |
Complex & | operator= (const Complex &c) |
Complex & | operator= (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 |
Implementation of the complex arithmetics
A useful web site for function of complex numbers is http://staff.jccc.net/swilson/mathtopics/complex/functionsofi.htm
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] |
QGpCoreTools::Complex::~Complex | ( | ) | [inline] |
{}
double QGpCoreTools::Complex::abs | ( | ) | const [inline] |
References QGpCoreTools::abs2(), and QGpCoreTools::sqrt().
Referenced by QGpCoreTools::abs(), SciFigs::ComplexStatisticalProxy::columnValue(), QGpCoreTools::log(), QGpCoreTools::sqrt(), QGpCoreTools::ComplexPointOptions::toDouble(), QGpCoreWave::MagnetoTelluricPointOptions::toDouble(), QGpCoreTools::Number::toDouble(), and ArrayCore::HRFK::value().
{return ::sqrt(abs2());}
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;}
bool QGpCoreTools::Complex::fromString | ( | const StringSection & | str | ) |
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 r(*this); r*=c; return r; }
Complex QGpCoreTools::Complex::operator* | ( | const double & | d | ) | const [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 double & | d | ) | const [inline] |
Complex & QGpCoreTools::Complex::operator+= | ( | const double & | d | ) | [inline] |
{ _data.values.re += d; return *this; }
Complex QGpCoreTools::Complex::operator- | ( | const double & | d | ) | const [inline] |
Complex & QGpCoreTools::Complex::operator-= | ( | const double & | d | ) | [inline] |
{ _data.values.re -= d; return *this; }
References abs2(), and QGpCoreTools::conjugate().
Complex QGpCoreTools::Complex::operator/ | ( | const double & | d | ) | const [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 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] |
Referenced by SciFigs::ComplexStatisticalProxy::columnValue(), QGpCoreTools::log(), GeopsyCore::DoubleSignal::phase(), QGpCoreTools::sqrt(), QGpCoreTools::ComplexPointOptions::toDouble(), and QGpCoreWave::MagnetoTelluricPointOptions::toDouble().
{return atan2(_data.values.im, _data.values.re);}
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>>().
void QGpCoreTools::Complex::setAbs | ( | double | fac | ) | [inline] |
void QGpCoreTools::Complex::setExp | ( | double | fac, |
double | arg | ||
) | [inline] |
References QGpCoreTools::cos(), and QGpCoreTools::sin().
void QGpCoreTools::Complex::setIm | ( | double | im | ) | [inline] |
Referenced by QGpCoreWave::MagnetoTelluricFactory::calculate(), QGpCoreTools::ComplexPointOptions::fromDouble(), QGpCoreWave::MagnetoTelluricPointOptions::fromDouble(), QGpCoreTools::StringSection::nextNumber(), SciFigs::ComplexStatisticalProxy::parse(), and SciFigs::ComplexStatisticalProxy::setColumnValue().
{_data.values.im=im;}
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; }
double QGpCoreTools::Complex::im |
Referenced by SciFigs::ComplexStatisticalProxy::columnValue(), QGpCoreTools::conjugate(), GeopsyCore::DoubleSignal::convolution(), QGpCoreTools::cos(), QGpCoreTools::exp(), QGpCoreTools::inverse(), QGpCoreTools::operator*(), QGpCoreTools::operator-(), QGpCoreTools::operator<<(), GeopsyCore::DoubleSignal::setComplex(), GeopsyCore::DoubleSignal::shift(), QGpCoreTools::sin(), QGpCoreTools::ComplexPointOptions::toDouble(), QGpCoreWave::MagnetoTelluricPointOptions::toDouble(), and PhaseShifter::value().
const Complex QGpCoreTools::Complex::null [static] |
double QGpCoreTools::Complex::re |
Referenced by QGpCoreWave::MagnetoTelluricFactory::calculate(), SciFigs::ComplexStatisticalProxy::columnValue(), QGpCoreTools::conjugate(), GeopsyCore::DoubleSignal::convolution(), QGpCoreTools::cos(), QGpCoreTools::exp(), ArrayCore::HRFK::initOperator(), QGpCoreTools::inverse(), QGpCoreTools::operator*(), QGpCoreTools::operator-(), QGpCoreTools::operator<<(), GeopsyCore::DoubleSignal::setComplex(), GeopsyCore::DoubleSignal::shift(), QGpCoreTools::sin(), QGpCoreTools::ComplexPointOptions::toDouble(), QGpCoreWave::MagnetoTelluricPointOptions::toDouble(), and PhaseShifter::value().
struct { ... } QGpCoreTools::Complex::values |
Referenced by Complex(), operator*=(), operator+(), operator+=(), operator-(), operator-=(), operator=(), and operator==().
Referenced by Complex(), operator*=(), operator+(), operator+=(), operator-(), operator-=(), and operator=().