奇怪的问题:Double类型运算(50分)

  • 主题发起人 主题发起人 wader
  • 开始时间 开始时间
W

wader

Unregistered / Unconfirmed
GUEST, unregistred user!
我定义了几个double类型变量
var
d_lon1,d_lat1,d_lon2,d_lat2,d_L2 :double;

...
//估算距离
d_L2 :=Sqrt(Sqr(d_lon2-d_lon1)+sqr(d_lat2-d_lat1));
//我在watch窗口明明看见Sqrt(Sqr(d_lon2-d_lon1)+sqr(d_lat2-d_lat1))的值有,虽然很小(是0.0012...),但是为什么赋值给d_L2后就是d_L2的值为0,把d_L2改为real/extended类型也如此,怎么回事?请问该如何解决?
 
若是象你说得那样,是不可能的,你实际应用中d_L2有可能是实参 变量,函数结束就还原了
比如
procedure sumxxx(outv:double;in1,in2:double);
begin
outv:=in1+in2;
end;
var
jieguo,x1,x2:double;
.......
sumxxx( jieguo,x1,x2);
这时 jieguo 还是保持不变,虽然在函数内部是有值的,结束之后还原.
上面的函数改成这样就没问题了
procedure sumxxx(var outv:double;in1,in2:double);
 
你的值是什么?因为你看到的0.0012很肯那个是科学计数,后面还有位数。
 
bmsr:
其实我就在同一个过程中计算这个值,这几个都是double变量。我先计算d_lon2、d_lon1、d_lat2、d_lat1的值,在执行
d_L2 :=Sqrt(Sqr(d_lon2-d_lon1)+sqr(d_lat2-d_lat1));
之前,我看见Sqrt(Sqr(d_lon2-d_lon1)+sqr(d_lat2-d_lat1))在watch中的值是对的(值是0.00125....很小,但是执行完
d_L2 :=Sqrt(Sqr(d_lon2-d_lon1)+sqr(d_lat2-d_lat1));
以后,d_L2的值为0,而不是0.00125...
怎么回事???
 
顶!查出来了!
把菜单"project->options->Compiler下的optimization”的选择去掉,计算和赋值就正确了,但是还是不知道是什么原因?
 
这个原因很简单,就是编译系统检测到你这个d_L2 或者说这个计算过程在整个程序逻辑中没有任何作用,就是说编译候的程序中有没有那一段代码,对程序的运行没有影响是多于的.
比如如下代码
var
i:integer;
i:=3;
i:=7;
.....
第一句 i:=3 就没有意义的,会被优化掉. 当然,很少的情况下,优化会出现一些错误,不过非常少.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部