主题:时间步长怎么会变呢?求程序高手帮忙。
wangxinling
[专家分:0] 发布于 2012-08-19 11:58:00
规定时间步长为0.0001s。本应该是0.0001,0.0002,0.0003,0.0004,0.0005..............这样走下去。但是运行程序时,怎么会突然出现0.0009,0.00099999,0.0011,时间步长怎么变了?高手帮忙。
回复列表 (共8个回复)
沙发
臭石头雪球 [专家分:23030] 发布于 2012-08-19 12:51:00
浮点数就是这样,有舍入误差的。
另外,循环变量建议不要用浮点数,而用整数。
如果想增加精度,可以考虑用双精度浮点。
例如
real(kind=8) :: r
Integer :: i
Do i = 1 , N
r = 0.0001D0 * i
...! 然后把 r 当成循环变量
End Do
板凳
jude1990 [专家分:50] 发布于 2012-08-19 17:41:00
楼上正解,浮点数不宜做循环变量
3 楼
wangxinling [专家分:0] 发布于 2012-08-19 19:28:00
高手,我不大懂浮点数。我的程序是这样;
h=0.0001
do n=0,10000
t(n)=h*n
中间省略
print*,n,t
enddo
这个程序没有声明t,当我声明为double precision时,t的输出结果全是0了,这是为什么呢?
4 楼
wangxinling [专家分:0] 发布于 2012-08-19 19:29:00
高手,我不大懂浮点数。我的程序是这样;
h=0.0001 do n=0,10000 t(n)=h*n
中间省略 print*,n,t enddo
这个程序没有声明t,当我声明为double precision时,t的输出结果全是0了,这是为什么呢?
5 楼
臭石头雪球 [专家分:23030] 发布于 2012-08-19 21:01:00
不要不声明 t
每个变量都必须声明,否则你会发现很多莫名其妙难以寻找的错误。
这很重要。
然后,你要确定 t 是个什么?是个什么类型的?是单变量,还是数组?
h=0.0001
do n=0,10000
t(n)=h*n
中间省略
print*,n,t !// 如果 t 是一个数组,这里你是否需要输出全部 t ??如果是,那么你就输出了 1000次全部的 t,你确定是这样想的么?
enddo
6 楼
wangxinling [专家分:0] 发布于 2012-08-20 12:13:00
对,就是这样想,每循环一次,输出t,他是一个数组。精度怎么提高呢?
7 楼
yeg001 [专家分:14390] 发布于 2012-08-20 13:48:00
雪球 是说, 楼主真的需要每次都输出完整的t(一万个元哦...)? 表面代码看,没有必要.
双精度已经足够高的了, h=0.0001改为h=0.0001D0就是了(参考一楼雪球的回复).
8 楼
wangxinling [专家分:0] 发布于 2012-08-22 21:20:00
小女子初学者,就懂一点点,谢谢高手,谢谢雪球。
我来回复