Fortran Coder

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

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

[复制链接]

9

帖子

5

主题

0

精华

入门

F 币
57 元
贡献
35 点
跳转到指定楼层
楼主
发表于 2021-3-30 17:57:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
[Fortran] 纯文本查看 复制代码
01program main
02implicit none
03 
04 
05integer i,j,k,maxx,maxy,maxz,i0,jb,kc,pp,pp1,ct
06real dx,dy,dz,ww,ww1,rrb1,rrb
07real,allocatable ::dz_1(:)
08 
09        dz=0.05
10        maxx=74;maxy=74;maxz=74
11        i0=23;jb=52;kc=52
12        ct=1.0
13 
14        allocate(dz_1(0:maxz))
15        dz_1=0
16        do k=1,maxz
17        dz_1(k)=dz_1(k-1)+dz
18        enddo
19 
20        DO k = 1,maxz-1
21        DO j = 1,maxy-1
22          DO i = 1,maxx
23 
24 
25 
26!            rrb=(i-0.5)*dx*st*cp+  &
27!             j*dy*st*sp+    &
28!             k*dz*ct               !(6-7-13)
29            rrb= k*dz*ct  
30!            rrb=(dx_1(i-1)+(dx_1(i)-dx_1(i-1))/2.)*st*cp+  &
31!             dy_1(j)*st*sp+             &
32!             dz_1(k)*ct     !+ dz/1.e+10
33          rrb1=dz_1(k)*ct
34 
35              pp=int(rrb/dz)
36          pp1=int(rrb1/dz)
37          ww=abs(mod(rrb,dz))
38          ww1=abs(mod(rrb1,dz))
39!          ww=rrb/dz-pp
40          if(i.eq.i0.and.j.eq.jb.and.k.eq.kc) then
41          print*,rrb,pp,ww
42          print*,rrb1,pp1,ww1
43          pause
44          endif
45 
46          if(abs(1-(pp+1)/rrb).lt.1.e-5)then
47          pp=pp+1
48          endif  
49          if(ww.lt.1.e-6.or.abs(1-ww/dz).lt.1.e-5)then
50          ww=0
51          else
52          ww=ww/dz
53          endif
54 
55           ENDDO
56          ENDDO
57        ENDDO
58 
59end

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



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

2038

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1675 元
贡献
715 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

沙发
发表于 2021-3-30 20:18:26 | 只看该作者
因为 dz_1 是累加起来的。累加会让误差积累。
你以为 dz 是 0.05 ,其实不是。它可能是 0.0500000007451
累加起来,误差就会越来越大。

而 rrb= k*dz*ct 因为用的乘法,虽然也有误差,但不会积累。

如果你难以理解为什么计算机用二进制不能精确存储 0.05
你可以联想一下,十进制不能精确存储 1/3,但三进制却可以。

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
累 ...

感谢女神指导

213

帖子

2

主题

0

精华

宗师

F 币
2142 元
贡献
875 点

规矩勋章

地板
发表于 2021-3-30 21:25:17 | 只看该作者

是大神,不能以貌识人。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2025-4-15 08:45

Powered by Discuz! X3.4

© 2013-2025 Comsenz Inc.

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