Ich habe versucht zumindest die Strings rauszunehmen und ich hoffe, das der vergleich auf Radikant = 0 jetzt besser ist
Auch kann man angeben, ob man eine komplexe Zahl haben möchte.
Als kleines extra, kann man jetzt auch berechnen, wie denn X für A = 0, B != 0 gilt
Delphi-Quellcode:
type
TCmplxNumber = record
RealPart, ImaginaryPart : Double
end;
TCmplxNumbers = array of TCmplxNumber;
function CmplxNumber(const ARealPart, AImaginaryPart : Double) : TCmplxNumber;
begin
Result.RealPart := ARealPart;
Result.ImaginaryPart := AImaginaryPart;
end;
function pq( A, B, C : Double; const AUseComplexNumbers : Boolean): TCmplxNumbers ;
var
Radikand, re, im: Double;
begin
// ax² + bx + c = 0
if IsZero(A) then
begin
if not IsZero(B) then
begin
// 0x^2 + bx + c = 0 ==> x := -c/b
SetLength(Result, 1)
Result := CmplxNumber(-c/b, 0);
end;
Exit
end;
B := B / A; //p
C := C / A; //q
// Radikand berechnen
Radikand := Sqr(B/2) - C;
//Realteil berechnen
re:=-B/2;
// Imaginärteil berechnen
im := Sqrt(Abs(Radikand));
if Radikand > 0 then
begin // zwei reele Lösungen
SetLength(Result, 2);
Result[0] := CmplxNumber(re + im, 0);
Result[1] := CmplxNumber(re - im, 0);
end
else
if IsZero(Radikand) then
begin // eine reele Lösung
SetLength(Result, 1);
Result[0] := CmplxNumber(re);
end
else
if (Radikand < 0) and (AUseComplexNumbers) then
begin // keine reele, aber zwei komplexe Lösungen
// Radikand:=-Radikand;
SetLength(Result, 2);
Result[0] := CmplxNumber(re, im);
Result[1] := CmplxNumber(re, -im);
end else
SetLength(Result, 0);
end;
MfG
xZise