Fortran Coder

查看: 16729|回复: 3
打印 上一主题 下一主题

[求助] 一个小的程序问题(误差积累)

[复制链接]

9

帖子

5

主题

0

精华

入门

F 币
57 元
贡献
35 点
跳转到指定楼层
楼主
发表于 2021-3-30 17:57:40 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
[Fortran] 纯文本查看 复制代码
program main
implicit none


integer i,j,k,maxx,maxy,maxz,i0,jb,kc,pp,pp1,ct
real dx,dy,dz,ww,ww1,rrb1,rrb
real,allocatable ::dz_1(:)

        dz=0.05
        maxx=74;maxy=74;maxz=74
        i0=23;jb=52;kc=52
        ct=1.0

        allocate(dz_1(0:maxz))
        dz_1=0
        do k=1,maxz
        dz_1(k)=dz_1(k-1)+dz
        enddo

        DO k = 1,maxz-1
        DO j = 1,maxy-1
          DO i = 1,maxx



!            rrb=(i-0.5)*dx*st*cp+  &
!             j*dy*st*sp+    &
!             k*dz*ct               !(6-7-13)
            rrb= k*dz*ct   
!            rrb=(dx_1(i-1)+(dx_1(i)-dx_1(i-1))/2.)*st*cp+  &
!             dy_1(j)*st*sp+             &
!             dz_1(k)*ct     !+ dz/1.e+10
          rrb1=dz_1(k)*ct

              pp=int(rrb/dz)
          pp1=int(rrb1/dz)
          ww=abs(mod(rrb,dz))
          ww1=abs(mod(rrb1,dz))
!          ww=rrb/dz-pp
          if(i.eq.i0.and.j.eq.jb.and.k.eq.kc) then
          print*,rrb,pp,ww
          print*,rrb1,pp1,ww1
          pause
          endif

          if(abs(1-(pp+1)/rrb).lt.1.e-5)then
          pp=pp+1
          endif   
          if(ww.lt.1.e-6.or.abs(1-ww/dz).lt.1.e-5)then
          ww=0
          else
          ww=ww/dz
          endif

           ENDDO
          ENDDO
        ENDDO

end

    不知道rrb,pp,ww和rrb1,pp1,ww1为什么不一样,试过单双精度,对结果没有改变。



分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

9

帖子

5

主题

0

精华

入门

F 币
57 元
贡献
35 点
沙发
 楼主| 发表于 2021-3-30 20:37:00 | 显示全部楼层
fcode 发表于 2021-3-30 20:18
因为 dz_1 是累加起来的。累加会让误差积累。
你以为 dz 是 0.05 ,其实不是。它可能是 0.0500000007451
累 ...

感谢女神指导
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-5-2 23:17

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表