Fortran Coder

标题: 关于循环问题的求助贴 [打印本页]

作者: yifanxing1992    时间: 2014-11-4 15:35
标题: 关于循环问题的求助贴
各位大神:主要是设置了一个循环解方程组的程序,但是问题是,在我设置的时候t应该是从0-12以0.12的步长做循环,但是最后运行出来的效果确实每次的步长不是0.12,而少了0.000000001左右量级,然后累加起来误差越来越大。。求大神解决。
[Fortran] 纯文本查看 复制代码
PROGRAM test
IMPLICIT NONE
     REAL,PARAMETER::Q=1.0,C=1.0
     REAL t,X,Y,Z,PX,PY,PZ
     DO t=0.0,12.0,0.12000000
     Z=(((2-2*C**2+Q**2)/(4*C))*(t-Z))-(((Q**2)/(8*C**2))*sin(2*t-2*Z))
     Y=0
     X=(Q/C)*(cos(t-Z)-1)
     PX=Q*sin(t-Z)
     PY=0
     PZ=(C**2-1)/(2*C)-(Q**2)*((sin(t-Z))**2)/(2*C)
     open(unit=11,file='result2.txt')
     write(11,100)t,PX,PY,PZ,X,Y,Z
     100 FORMAT(1X,F20.8,6F12.8,6F12.8,6F12.8,6F12.8,6F12.8,6F12.8)

     end do
END


作者: 楚香饭    时间: 2014-11-4 16:03
你最大的问题是 Z 没有初始值。

我感觉不到你的误差积累。单精度浮点数只有 6-7 位有效数字的精度,这一点请时刻铭记。如果觉得不够,可以考虑用双精度浮点。
作者: yifanxing1992    时间: 2014-11-4 16:20
首先我觉得Z不需要初值,因为第一个方程,目的是需要通过t,c,q三个值确定Z的值。。所以觉得这个不是最大的问题。

另外我的的问题是这样子的,就是按理说 t变量的取值。t=0.00000000,0.12000000,0.2400000000,0.36000000这样下去,但是实际编译出来的结果是t=0.00000000,0.11999999,0.23999998,0.36999996……这个样子
作者: yifanxing1992    时间: 2014-11-4 16:20
楚香饭 发表于 2014-11-4 16:03
你最大的问题是 Z 没有初始值。

我感觉不到你的误差积累。单精度浮点数只有 6-7 位有效数字的精度,这一点 ...

首先我觉得Z不需要初值,因为第一个方程,目的是需要通过t,c,q三个值确定Z的值。。所以觉得这个不是最大的问题。

另外我的的问题是这样子的,就是按理说 t变量的取值。t=0.00000000,0.12000000,0.2400000000,0.36000000这样下去,但是实际编译出来的结果是t=0.00000000,0.11999999,0.23999998,0.36999996……这个样子
作者: 楚香饭    时间: 2014-11-4 17:44
Z=(((2-2*C**2+Q**2)/(4*C))*(t-Z))-(((Q**2)/(8*C**2))*sin(2*t-2*Z))

等号右边有 Z,计算时没有值。会导致不可预料的后果。

单精度浮点精度问题,我在2楼已描述过。
作者: yifanxing1992    时间: 2014-11-5 21:45
好的。谢谢啦。




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2