Unit CmplxClc; { CMPLXCLC.PAS unit version 1.0 Reinout Raymakers 1997 } {$N+,E+} { This unit implements a full set of functions to work with complex numbers in Turbo Pascal. The type Complex is defined as a pointer to be able to use the type as a return value for functions. Values of complex numbers first have to be assigned to a variable using CDef, before you can use them in calculations... Two examples of how to work with this unit: The Complex calculation (2.3 + 4.1i) + cos (-9.1 + 0.7i) can be done in several ways: 1) An extended but understandable one: var A, B, C, D : Complex .... New(A); New(B); A := CDef(2.3,4.1); B := CDef(-9.1,0.7); C := CCos(B); D := CAdd(A,C); .... 2) A compact but not very readable form: var D : Complex; .... New(D); D := CAdd(CDef(2.3,4.1),CCos(CDef(-9.1,0.7)); .... In other words: you can do every step seperatly, but also implement all the functions in one line of code.... P.S. Whether or not it is always necessary to first declare the variables with the New command is not clear to me.... Try it out and see what works best..... (I'm not used to working with pointers....) You are free to use or change this unit in any way you like, but I would appreciate it, if you mailed me your suggestions / changes / bugs or anything else you want changed.... Reinout Raymakers Nolensstraat 12 5344 SK Oss The Netherlands reinoutr@sci.kun.nl RR, 24 December 1997 Other units created by me : - Full support unit for 256 color PCX files Projects that I'm still working on: - True color (24 bit) PCX files unit - Export routines for GIF / BMP formats } Interface Type ComplexValue = Record R : Double; { Real part } I : Double; { Complex part } end; Complex = ^ComplexValue; Const iValue : ComplexValue = (R: 0.0 ;I: 1.0); i : Complex = @iValue; _2iValue : ComplexValue = (R: 0.0 ;I: 2.0); _2i : Complex = @_2iValue; _1Value : ComplexValue = (R: 1.0 ;I: 0.0); _1 : Complex = @_1Value; _2Value : ComplexValue = (R: 2.0 ;I: 0.0); _2 : Complex = @_2Value; Function CDef(R, I : Real) : Complex; { CDef := R + Ii } { Remarks: - All functions marked with 'B' are basic functions, that are defined by only using the standard calculations provided by Turbo Pascal. All other functions are defined in terms of these basic functions and add no (mathematical) functionality to the unit. - Note that the CArg function has a non-defined situation, in which case it gives '666' as an answer (an impossible value for an argument). } Function CAbsSqr(C : Complex) : Real; { ( Abs C )^2 } {B} Function CAbs(C : Complex) : Real; { Abs C } {B} Function CReal(C : Complex) : Real; { Real C } {B} Function Re(C : Complex) : Real; { Real C } Function CImag(C : Complex) : Real; { Imag C } {B} Function Im(C : Complex) : Real; { Imag C } Function CArg(C : Complex) : Real; { Arg C } {B} Function CConj(C : Complex) : Complex; { Conj C } {B} Function CMin(C : Complex) : Complex; { - C } {B} Function CAdd(C1,C2 : Complex) : Complex; { C1 + C2 } {B} Function CSub(C1,C2 : Complex) : Complex; { C1 - C2 } {B} Function CMul(C1,C2 : Complex) : Complex; { C1 * C2 } {B} Function CDiv(C1,C2 : Complex) : Complex; { C1 / C2 } {B} Function CExp(C : Complex) : Complex; { e^C } {B} Function CLn(C : Complex) : Complex; { Ln C } {B} Function CPow(C1, C2 : Complex) : Complex; { C1^C2 } Function CSqr(C : Complex) : Complex; { C^2 } Function CLog(C1, C2 : Complex) : Complex; { C1 Log C2 } Function CRt(C1, C2 : Complex) : Complex; { C1 û C2 } Function CSqrt(C : Complex) : Complex; { û C } Function CSin(C : Complex) : Complex; { Sin C } Function CCos(C : Complex) : Complex; { Cos C } Function CTan(C : Complex) : Complex; { Tan C } Function CCot(C : Complex) : Complex; { Cot C (COT = 1 / TAN) } Function CSec(C : Complex) : Complex; { Sec C (SEC = 1 / COS) } Function CCsc(C : Complex) : Complex; { Csc C (CSC = 1 / SIN) } Function CASin(C : Complex) : Complex; { ArcSin C } Function CACos(C : Complex) : Complex; { ArcCos C } Function CATan(C : Complex) : Complex; { ArcTan C } Function CACot(C : Complex) : Complex; { ArcCot C } Function CASec(C : Complex) : Complex; { ArcSec C } Function CACsc(C : Complex) : Complex; { ArcCsc C } Function CSinh(C : Complex) : Complex; { Sinh C } Function CCosh(C : Complex) : Complex; { Cosh C } Function CTanh(C : Complex) : Complex; { Tanh C } Function CCoth(C : Complex) : Complex; { Coth C } Function CSech(C : Complex) : Complex; { Sech C } Function CCsch(C : Complex) : Complex; { Csch C } Function CASinh(C : Complex) : Complex; { ArcSinh C } Function CACosh(C : Complex) : Complex; { ArcCosh C } Function CATanh(C : Complex) : Complex; { ArcTanh C } Function CACoth(C : Complex) : Complex; { ArcCoth C } Function CASech(C : Complex) : Complex; { ArcSech C } Function CACsch(C : Complex) : Complex; { ArcCsch C } Implementation Function CDef; var U : Complex; begin New(U); U^.R := R; U^.I := I; CDef := U; end; { Fill the complex number with the values of R en I } Function CAbsSqr; begin CAbsSqr := C^.R * C^.R + C^.I * C^.I; end; { Absolute value of C squared } Function CAbs; begin CAbs := Sqrt( C^.R * C^.R + C^.I * C^.I ); end; { Absolute value of C } Function CReal; begin CReal := C^.R; end; { Real part of C } Function Re; begin Re := CReal(C); end; { Real part of C } Function CImag; begin CImag := C^.I; end; { Imaginairy part of C } Function Im; begin Im := CImag(C); end; { Imaginairy part of C } Function CArg; var A, B : Real; begin A := C^.R; B := C^.I; if (A > 0) then begin if (B > 0) or (B < 0) then CArg := ArcTan(B/A); if (B = 0) then CArg := 0; end; { if } if (A < 0) then begin if (B > 0) then CArg := ArcTan(B/A) + Pi; if (B < 0) then CArg := ArcTan(B/A) - Pi; if (B = 0) then CArg := Pi; end; { if } if (A = 0) then begin if (B > 0) then CArg := Pi / 2; if (B < 0) then CArg := -Pi / 2; if (B = 0) then CArg := 666; { Not defined! } end; { if } end; { Argument of C } Function CConj; var U : Complex; begin New(U); U^.R := C^.R; U^.I := -C^.I; CConj := U; end; { Complex conjugate of C } Function CMin; var U : Complex; begin New(U); U^.R := -C^.R; U^.I := -C^.I; CMin := U; end; { The negative of C } Function CAdd; var U : Complex; begin New(U); U^.R := C1^.R + C2^.R; U^.I := C1^.I + C2^.I; CAdd := U; end; { C1 and C2 summed } Function CSub; var U : Complex; begin New(U); U^.R := C1^.R - C2^.R; U^.I := C1^.I - C2^.I; CSub := U; end; { Difference between C1 and C2 } Function CMul; var U : Complex; begin New(U); U^.R := C1^.R * C2^.R - C1^.I * C2^.I; U^.I := C1^.R * C2^.I + C1^.I * C2^.R; CMul := U; end; { Product of C1 and C2 } Function CDiv; var U : Complex; N : Real; begin New(U); N := C2^.R * C2^.R + C2^.I * C2^.I; U^.R := (C1^.R * C2^.R + C1^.I * C2^.I) / N ; U^.I := (C2^.R * C1^.I - C1^.R * C2^.I) / N ; CDiv := U; end; { C1 divided by C2 } Function CExp; var U : Complex; begin New(U); U^.R := exp(C^.R) * cos(C^.I); U^.I := exp(C^.R) * sin(C^.I); CExp := U; end; { e to the power C } Function CLn; var U : Complex; begin New(U); U^.R := Ln(CAbs(C)); U^.I := CArg(C); CLn := U; end; { Natural logarithm of C } Function CPow; var A, B, U : Complex; begin New(U); New(A); New(B); A := CLn(C1); B := CMul(C2,A); U := CExp(B); CPow := U; end; { C1 to the power C2 } Function CSqr; var U : Complex; begin New(U); U := CMul(C,C); CSqr := U; end; { C squared } Function CLog; var A, B, U : Complex; begin New(U); A := CLn(C1); B := CLn(C2); U := CDiv(B,A); CLog := U; end; { Logarithmic base C1 of C2 (with natural logarithm C1 = e } Function CRt; var A, U : Complex; begin New(U); A := CDiv(_1,C1); U := CPow(C2,A); CRt := U; end; { The C1th root of C2 } Function CSqrt; var U : Complex; begin New(U); U := CRt(_2,C); CSqrt := U; end; { Squareroot of C } Function CSin; var U, Z : Complex; begin New(U); New(Z); Z := CMul(i,C); U := CDiv(CSub(CExp(Z),CExp(CMin(Z))),_2i); CSin := U; end; { Sine of C } Function CCos; var U, Z : Complex; begin New(U); Z := CMul(i,C); U := CDiv(CAdd(CExp(Z),CExp(CMin(Z))),_2); CCos := U; end; { Cosine of C } Function CTan; var U : Complex; begin New(U); U := CDiv(CSin(C),CCos(C)); CTan := U; end; { Tangent of C } Function CCot; var U : Complex; begin New(U); U := CDiv(_1,CTan(C)); CCot := U; end; { Cotangent of C } Function CSec; var U : Complex; begin New(U); U := CDiv(_1,CCos(C)); CSec := U; end; { Secant of C } Function CCsc; var U : Complex; begin New(U); U := CDiv(_1,CSin(C)); CCsc := U; end; { Cosecant of C } Function CASin; var U : Complex; begin New(U); U := CDiv(CLn(CAdd(CMul(i,C),CSqrt(CSub(_1,CSqr(C))))),i); CASin := U; end; { ArcSine of C } Function CACos; var U : Complex; begin New(U); U := CDiv(CLn(Cadd(C,CSqrt(CSub(Csqr(C),_1)))),i); CACos := U; end; { ArcCosine of C } Function CATan; var U, Z : Complex; begin New(U); New(Z); Z := CMul(i,C); U := CMul(CDiv(_1,_2i),CLn(CDiv(CSub(CMin(_1),Z),CSub(Z,_1)))); CATan := U; end; { ArcTangent of C } Function CACot; var U : Complex; begin New(U); U := CATan(CDiv(_1,C)); CACot := U; end; { ArcCotangent of C } Function CASec; var U : Complex; begin New(U); U := CACos(CDiv(_1,C)); CASec := U; end; { ArcSecant of C } Function CACsc; var U : Complex; begin New(U); U := CASin(CDiv(_1,C)); CACsc := U; end; { ArcCosecant of C } Function CSinh; Var U : Complex; begin New(U); U := CDiv(CSub(CExp(C),CExp(CMin(C))),_2); CSinh := U; end; { Sinushyperbolicus of C } Function CCosh; Var U : Complex; begin New(U); U := CDiv(CAdd(CExp(C),CExp(CMin(C))),_2); CCosh := U; end; { CoSinushyperbolicus of C } Function CTanh; var U : Complex; begin New(U); U := CDiv(CSinh(C),CCosh(C)); CTanh := U; end; { Tangenshyperbolicus of C } Function CCoth; var U : Complex; begin New(U); U := CDiv(_1,CTanh(C)); CCoth := U; end; { Cotangenshyperbolicus of C } Function CSech; var U : Complex; begin New(U); U := CDiv(_1,CCosh(C)); CSech := U; end; { Secanthyperbolicus of C } Function CCSch; var U : Complex; begin New(U); U := CDiv(_1,CCosh(C)); CCsch := U; end; { Cosecanthyperbolicus of C } Function CASinh; Var A, U : Complex; begin New(A); New(U); A := CSqrt(CAdd(CSqr(C),_1)); U := CLn(CAdd(C,A)); CASinh := U; end; { ArcSinushyperbolicus of C } Function CACosh; Var A, U : Complex; begin New(A); New(U); A := CSqrt(CSub(CSqr(C),_1)); U := CLn(CAdd(C,A)); CACosh := U; end; { ArcCosinushyperbolicus of C } Function CATanh; var A, U : Complex; begin New(U); New(A); A := CDiv(CSub(CMin(C),_1),CSub(C,_1)); U := CDiv(CLn(A),_2); CATanh := U; end; { ArcTangenshyperbolicus of C } Function CACoth; var U : Complex; begin New(U); U := CATanh(CDiv(_1,C)); CACoth := U; end; { ArcCotangenshyperbolicus of C } Function CASech; var U : Complex; begin New(U); U := CACosh(CDiv(_1,C)); CASech := U; end; { ArcSecanthyperbolicus of C } Function CACsch; var U : Complex; begin New(U); U := CASin(CDiv(_1,C)); CACsch := U; end; { ArcCosecanthyperbolicus of C } end.