Как исправить код, или помогите разобраться в компиляторе.
Заметил странную оптимизацию, у меня если убрать жирную строчку, программа работает быстрее.
Но мне эта строчка очень нужна!
program Project1;
uses
Windows,
Matrix in 'Matrix.pas';
FUnction Oem(const S:String):String;
begin
SetLength(Result,Length(S));
CharToOem(PCHar(s),PChar(Result));
end;
var
TmpTime,Time:LongInt;
i:Integer;
BEGIN
Set8087CW(Get8087CW and $FCFF or $0200);
WriteLn(Oem('Решение системы линейных уравнений методом Якоби'));
TmpTime:=GetTickCount;
For i:=0 to 1000000 do Yakob;
Time:=GetTickCount;
Dec(Time,TmpTime);
WriteLn(Oem('Посчитан за '),Time/1000:3:2,Oem(' микросекунд'));
WriteLn;
WriteLN(Oem('Решение системы :'));
WriteLn;
For i:=0 to N do
Begin
Write(i+1:3,' ');
WriteLn(Res[i]:10:7);
end;
WriteLn;
WriteLN(Oem('С точностью: '),Eps);
WriteLn;
WriteLN(Oem('Сходимость:'));
WriteLn;
For i:=0 to 100 do
begin
end;
Set8087CW(Get8087CW or $0100);
ReadLn;
END.
unit Matrix;
interface
const Eps=1E-7;
const N=14;
type
Sq=array[0..N,0..N+1] of Single;
F=array[0..N] of Double;
const
Mat:Sq =
((26,7.5,2.8,1.4,0,0,0,0,0,0,0,0,0,0,0,-36),
(7.5,26,7.5,2.8,1.4,0,0,0,0,0,0,0,0,0,0,-179.3),
(2.8,7.5,26,7.5,2.8,1.4,0,0,0,0,0,0,0,0,0,-23.8),
(1.4,2.8,7.5,26,7.5,2.8,1.4,0,0,0,0,0,0,0,0,-77.7),
(0,1.4,2.8,7.5,26,7.5,2.8,1.4,0,0,0,0,0,0,0,29.3),
(0,0,1.4,2.8,7.5,26,7.5,2.8,1.4,0,0,0,0,0,0,154.7),
(0,0,0,1.4,2.8,7.5,26,7.5,2.8,1.4,0,0,0,0,0,-126.2),
(0,0,0,0,1.4,2.8,7.5,26,7.5,2.8,1.4,0,0,0,0,-155.5),
(0,0,0,0,0,1.4,2.8,7.5,26,7.5,2.8,1.4,0,0,0,32.5),
(0,0,0,0,0,0,1.4,2.8,7.5,26,7.5,2.8,1.4,0,0,35.5),
(0,0,0,0,0,0,0,1.4,2.8,7.5,26,7.5,2.8,1.4,0,253.1),
(0,0,0,0,0,0,0,0,1.4,2.8,7.5,26,7.5,2.8,1.4,175.6),
(0,0,0,0,0,0,0,0,0,1.4,2.8,7.5,26,7.5,2.8,138),
(0,0,0,0,0,0,0,0,0,0,1.4,2.8,7.5,26,7.5,25.4),
(0,0,0,0,0,0,0,0,0,0,0,1.4,2.8,7.5,26,136.9));
var
Res:F;
Procedure Yakob;
implementation
Procedure Yakob;
var
i,j,k:Integer;
X:Extended;
LastRes:F;
Sum,err,MaxErr:Extended;
begin
Repeat
LastRes:=Res;
MaxErr:=0;
For i:=0 to N do
begin
Sum:=0;
For j:=0 to i-1 do
begin
Sum:=Sum+Mat[i,j]*LastRes[j];
end;
For j:=i+1 to N do
begin
Sum:=Sum+Mat[i,j]*LastRes[j];
end;
X:=(Mat[i,N+1]-Sum)/Mat[i,i];
Err:=Abs(X-LastRes[i]);
Res[i]:=X;
if err>MaxErr then MaxErr:=err;
end;
Until MaxErr<eps;
end;
end.