Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
Delphi 10.4 Sydney
|
AW: Gauß-Verfahren - Matrix lösen
29. Aug 2015, 16:04
Japp. Selbst mein Blödgauss aus den 80gern schafft in 1 sec eine Matrix 500 x 500. Ich denke mal TE würde sowas womöglich schon reichen. Etwas umformuliert, erste Tests, die Quelle hab ich oben angegeben.
Delphi-Quellcode:
function FloatToFracStr(const Value: Extended): string; // Quelle "delfiphan"
const
Eps = 1E-12; // Fehlertoleranz
var
P, LastP, Q, LastQ, TempP, TempQ, U, A, D: Extended;
Numerator, Denominator: int64;
begin
Numerator := 0;
Denominator := 0;
// Initialisierung
A := 1;
P := 1;
Q := 0;
LastP := 0;
LastQ := 1;
U := Value;
// Abbruchkriterien
while (CompareValue(U, 0) <> 0) and (CompareValue(Value + A, Value) <> 0) and (CompareValue(A, Eps) >= 0) do
begin
// Einen ganzzahligen Anteil abspalten
D := Round(U);
U := U - D;
// Update von P und Q: Kettenbruch nachführen. Es gilt: P / Q ~= Value
TempP := P * D + LastP;
TempQ := Q * D + LastQ;
LastP := P;
LastQ := Q;
P := TempP;
Q := TempQ;
// Approximationsfehler
A := 0.25 * Abs(P / Q - Value);
// Bruch umkehren
if U <> 0 then U := 1 / U;
end;
// Vor Integerkonversion auf Bereich überprüfen
if (P > High(int64)) or (Q > High(int64)) or (P < Low(int64)) or (P < Low(int64)) then
raise EIntOverflow.Create('FloatToFrac: int64 overflow.');
// Vorzeichen von Nenner zum Zähler
if Q < 0 then
Numerator := -Trunc(P)
else
Numerator := Trunc(P);
Denominator := Abs(Trunc(Q));
if Denominator = 1 then
Result := IntToStr(Numerator)
else
Result := Format('%d/%d', [Numerator, Denominator]);
end;
|
|
Zitat
|