求救,菜鸟的问题。 ( 积分: 10 )

  • 主题发起人 主题发起人 lmk
  • 开始时间 开始时间
L

lmk

Unregistered / Unconfirmed
GUEST, unregistred user!
我在函数中定义了一个double变量,现在想给它付值,但怎么都付不上去!
 
我在函数中定义了一个double变量,现在想给它付值,但怎么都付不上去!
 
例如我下面的程序:
procedure TForm1.Button1Click(Sender: TObject);
var
RI,CI:double;
begin
RI:=0;
CI:=0;
end;
运行了下,居然结果是RI=1.803824537e-305;CI:=8.5747045528e-305;
这个结果让我莫名其妙
 
不可能吧,老大
 
就是的!我就+了一个按纽组件,然后在END那设个断点检查的,结果就这样。我以为内存乱七八糟的呢?把机器重起了下,结果还这样。
 
你怎么运行的,是不是运行时改变了它的值,怎么得到这个结果的?
用ShowMessage,还是Edit显示出来的?我怎么设个断点看它还是 0 ???
问题要说的清楚嘛!
 
刚学delphi就得出这样的结果我不知道是该哭呢,还是该笑!!
 
在没有运行完:
RI:=0;
CI:=0;
时,或执行到此,没有进行下一步运算,
则RI=1.803824537e-305;CI:=8.5747045528e-305;是有可能的。

可是执行完后就应该是0了。
你可以试试这个
var
RI,CI:double;
dm:double;
begin
RI:=0;
CI:=0;

dm:=RI+CI;
edit1.Text:=floattostr(dm);
把调试用的定位点,点到,edit1.text的那一行就可以了。
这样你在看看结果
 
刚才试了一下,确实如此。不过那个值已经很小了,近似等于0应该没有错吧,double的值不可能精确到完全一样吧。
 
具体函数如下:
function tform1.tras(A: array of double;B: array of double):boolean;
var
i,j: integer;
num,root1,root2: double
//root1,root2存放相临2次计算的特征根
arr: doublearray;
tag: boolean;
cr,ci:double;
RI: array[3..13] of double;
begin
root1:=1;root2:=0
ci:=0;
RI[3]:=0.58;RI[4]:=0.90;RI[5]:=1.12;RI[6]:=1.24;RI[7]:=1.32;
RI[8]:=1.41;RI[9]:=1.45;RI[10]:=1.48;RI[11]:=1.49;RI[12]:=1.51;RI[13]:=1.56;
setlength(arr,length(B));
while root1-root2>0.00001 do //此循环的作用是用“幂法”来求最大特征值
begin
root2:=root1

for i:=0 to length(B)-1 do
begin
num:=0;
for j:=0 to length(B)-1 do
begin
num:=num+A[i*length(B)+j]*B[j];
end;
arr:=num;
end;
root1:=arr[0]/B[0]

for i:=0 to length(B) do
B:=arr;
end;
ci:=(root1-length(B))/(length(B)-1);
cr:=ci/ri[length(B)];
edit1.Text:=floattostr(ci);
end;
这个函数的作用是想实现矩阵一致性检验的。测试的模块是:
procedure TForm1.Button1Click(Sender: TObject);
var
arr1: array[0..8] of double;
arr2: array[0..2] of double;
begin
arr1[0]:=1;arr1[1]:=1/5;arr1[2]:=1/5;arr1[3]:=5;
arr1[4]:=1;arr1[5]:=1;arr1[6]:=5;arr1[7]:=1;
arr1[8]:=1;
arr2[0]:=1/3;arr2[1]:=1/3;arr2[2]:=1/3;
form1.tras(arr1,arr2);
end;
结果里面应该是0的
 
但现在的结果是:-2.22044604925031E-16
 
不会只有这点代码吧,所有代码都贴出来看看
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
doublearray=array of double;
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
function tras(A: array of double;B: array of double):boolean;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

function tform1.tras(A: array of double;B: array of double):boolean;
var
i,j: integer;
num,root1,root2: double
//root1,root2存放相临2次计算的特征根
arr: doublearray;
tag: boolean;
cr,ci:double;
RI: array[3..13] of double;
begin

root1:=1;root2:=0
ci:=0;
RI[3]:=0.58;RI[4]:=0.90;RI[5]:=1.12;RI[6]:=1.24;RI[7]:=1.32;
RI[8]:=1.41;RI[9]:=1.45;RI[10]:=1.48;RI[11]:=1.49;RI[12]:=1.51;RI[13]:=1.56;
setlength(arr,length(B));
while root1-root2>0.00001 do //此循环的作用是用“幂法”来求最大特征值
begin
root2:=root1

for i:=0 to length(B)-1 do
begin
num:=0;
for j:=0 to length(B)-1 do
begin
num:=num+A[i*length(B)+j]*B[j];
end;
arr:=num;
end;
root1:=arr[0]/B[0]

for i:=0 to length(B) do
B:=arr;
end;
ci:=(root1-length(B))/(length(B)-1);
cr:=ci/ri[length(B)];
edit1.Text:=floattostr(ci);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
arr1: array[0..8] of double;
arr2: array[0..2] of double;
begin
arr1[0]:=1;arr1[1]:=1/5;arr1[2]:=1/5;arr1[3]:=5;
arr1[4]:=1;arr1[5]:=1;arr1[6]:=5;arr1[7]:=1;
arr1[8]:=1;
arr2[0]:=1/3;arr2[1]:=1/3;arr2[2]:=1/3;
form1.tras(arr1,arr2);
end;

end.
所有程序都在这了。还没编完呢?
 
想不到这么麻烦大家,分少了,等一会在补,谢谢大家!
 
多人接受答案了。
 
后退
顶部