📄 jclcomplex.pas
字号:
var
NewComplex: TJclComplex;
begin
NewComplex := TJclComplex.Create(X, Y, ComplexType);
try
Result := CNewPwr(NewComplex);
finally
NewComplex.Free;
end;
end;
function TJclComplex.CoreIntPwr(First: TRectCoord; const Polar: TRectCoord; const Pwr: Integer): TRectCoord;
begin
First.X := MiscalcSingle(First.X);
First.Y := MiscalcSingle(First.Y);
if AbsoluteValueSqr(First) = 0.0 then
if Pwr = 0 then
Result := RectOne
else
Result := RectZero
else
Result := RectCoord(PowerInt(Polar.X, Pwr), NormalizeAngle(Pwr * Polar.Y));
end;
function TJclComplex.CIntPwr(const Pwr: Integer): TJclComplex;
var
ResValue: TRectCoord;
begin
FillCoords(crRectangular);
ResValue := CoreIntPwr(RectCoord(Self), RectCoord(FCoord.R, FCoord.Theta), Pwr);
FCoord.R := ResValue.X;
FCoord.Theta := ResValue.Y;
FillCoords(crPolar);
Result := Self;
end;
function TJclComplex.CNewIntPwr(const Pwr: Integer): TJclComplex;
var
ResValue: TRectCoord;
begin
FillCoords(crRectangular);
ResValue := CoreIntPwr(RectCoord(Self), RectCoord(FCoord.R, FCoord.Theta), Pwr);
Result := TJclComplex.Create(ResValue.X, ResValue.Y, crPolar);
Result.FFracLen := FFracLen;
end;
function TJclComplex.CoreRealPwr(First: TRectCoord; const Polar: TRectCoord; const Pwr: Float): TRectCoord;
begin
First.X := MiscalcSingle(First.X);
First.Y := MiscalcSingle(First.Y);
if AbsoluteValueSqr(First) = 0.0 then
if MiscalcSingle(Pwr) = 0.0 then
Result := RectOne
else
Result := RectZero
else
Result := RectCoord(Power(Polar.X, Pwr), NormalizeAngle(Pwr * Polar.Y));
end;
function TJclComplex.CRealPwr(const Pwr: Float): TJclComplex;
var
ResValue: TRectCoord;
begin
FillCoords(crRectangular);
ResValue := CoreRealPwr(RectCoord(Self), RectCoord(FCoord.R, FCoord.Theta), Pwr);
FCoord.R := ResValue.X;
FCoord.Theta := ResValue.Y;
FillCoords(crPolar);
Result := Self;
end;
function TJclComplex.CNewRealPwr(const Pwr: Float): TJclComplex;
var
ResValue: TRectCoord;
begin
FillCoords(crRectangular);
ResValue := CoreRealPwr(RectCoord(Self), RectCoord(FCoord.R, FCoord.Theta), Pwr);
Result := TJclComplex.Create(ResValue.X, ResValue.Y, crPolar);
Result.FFracLen := FFracLen;
end;
function TJclComplex.CoreRoot(First: TRectCoord; const Polar: TRectCoord; const K, N: Word): TRectCoord;
begin
First.X := MiscalcSingle(First.X);
First.Y := MiscalcSingle(First.Y);
if AbsoluteValue(First) = 0.0 then
Result := RectZero
else
Result := RectCoord(Power(Polar.X, 1.0 / N), NormalizeAngle((Polar.Y + K * TwoPi) / N));
end;
function TJclComplex.CRoot(const K, N: Word): TJclComplex;
var
ResValue: TRectCoord;
begin
FillCoords(crRectangular);
ResValue := CoreRoot(RectCoord(Self), RectCoord(FCoord.R, FCoord.Theta), K, N);
FCoord.R := ResValue.X;
FCoord.Theta := ResValue.Y;
FillCoords(crPolar);
Result := Self;
end;
function TJclComplex.CNewRoot(const K, N: Word): TJclComplex;
var
ResValue: TRectCoord;
begin
FillCoords(crRectangular);
ResValue := CoreRoot(RectCoord(Self), RectCoord(FCoord.R, FCoord.Theta), K, N);
Result := TJclComplex.Create(ResValue.X, ResValue.Y, crPolar);
Result.FFracLen := FFracLen;
end;
function TJclComplex.CSqrt: TJclComplex;
begin
Result := CRoot(0, 2);
end;
function TJclComplex.CNewSqrt: TJclComplex;
begin
Result := CNewRoot(0, 2);
end;
//=== trigonometric functions ================================================
function TJclComplex.CoreCos(const Value: TRectCoord): TRectCoord;
begin
Result := RectCoord(Cos(Value.X) * CosH(Value.Y), -Sin(Value.X) * SinH(Value.Y));
end;
function TJclComplex.CCos: TJclComplex;
var
ResValue: TRectCoord;
begin
ResValue := CoreCos(RectCoord(Self));
FCoord.X := ResValue.X;
FCoord.Y := ResValue.Y;
Result := Self;
end;
function TJclComplex.CNewCos: TJclComplex;
var
ResValue: TRectCoord;
begin
ResValue := CoreCos(RectCoord(Self));
Result := TJclComplex.Create(ResValue.X, ResValue.Y, crRectangular);
Result.FFracLen := FFracLen;
end;
function TJclComplex.CoreSin(const Value: TRectCoord): TRectCoord;
begin
Result := RectCoord(Sin(Value.X) * CosH(Value.Y), Cos(Value.X) * SinH(Value.Y));
end;
function TJclComplex.CSin: TJclComplex;
var
ResValue: TRectCoord;
begin
ResValue := CoreSin(RectCoord(Self));
FCoord.X := ResValue.X;
FCoord.Y := ResValue.Y;
Result := Self;
end;
function TJclComplex.CNewSin: TJclComplex;
var
ResValue: TRectCoord;
begin
ResValue := CoreSin(RectCoord(Self));
Result := TJclComplex.Create(ResValue.X, ResValue.Y, crRectangular);
Result.FFracLen := FFracLen;
end;
function TJclComplex.CoreTan(const Value: TRectCoord): TRectCoord;
var
TempValue: Float;
begin
TempValue := Cos(2.0 * Value.X) + CosH(2.0 * Value.Y);
if MiscalcSingle(TempValue) <> 0.0 then
Result := RectCoord(Sin(2.0 * Value.X) / TempValue, SinH(2.0 * Value.Y) / TempValue)
else
Result := RectInfinity;
end;
function TJclComplex.CTan: TJclComplex;
var
ResValue: TRectCoord;
begin
ResValue := CoreTan(RectCoord(Self));
FCoord.X := ResValue.X;
FCoord.Y := ResValue.Y;
Result := Self;
end;
function TJclComplex.CNewTan: TJclComplex;
var
ResValue: TRectCoord;
begin
ResValue := CoreTan(RectCoord(Self));
Result := TJclComplex.Create(ResValue.X, ResValue.Y, crRectangular);
Result.FFracLen := FFracLen;
end;
function TJclComplex.CoreCot(const Value: TRectCoord): TRectCoord;
var
TempValue: Float;
begin
TempValue := Cosh(2.0 * Value.Y) - Cos(2.0 * Value.X);
if MiscalcSingle(TempValue) <> 0.0 then
Result := RectCoord(Sin(2.0 * Value.X) / TempValue, -SinH(2.0 * Value.Y) / TempValue)
else
Result := RectInfinity;
end;
function TJclComplex.CCot: TJclComplex;
var
ResValue: TRectCoord;
begin
ResValue := CoreCot(RectCoord(Self));
FCoord.X := ResValue.X;
FCoord.Y := ResValue.Y;
Result := Self;
end;
function TJclComplex.CNewCot: TJclComplex;
var
ResValue: TRectCoord;
begin
ResValue := CoreCot(RectCoord(Self));
Result := TJclComplex.Create(ResValue.X, ResValue.Y, crRectangular);
Result.FFracLen := FFracLen;
end;
function TJclComplex.CoreSec(const Value: TRectCoord): TRectCoord;
var
TempValue: TRectCoord;
begin
TempValue := CoreCos(Value);
if MiscalcSingle(AbsoluteValue(TempValue)) <> 0.0 then
Result := CoreDiv(RectOne, TempValue)
else
Result := RectInfinity;
end;
function TJclComplex.CSec: TJclComplex;
var
ResValue: TRectCoord;
begin
ResValue := CoreSec(RectCoord(Self));
FCoord.X := ResValue.X;
FCoord.Y := ResValue.Y;
Result := Self;
end;
function TJclComplex.CNewSec: TJclComplex;
var
ResValue: TRectCoord;
begin
ResValue := CoreSec(RectCoord(Self));
Result := TJclComplex.Create(ResValue.X, ResValue.Y, crRectangular);
Result.FFracLen := FFracLen;
end;
function TJclComplex.CoreCsc(const Value: TRectCoord): TRectCoord;
var
TempValue: TRectCoord;
begin
TempValue := CoreSin(Value);
if MiscalcSingle(AbsoluteValue(TempValue)) <> 0.0 then
Result := CoreDiv(RectOne, TempValue)
else
Result := RectInfinity;
end;
function TJclComplex.CCsc: TJclComplex;
var
ResValue: TRectCoord;
begin
ResValue := CoreCsc(RectCoord(Self));
FCoord.X := ResValue.X;
FCoord.Y := ResValue.Y;
Result := Self;
end;
function TJclComplex.CNewCsc: TJclComplex;
var
ResValue: TRectCoord;
begin
ResValue := CoreCsc(RectCoord(Self));
Result := TJclComplex.Create(ResValue.X, ResValue.Y, crRectangular);
Result.FFracLen := FFracLen;
end;
//=== hyperbolic functions ===================================================
function TJclComplex.CoreCosH(const Value: TRectCoord): TRectCoord;
begin
Result := RectCoord(CosH(Value.X) * Cos(Value.Y), SinH(Value.X) * Sin(Value.Y));
end;
function TJclComplex.CCosH: TJclComplex;
var
ResValue: TRectCoord;
begin
ResValue := CoreCosH(RectCoord(Self));
FCoord.X := ResValue.X;
FCoord.Y := ResValue.Y;
Result := Self;
end;
function TJclComplex.CNewCosH: TJclComplex;
var
ResValue: TRectCoord;
begin
ResValue := CoreCosH(RectCoord(Self));
Result := TJclComplex.Create(ResValue.X, ResValue.Y, crRectangular);
Result.FFracLen := FFracLen;
end;
function TJclComplex.CoreSinH(const Value: TRectCoord): TRectCoord;
begin
Result := RectCoord(SinH(Value.X) * Cos(Value.Y), CosH(Value.X) * Sin(Value.Y));
end;
function TJclComplex.CSinH: TJclComplex;
var
ResValue: TRectCoord;
begin
ResValue := CoreSinH(RectCoord(Self));
FCoord.X := ResValue.X;
FCoord.Y := ResValue.Y;
Result := Self;
end;
function TJclComplex.CNewSinH: TJclComplex;
var
ResValue: TRectCoord;
begin
ResValue := CoreSinH(RectCoord(Self));
Result := TJclComplex.Create(ResValue.X, ResValue.Y, crRectangular);
Result.FFracLen := FFracLen;
end;
function TJclComplex.CoreTanH(const Value: TRectCoord): TRectCoord;
var
TempValue: Float;
begin
TempValue := CosH(2.0 * Value.X) + Cos(2.0 * Value.Y);
if MiscalcSingle(TempValue) <> 0.0 then
Result := RectCoord(SinH(2.0 * Value.X) / TempValue, Sin(2.0 * Value.Y) / TempValue)
else
Result := RectInfinity;
end;
function TJclComplex.CTanH: TJclComplex;
var
ResValue: TRectCoord;
begin
ResValue := CoreTanH(RectCoord(Self));
FCoord.X := ResValue.X;
FCoord.Y := ResValue.Y;
Result := Self;
end;
function TJclComplex.CNewTanH: TJclComplex;
var
ResValue: TRectCoord;
begin
ResValue := CoreTanH(RectCoord(Self));
Result := TJclComplex.Create(ResValue.X, ResValue.Y, crRectangular);
Result.FFracLen := FFracLen;
end;
function TJclComplex.CoreCotH(const Value: TRectCoord): TRectCoord;
var
TempValue: Float;
begin
TempValue := Cosh(2.0 * Value.X) - Cos(2.0 * Value.Y);
if MiscalcSingle(TempValue) <> 0.0 then
Result := RectCoord(SinH(2.0 * Value.X) / TempValue, -Sin(2.0 * Value.Y) / TempValue)
else
Result := RectInfinity;
end;
function TJclComplex.CCotH: TJclComplex;
var
ResValue: TRectCoord;
begin
ResValue := CoreCotH(RectCoord(Self));
FCoord.X := ResValue.X;
FCoord.Y := ResValue.Y;
Result := Self;
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -