Einzelnen Beitrag anzeigen

Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#22

Re: Quadratische Gleichungen vollständig lösen

  Alt 26. Jul 2009, 23:03
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
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat