我用for语句做矩阵相乘的计算,发现循环计数器i,j,k不是从0开始,而是从大到小的。但是结果却是对的。太怪了。
语句如下:看看有没有高人解答一下:procedure TMform.BitBtn2Click(Sender: TObject);
var y:array[0..3,0..3] of integer;
a:array[0..1,0..3] of integer;
tempvalue :integer;
i,j,k,o,p:integer;
begin a[0,0]:=1;
a[0,1]:=2;
a[0,2]:=3;
a[0,3]:=4;
a[1,0]:=1;
a[1,1]:=2;
a[1,2]:=3;
a[1,3]:=4;
y[0,0]:=1;
y[0,1]:=2;
y[0,2]:=3;
y[0,3]:=4;
y[1,0]:=0;
y[1,1]:=1;
y[1,2]:=2;
y[1,3]:=3;
y[2,0]:=0;
y[2,1]:=2;
y[2,2]:=3;
y[2,3]:=5;
y[3,0]:=1;
y[3,1]:=3;
y[3,2]:=5;
y[3,3]:=7; for i:=0 to 0 do //i row,j column
for j:=0 to 3 do //j=4
begin
tempvalue:=0;
for k:=0 to 3 do //k=4
begin
tempvalue:=a[i][k]*y[k][j]+tempvalue;
end;
self.Memo1.Lines.Add(floattostr(tempvalue));
end;
end;
语句如下:看看有没有高人解答一下:procedure TMform.BitBtn2Click(Sender: TObject);
var y:array[0..3,0..3] of integer;
a:array[0..1,0..3] of integer;
tempvalue :integer;
i,j,k,o,p:integer;
begin a[0,0]:=1;
a[0,1]:=2;
a[0,2]:=3;
a[0,3]:=4;
a[1,0]:=1;
a[1,1]:=2;
a[1,2]:=3;
a[1,3]:=4;
y[0,0]:=1;
y[0,1]:=2;
y[0,2]:=3;
y[0,3]:=4;
y[1,0]:=0;
y[1,1]:=1;
y[1,2]:=2;
y[1,3]:=3;
y[2,0]:=0;
y[2,1]:=2;
y[2,2]:=3;
y[2,3]:=5;
y[3,0]:=1;
y[3,1]:=3;
y[3,2]:=5;
y[3,3]:=7; for i:=0 to 0 do //i row,j column
for j:=0 to 3 do //j=4
begin
tempvalue:=0;
for k:=0 to 3 do //k=4
begin
tempvalue:=a[i][k]*y[k][j]+tempvalue;
end;
self.Memo1.Lines.Add(floattostr(tempvalue));
end;
end;
解决方案 »
- sqlserver某varchar字段存储内容为RTF格式的数据,如何用where查询
- 人民币求助:虚拟仪表的实现源码
- 如何得到类似下面地址的网页的源码
- 谁能帮我解决这个query的问题啊。
- oracle导入一个dmp文件为何说什么该对象已存在,怎么解决啊?在线等待!!
- 计算上下记录某个字段之差(求高手)
- 有谁知道如何在DELPHI中利用代码恢复和备份ORACLE数据库???先谢过了!!!
- 我需要检测一个同目录的文件是否存在,然后再决定是否执行某种动作,这样的代码怎么写?
- 哪位有FastReport FMX 2.0以上的源码版,能共享下不?
- 高手接招:怎样画Dbgrid中满足条件纪录的字体颜色(不是背景颜色)?
- 动态创建TMenuItem的一个问题?
- 升级,散分
源程序如下:你可以测试一下:
var
y:array[0..3,0..3] of integer;
a:array[0..1,0..3] of integer;
tempvalue :integer;
i,j,k,o,p:integer;
begin
a[0,0]:=1;
a[0,1]:=2;
a[0,2]:=3;
a[0,3]:=4;
a[1,0]:=1;
a[1,1]:=2;
a[1,2]:=3;
a[1,3]:=4;
y[0,0]:=1;
y[0,1]:=2;
y[0,2]:=3;
y[0,3]:=4;
y[1,0]:=0;
y[1,1]:=1;
y[1,2]:=2;
y[1,3]:=3;
y[2,0]:=0;
y[2,1]:=2;
y[2,2]:=3;
y[2,3]:=5;
y[3,0]:=1;
y[3,1]:=3;
y[3,2]:=5;
y[3,3]:=7; for i:=0 to 0 do //i=1
for j:=0 to 3 do //j=4
begin
tempvalue:=0;
for k:=0 to 3 do //k=4
begin
tempvalue:=a[i][k]*y[k][j]+tempvalue;
end;
self.Memo1.Lines.Add(inttostr(tempvalue));
//showmessage(floattostr(tempvalue));
end;
//另外一个循环
tempvalue:=0;
for i:=0 to 3 do //i=0
begin
for J:=0 to 10 do //j=0
tempvalue:=tempvalue+j;
self.Memo1.Lines.Add(inttostr(tempvalue*i));
end;
优化的好处是显而易见的,比如一个for i:=0 to 5 do的循环如果不优化,i从0到5,生成的机器代码中势必有指令inc ecx ,cmp ecx,5(或类似的语句),然后根据Flag寄存器判断是否循环已结束。如果优化了,生成的机器代码就不需要cmp指令了,因为dec ecx本身已经对Flag寄存器有影响了这样就少生成了一条指令,别看只是少了一条指令,当n很大,如10000时,优化的好处就很明显了,因为计算机少执行了10000条指令!!
第一段循环显然是被优化了
而第二段循环由于你加了一句 self.Memo1.Lines.Add(inttostr(tempvalue*i)); 这样优化的话会影响到结果,所以未被优化