#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=().