回 帖 发 新 帖 刷新版面

主题:时间步长怎么会变呢?求程序高手帮忙。

规定时间步长为0.0001s。本应该是0.0001,0.0002,0.0003,0.0004,0.0005..............这样走下去。但是运行程序时,怎么会突然出现0.0009,0.00099999,0.0011,时间步长怎么变了?高手帮忙。

回复列表 (共8个回复)

沙发

浮点数就是这样,有舍入误差的。

另外,循环变量建议不要用浮点数,而用整数。

如果想增加精度,可以考虑用双精度浮点。

例如

real(kind=8) :: r
Integer :: i
Do i = 1 , N
  r = 0.0001D0 * i
  ...! 然后把 r 当成循环变量
End Do

板凳

楼上正解,浮点数不宜做循环变量

3 楼

高手,我不大懂浮点数。我的程序是这样;
h=0.0001
do n=0,10000
   t(n)=h*n
   中间省略
print*,n,t
enddo
这个程序没有声明t,当我声明为double precision时,t的输出结果全是0了,这是为什么呢?

4 楼

高手,我不大懂浮点数。我的程序是这样; 
h=0.0001 do n=0,10000 t(n)=h*n
中间省略 print*,n,t enddo 
这个程序没有声明t,当我声明为double precision时,t的输出结果全是0了,这是为什么呢?

5 楼

不要不声明 t
每个变量都必须声明,否则你会发现很多莫名其妙难以寻找的错误。

这很重要。

然后,你要确定 t 是个什么?是个什么类型的?是单变量,还是数组?

h=0.0001
do n=0,10000
   t(n)=h*n
   中间省略
print*,n,t  !// 如果 t 是一个数组,这里你是否需要输出全部 t ??如果是,那么你就输出了 1000次全部的 t,你确定是这样想的么?
enddo

6 楼


对,就是这样想,每循环一次,输出t,他是一个数组。精度怎么提高呢?

7 楼

雪球 是说, 楼主真的需要每次都输出完整的t(一万个元哦...)? 表面代码看,没有必要.

双精度已经足够高的了, h=0.0001改为h=0.0001D0就是了(参考一楼雪球的回复).

8 楼


小女子初学者,就懂一点点,谢谢高手,谢谢雪球。

我来回复

您尚未登录,请登录后再回复。点此登录或注册