чуть чуть не в тему, но разъясните кому не трудно

рабочая программа решающая систему уравнений методом гауса:
Program bI_2_var_10;
const
n = 4;
m = 5;
var
a,o: array [1..n, 1..m] of real;
x, s: array [1..m-1] of real;
i, j, curr_i, c: integer;
begin
a[1, 1]:= 7.5; a[1, 2]:= 2.6; a[1, 3]:= 1.3; a[1, 4]:= -8.1; a[1, 5]:= 5.7;
a[2, 1]:= 6.4; a[2, 2]:= 3.3; a[2, 3]:= -2.4; a[2, 4]:= 1.7; a[2, 5]:= -2.1;
a[3, 1]:= 0.1; a[3, 2]:= -2.3; a[3, 3]:= 0.8; a[3, 4]:= -5.7; a[3, 5]:= 4.6;
a[4, 1]:= 8.2; a[4, 2]:= 0.1; a[4, 3]:= -5.3; a[4, 4]:= -7.6; a[4, 5]:= 5.1;
o:= a;
for curr_i:=1 to 3 do
begin
for j:=m downto 1 do a[curr_i, j]:= a[curr_i, j]/a[curr_i,curr_i];
for i:=curr_i + 1 to n do
for j:=m downto curr_i do a[i, j]:= a[i, j] - a[i, curr_i] * a[curr_i, j];
end;
c:= m-1;
x[n]:= a[n,m]/a[n,n];
for i:= n-1 downto 1 do
begin
x[i]:= a[i,m];
for j:= m-1 downto c do x[i]:= x[i] - (x[j] * a[i,j]);
c:= c-1;
end;
for i:= 1 to n do writeln('x[', i, ']= ', x[i]);
writeln('Подстановка');
a[1,1]:= x[1] * o[1,1] + x[2] * o[1, 2] + x[3] * o[1, 3] + x[4] * o[1, 4];
a[2,1]:= x[1] * o[2,1] + x[2] * o[2, 2] + x[3] * o[2, 3] + x[4] * o[2, 4];
a[3,1]:= x[1] * o[3,1] + x[2] * o[3, 2] + x[3] * o[3, 3] + x[4] * o[3, 4];
a[4,1]:= x[1] * o[4,1] + x[2] * o[4, 2] + x[3] * o[4, 3] + x[4] * o[4, 4];
writeln( a[1,1]:0 :10, ' = ', o[1,5]);
writeln( a[2,1]:0 :10, ' = ', o[2,5]);
writeln( a[3,1]:0 :10, ' = ', o[3,5]);
writeln( a[4,1]:0 :10, ' = ', o[4,5]);
end.
первый цикл приводит матрицу к треугольному виду, второй кусок обратным ходом находит иксы.
Во время вычислений постоянно появляются иррациональные числа, т.е. корни должны быть приближенными, но при подстановки все сходится хоть до 10 знаков после запятой:
5.7000000000 = 5.7
-2.1000000000 = -2.1
4.6000000000 = 4.6
5.1000000000 = 5.1
так вот, почему нет погрешности?)