📄 cx.h
字号:
//$ cx.h complex numbers definition file// "WHAT THE STANDARD SHOULD HAVE BEEN LIKE"#ifndef CX_LIB#define CX_LIB#include "include.h"#include "boolean.h"#include "myexcept.h"#ifdef use_namespacenamespace RBD_COMPLEX { using namespace RBD_COMMON; }namespace RBD_LIBRARIES { using namespace RBD_COMPLEX; }namespace RBD_COMPLEX {#endifclass ConvertFromReal; // used for stopping conversions by a constructorclass ImaginaryUnit; // i or j in complex algebraclass CX; // complex classclass Imag; // pure imaginary numbersclass Polar; // imaginary in polar coordinatesclass Quadrant; // mod 4 arithmeticextern Real pi, pi_times_2, pi_over_2, pi_over_4;Real ipow(Real x, int n); // if pow with integer n isn't availableclass ConvertFromReal{ Real CFR;public: ConvertFromReal(Real cfr) : CFR(cfr) {} Real Value() const { return CFR; }};class ImaginaryUnit{public: Real operator*(ImaginaryUnit) { return -1.0; } Real operator/(ImaginaryUnit) { return 1.0; } ImaginaryUnit operator+(); Imag operator-(); bool operator==(ImaginaryUnit) { return true; } bool operator!=(ImaginaryUnit) { return false; } friend bool operator==(Real, ImaginaryUnit) { return false; } friend bool operator!=(Real, ImaginaryUnit) { return true; } friend bool operator==(ImaginaryUnit, Real) { return false; } friend bool operator!=(ImaginaryUnit, Real) { return true; }};extern ImaginaryUnit _I_; // what is usually written as i or jclass CX{ Real X; Real Y;public: CX(Real x1, Real y1) : X(x1), Y(y1) {} CX(Real x1) : X(x1), Y(0) {} CX() {} CX(const CX& z) : X(z.X), Y(z.Y) {} CX(ImaginaryUnit) : X(0.0), Y(1.0) {} CX(Imag y); CX(const Polar& p); void operator=(const CX& z1) { X = z1.X; Y = z1.Y; } void operator=(Real x1) { X = x1; Y = 0.0; } void operator=(ImaginaryUnit) { X = 0; Y = 1; } void operator=(Imag y); void operator=(const Polar& p); Real real() const { return X; } Real imag() const { return Y; } Real& real() { return X; } Real& imag() { return Y; } Imag imag_as_imag() const; CX conj() const { return CX(X,-Y); } CX operator+() const { return *this; } CX operator-() const { return CX(-X,-Y); } Real cabs() const; Real arg() const; Real sum_square() const { return X * X + Y * Y; } friend CX operator*(const CX& z1, const CX& z2); friend CX operator/(const CX& z1, const CX& z2); friend CX operator+(const CX& z1, const CX& z2); friend CX operator-(const CX& z1, const CX& z2); friend CX operator*(const CX& z1, Real x2); friend CX operator/(const CX& z1, Real x2); friend CX operator+(const CX& z1, Real x2); friend CX operator-(const CX& z1, Real x2); friend CX operator*(Real x1, const CX& z2); friend CX operator/(Real x1, const CX& z2); friend CX operator+(Real x1, const CX& z2); friend CX operator-(Real x1, const CX& z2); friend CX operator*(const CX& z1, ImaginaryUnit); friend CX operator/(const CX& z1, ImaginaryUnit); friend CX operator+(const CX& z1, ImaginaryUnit); friend CX operator-(const CX& z1, ImaginaryUnit); friend CX operator*(ImaginaryUnit, const CX& z2); friend CX operator/(ImaginaryUnit, const CX& z2); friend CX operator+(ImaginaryUnit, const CX& z2); friend CX operator-(ImaginaryUnit, const CX& z2); friend CX operator*(const CX& z1, Imag y2); friend CX operator/(const CX& z1, Imag y2); friend CX operator+(const CX& z1, Imag y2); friend CX operator-(const CX& z1, Imag y2); friend CX operator*(Imag y1, const CX& z2); friend CX operator/(Imag y1, const CX& z2); friend CX operator+(Imag y1, const CX& z2); friend CX operator-(Imag y1, const CX& z2); friend bool operator==(const CX& z1, const CX& z2); friend bool operator==(Real r1, const CX& z2); friend bool operator==(Imag y1, const CX& z2); friend bool operator==(ImaginaryUnit, const CX& z2); friend bool operator==(const CX& z1, Real r2); friend bool operator==(const CX& z1, Imag y2); friend bool operator==(const CX& z1, ImaginaryUnit); void operator*=(const CX& z1) { Real t = X; X = X*z1.X-Y*z1.Y; Y = t*z1.Y+Y*z1.X; } void operator/=(const CX& z1) { *this = *this/z1; } void operator+=(const CX& z1) { X += z1.X; Y += z1.Y; } void operator-=(const CX& z1) { X -= z1.X; Y -= z1.Y; } void operator*=(Real x1) { X *= x1; Y *= x1; } void operator/=(Real x1) { X /= x1; Y /= x1; } void operator+=(Real x1) { X += x1; } void operator-=(Real x1) { X -= x1; } void operator*=(ImaginaryUnit) { Real t = X; X = -Y; Y = t; } void operator/=(ImaginaryUnit) { Real t = X; X = Y; Y = -t; } void operator+=(ImaginaryUnit) { Y += 1; } void operator-=(ImaginaryUnit) { Y -= 1; } void operator*=(Imag y); void operator/=(Imag y); void operator+=(Imag y); void operator-=(Imag y); void operator*=(const Polar& p1); void operator/=(const Polar& p1); void operator+=(const Polar& p1); void operator-=(const Polar& p1); friend CX exp(const CX&); friend CX log(const CX&); friend Polar polar_exp(const CX&); friend Real norm1(const CX& z) { return ::fabs(z.X) + ::fabs(z.Y); } friend CX sqrt(const CX&); friend CX square(const CX& z) { return CX(z.X * z.X - z.Y * z.Y, 2 * z.X * z.Y); } friend CX pow(const CX& z1, int n2); friend CX pow(const CX& z1, Real r2); friend CX pow(const CX& z1, Imag y2); friend CX pow(const CX& z1, const CX& z2); friend CX pow(Real r1, const CX& z2); friend CX pow(Imag y1, const CX& z2); friend Polar pow(const Polar& p1, const CX& z2); friend CX sin(const CX&); friend CX cos(const CX&); friend CX tan(const CX&); friend CX sinh(const CX&); friend CX cosh(const CX&); friend CX tanh(const CX&); friend class Imag; friend class Polar;};class Imag{ Real Y;// Imag(Real z) : Y(z) {}public: Imag(ConvertFromReal x) : Y(x.Value()) {} Imag(const Imag& z) : Y(z.Y) {} Imag() {} Imag(ImaginaryUnit) : Y(1.0) {} void operator=(const Imag& y1) { Y = y1.Y; } void operator=(ImaginaryUnit) { Y = 1.0; } Real real() const { return 0; } Real imag() const { return Y; } Real& imag() { return Y; } Imag imag_as_imag() const { return *this; } Imag conj() const { return Imag(-Y); } Imag operator+() const { return Imag(Y); } Imag operator-() const { return Imag(-Y); } Real cabs() const { return ::fabs(Y); } Real arg() const; Real sum_square() const { return Y * Y; } friend Imag operator*(Real x1, ImaginaryUnit); friend Imag operator/(Real x1, ImaginaryUnit); friend Imag operator*(ImaginaryUnit, Real x2); friend Imag operator/(ImaginaryUnit, Real x2); friend Imag operator+(ImaginaryUnit, ImaginaryUnit); friend Real operator*(Imag y1, Imag y2); friend Real operator/(Imag y1, Imag y2); friend Imag operator+(Imag y1, Imag y2); friend Imag operator-(Imag y1, Imag y2); friend Imag operator*(Imag y1, Real x2); friend Imag operator/(Imag y1, Real x2); friend CX operator+(Imag y1, Real x2); friend CX operator-(Imag y1, Real x2); friend Imag operator*(Real x1, Imag y2); friend Imag operator/(Real x1, Imag y2); friend CX operator+(Real x1, Imag y2); friend CX operator-(Real x1, Imag y2); friend CX operator*(const CX& z1, Imag y2); friend CX operator/(const CX& z1, Imag y2); friend CX operator+(const CX& z1, Imag y2); friend CX operator-(const CX& z1, Imag y2); friend CX operator*(Imag y1, const CX& z2); friend CX operator/(Imag y1, const CX& z2); friend CX operator+(Imag y1, const CX& z2); friend CX operator-(Imag y1, const CX& z2); friend Real operator*(Imag y1, ImaginaryUnit); friend Real operator/(Imag y1, ImaginaryUnit); friend Imag operator+(Imag y1, ImaginaryUnit); friend Imag operator-(Imag y1, ImaginaryUnit); friend Real operator*(ImaginaryUnit, Imag y2); friend Real operator/(ImaginaryUnit, Imag y2); friend Imag operator+(ImaginaryUnit, Imag y2); friend Imag operator-(ImaginaryUnit, Imag y2); friend Polar operator*(const Polar& p1, Imag y2); friend Polar operator/(const Polar& p1, Imag y2); friend Polar operator*(Imag y1, const Polar& p2); friend Polar operator/(Imag y1, const Polar& p2); friend bool operator==(Imag y1, Imag y2); friend bool operator==(Real r1, Imag y2); friend bool operator==(const CX& z1, Imag y2); friend bool operator==(const Polar& p1, Imag y2); friend bool operator==(ImaginaryUnit, Imag y2); friend bool operator==(Imag y1, const CX& z2); friend bool operator==(Imag y1, const Polar& p2); friend bool operator==(Imag y1, Real r2); friend bool operator==(Imag y1, ImaginaryUnit); void operator*=(Real x1) { Y *= x1; } void operator/=(Real x1) { Y /= x1; } void operator+=(Imag z) { Y += z.Y; } void operator-=(Imag z) { Y -= z.Y; } void operator+=(ImaginaryUnit) { Y += 1; } void operator-=(ImaginaryUnit) { Y -= 1; } friend CX exp(Imag); friend CX log(Imag); friend Polar polar_exp(Imag z); friend CX sqrt(Imag y); friend Real square(const Imag& y) { return - y.Y * y.Y; } friend CX pow(Imag y1, int n2); friend CX pow(Imag y1, Real r2); friend CX pow(Imag y1, Imag y2); friend CX pow(Real r1, Imag y2); friend Imag sin(Imag y) { return Imag(::sinh(y.Y)); } friend Real cos(Imag y) { return ::cosh(y.Y); } friend Imag tan(Imag y) { return Imag(::tanh(y.Y)); } friend Imag sinh(Imag y) { return Imag(::sin(y.Y)); } friend Real cosh(Imag y) { return ::cos(y.Y); } friend Imag tanh(Imag y) { return Imag(::tan(y.Y)); } friend class CX; friend class Polar;};inline ImaginaryUnit ImaginaryUnit::operator+() { return _I_; }inline Imag ImaginaryUnit::operator-() { return Imag(-1); }inline Real real(const CX& z) { return z.real(); }inline Real imag(const CX& z) { return z.imag(); }inline Imag imag_as_imag(const CX& z) { return z.imag_as_imag(); }inline CX conj(const CX& z) { return z.conj(); }inline Real cabs(const CX& z) { return z.cabs(); }inline Real fabs(const CX& z) { return z.cabs(); }inline Real arg(const CX& z) { return z.arg(); }inline Real sum_square(const CX& z) { return z.sum_square(); }inline Real real(Imag y) { return y.real(); }inline Real imag(Imag y) { return y.imag(); }inline Imag imag_as_imag(const Imag y) { return y; }inline Imag conj(Imag y) { return y.conj(); }inline Real cabs(Imag y) { return y.cabs(); }inline Real fabs(Imag y) { return y.cabs(); }inline Real arg(Imag y) { return y.arg(); }inline Real sum_square(Imag y) { return y.sum_square(); }// Real OP CXinline CX operator*(Real x1, const CX& z2) { return CX(x1*z2.X, x1*z2.Y); }// CX operator/(Real x1, const CX& z2);inline CX operator+(Real x1, const CX& z2) { return CX(x1+z2.X, z2.Y); }inline CX operator-(Real x1, const CX& z2) { return CX(x1-z2.X, -z2.Y); }// Real OP Imaginline Imag operator*(Real x1, Imag y2) { return Imag(x1*y2.Y); }inline Imag operator/(Real x1, Imag y2) { return Imag(-x1/y2.Y); }inline CX operator+(Real x1, Imag y2) { return CX(x1, y2.Y); }inline CX operator-(Real x1, Imag y2) { return CX(x1, -y2.Y); }// Real OP ImaginaryUnitinline Imag operator*(Real x1, const ImaginaryUnit) { return Imag(x1); }inline Imag operator/(Real x1, const ImaginaryUnit) { return Imag(-x1); }inline CX operator+(Real x1, const ImaginaryUnit) { return CX(x1, 1); }inline CX operator-(Real x1, const ImaginaryUnit) { return CX(x1, -1); }// CX OP Realinline CX operator*(const CX& z1, Real x2) { return CX(z1.X*x2, z1.Y*x2); }inline CX operator/(const CX& z1, Real x2) { return CX(z1.X/x2, z1.Y/x2); }inline CX operator+(const CX& z1, Real x2) { return CX(z1.X+x2, z1.Y); }inline CX operator-(const CX& z1, Real x2) { return CX(z1.X-x2, z1.Y); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -