Witam. Mam spory problem z pewną funkcją. Przyjmuje ona jako parametr macierz, którą następnie musi przekształcić do macierzy górnotrójkątnej U (z zerami na dolnym trójkącie). Przed każdym "zerowaniem" poszczególnych pól musi jednak w każdej iteracji (która de facto zmniejsza macierz do mniejszej: np. z 4x4 na 3x3, potem 2x2) szukać w tej macierzy maksymalnej wartości i ustawiać ją w lewym górnym rogu. Najgorsze jest to, że funkcja zdaje się działać, bo po wypisaniu daje zamierzony efekt. Jednak wyniki dla liczb rzeczywistych odbiegają od zakładanych. Proszę o pomoc.

function macierzU2(n : Integer; macierz : matrix; out zamiana : swaptable; out osobliwa : boolean) : matrix;
var
i, j, k, wiersz, kolumna : Integer;
temp, max : Extended;
a : matrix;
b  : vector;
temp2 : Integer;
begin
  a := wyciagnijA(n, macierz);
  b := wyciagnijB(n, macierz);
  setLength(zamiana, n+1);
  osobliwa := false;

  for i:= 1 to n do
    zamiana[i] := i;

  for i:=1 to n do
  begin
    max := a[i,i];
    wiersz := i;
    kolumna := i;
    for j:=i to n do
    begin
      for k:=i to n do
      begin
        if abs(a[j,k]) > max then
        begin
          max := abs(a[j,k]);
          wiersz := j;
          kolumna := k;
        end;
      end;
    end;

    for j:=i+1 to n do
    begin
      temp := a[i,j];
      a[i,j] := a[wiersz,j];
      a[wiersz,j] := temp;
    end;
    for j:=i+1 to n do
    begin
      temp := a[j,i];
      a[j,i] := a[j,kolumna];
      a[j,kolumna] := temp;
    end;      

    temp := b[i];
    b[i] := b[wiersz];
    b[wiersz] := temp;

    temp2 := zamiana[i];
    zamiana[i] := zamiana[kolumna];
    zamiana[kolumna] := temp2;
    
    if a[i,i] = 0 then
    begin
      osobliwa := true;
    end;

    if not osobliwa then
    begin
    for j:=i+1 to n do
    begin
      temp:=a[j,i]/a[i,i];
      for k:=i to n do
      begin
        a[j,k]:=a[j,k]-temp*a[i,k];
      end; 
      b[j]:=b[j]-temp*b[i];
    end;
    end;
  end;

  a := Scal(n,a,b);

  Result := a;
end;