首页 | 通行证 | 论坛 | BLOG | 书评 | 开发文章 | 人才招聘 | 资讯 | 工具下载 | 源码下载 | 项目交易 | 兴趣小组 | 网友作品 | C语言试题测试 | 资源共享 | ACM题库

注册新会员

请登陆或者注册新用户   用户名    密  码   记住密码  注册新用户  忘记密码了

 您所在位置:论坛首页Fortran — 请教数据计算有效位数问题
 本帖地址: http://bbs.pfan.cn/post-270938.html [复制地址] [搜索相关帖子]
  发 新 帖   回 帖   快速回帖
 主题:请教数据计算有效位数问题
作者:jiangjieshi
专家分:0
级别:1
 会员信息
 发短消息
 所属BLOG
发表时间:2008-3-25 17:48:00    [回复]  [只看作者帖] [只看得分帖] [只看我的回帖]
楼主
各位老师好,
本人在用fortran编程的过程中遇到这样一个问题:
我定义了两个变量类型:a,b均为实型,但在计算中会出现如下类似情况
19.98+0.02=19.999999
怎样才能使计算出来的结果为20.00,即消除计算中的误差(不能用格式输出的方式,因为后面还需要用这个结果继续计算,我只是举这样一个例子)?程序中用的的数第三位小数以后都是0.
急!

  最后修改于2008-3-25 17:55:00

0
作者:jiangjieshi
专家分:0
级别:1

发表时间:2008-3-25 21:51:00    [回复]  [引用]
1 楼  
可能大家没太看明白我问的问题,特粘贴一段我的计算结果供参考:
注:坐标之间的差值分别为:0.06、0.02、0.35
       节点号   坐标(出问题地方)  沉 降             侧向位移
        1709        4.520000      -37.791140        2.508491
        1710        4.579999      -37.814840        2.537896
        1831        4.599999      -37.803600        2.550540
        1832        4.949999      -37.895010        2.675434
        1833        5.299999      -38.015690        2.807469
        2014        5.319999      -38.027910        2.822308
        2015        5.379999      -38.046350        2.858961
        2136        5.399999      -38.049700        2.874867
        2137        5.749999      -38.172280        3.012630
        2138        6.099999      -38.392520        3.152091
        2319        6.119999      -38.414430        3.165054
        2320        6.179999      -38.465620        3.194743
        2441        6.199999      -38.462840        3.207329
        2442        6.549999      -38.611050        3.325025
        2443        6.899999      -38.791690        3.437730
        2624        6.919999      -38.818920        3.448354
        2625        6.979999      -38.819960        3.472965
        2746        6.999999      -38.816220        3.484732
        2747        7.349998      -38.897820        3.595408
        2748        7.699998      -39.082730        3.715924
        2929        7.719998      -39.102110        3.726687
        2930        7.779998      -39.146670        3.750532
        3051        7.799999      -39.141610        3.761292
        3052        8.149998      -39.255100        3.869553
        3053        8.499998      -39.414050        3.977437
        3234        8.519999      -39.445520        3.986840
        3235        8.579999      -39.454880        4.008219
        3356        8.599998      -39.456930        4.019127
        3357        8.949998      -39.457050        4.120214
        3358        9.299998      -39.582820        4.253435
        3539        9.319999      -39.583080        4.265284
        3540        9.379999      -39.585590        4.291709
        3661        9.399999      -39.575980        4.303952
        3662        9.749998      -39.640370        4.424768
        3663       10.100000      -39.755250        4.545651
        3844       10.120000      -39.782140        4.556908
        3845       10.180000      -39.779690        4.583207
怎样避免这样的计算误差?谢谢!

 

作者:lishhit
专家分:1650
级别:9级别:9级别:9级别:9

发表时间:2008-3-25 22:32:00    [回复]  [引用]
2 楼  
在数字后面加d0也不行吗 试试

 

  此帖尚未评分
作者:jason388
专家分:1430
级别:8级别:8级别:8

发表时间:2008-3-26 5:11:00    [回复]  [引用]
3 楼  

在GFortran中没有出现你说的现象:
program ab
real a,b
a=19.98
b=0.02
write(*,*)a,b,a+b
end program ab

a+b=20.000000

如果通过数据文件传输数据,而又要求保持足够的精度,建议计算时采用双精度(或你希望的精度),然后输出时采用宽度足够的g格式符,避免因为数据文件采用较少位数的格式输出造成精度损失。

如果是程序内部传输数据,则不会造成精度损失,当然前提是你声明的精度能够保证计算的需要,比如需要10位有效数字,单精度就不够了,因为单精度只有7位。

 

  此帖尚未评分
作者:jiangjieshi
专家分:0
级别:1

发表时间:2008-3-26 9:59:00    [回复]  [引用]
4 楼  
谢谢!我不太明白您的意思,在数字后面加d0?能详细说一下吗?

 

作者:jiangjieshi
专家分:0
级别:1

发表时间:2008-3-26 10:03:00    [回复]  [引用]
5 楼  
我用的powerstation version 4.0,正常情况下是不会出现我说的情况,就是在一些比较大型的计算中才会偶尔出现,这就取决与单元网格的划分大小了,网格单元较大的时候一般不会出现,但较小的时候就会偶尔出现(不是都出现,比如说我的网格宽度为0.2时就不出现这样的情况,但网格宽度为0.25时就出现了),很奇怪!

 

作者:jason388
专家分:1430
级别:8级别:8级别:8

发表时间:2008-3-26 16:08:00    [回复]  [引用]
6 楼  

我觉得你提的问题不是计算精度而是浮点数的显示问题。

由于浮点数在机器内部无法准确表示,所以其精度取决于程序选择的精度,如单精度(kind=4)其有效数字为6位,6位之外是不准确的。因此,程序设计时应该根据问题范围精度要求等选择合适的浮点数精度,而不能奢望机器给出与人算的一样的结果。如果计算机语言提供的精度仍然无法满足需要,那就要设计或寻求算法的改进。

计算结果的显示则是另外的问题。一般情况下合理选择Fortran提供的格式符能够满足大部分的需要。当然在很多情况下图形显示会更直观。

 

  此帖尚未评分
作者:xuanchuan
专家分:0
级别:1

发表时间:2008-3-26 18:48:00    [回复]  [引用]
7 楼  
MV2007是猜猜工作室推出的一款多媒体网络即时通讯软件。mv2007聊天室整合网络电话、视频会议、聊天室、文件传输等多种功能于一身,mv聊天室具有超清晰的语音对话、高品质的视频传输效果,飞一般的文件传输速度,支持断点续传,独特的防火墙和NAT穿透功能,采用服务器中转机制,保证即时发送、接收消息、文件及点对点的语音、视频通讯的高连通率.
官方主页:http://www.mv178.com
华军下载:http://nj.onlinedown.net/soft/55764.htm
天空下载:http://www.skycn.com/soft/33785.html


 

  此帖尚未评分
作者:febi
专家分:0
级别:1

发表时间:2008-3-30 11:29:00    [回复]  [引用]
8 楼  
输出的有效位数控制一下。或用real(8)型

 

  此帖尚未评分
[首页] [上页][下页] [尾页]     共有 8 回帖 当前第 1 页(共1页 20帖/页)     跳转至第
  发 新 帖   回 帖   快速回帖   刷新版面

版主管理:  删除此帖   删除回复帖   转贴   置顶   加入精华   强制结帖   >>>进入管理页面


关于本站 - 网站导航 - 广告服务 - 联系站长 - BUG报告 - 友情链接 - 赞助本站
Copyright© 1999-2008 Programfan.com. All Rights Reserved
论坛制作&维护:Hannibal    Email: webmaster@pfan.cn
最佳浏览效果:IE6.0+ 或 FireFox 1.5+ 分辨率:1024*768