主题:请教数据计算有效位数问题
jiangjieshi [专家分:0] 发布于 2008-03-25 17:48:00
各位老师好,
本人在用fortran编程的过程中遇到这样一个问题:
我定义了两个变量类型:a,b均为实型,但在计算中会出现如下类似情况
19.98+0.02=19.999999
怎样才能使计算出来的结果为20.00,即消除计算中的误差(不能用格式输出的方式,因为后面还需要用这个结果继续计算,我只是举这样一个例子)?程序中用的的数第三位小数以后都是0.
急!
最后更新于:2008-03-25 17:55:00
回复列表 (共8个回复)
沙发
jiangjieshi [专家分:0] 发布于 2008-03-25 21:51:00
可能大家没太看明白我问的问题,特粘贴一段我的计算结果供参考:
注:坐标之间的差值分别为: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 [专家分:2400] 发布于 2008-03-25 22:32:00
在数字后面加d0也不行吗 试试
3 楼
jason388 [专家分:6150] 发布于 2008-03-26 05:11:00
在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位。
4 楼
jiangjieshi [专家分:0] 发布于 2008-03-26 09:59:00
谢谢!我不太明白您的意思,在数字后面加d0?能详细说一下吗?
5 楼
jiangjieshi [专家分:0] 发布于 2008-03-26 10:03:00
我用的powerstation version 4.0,正常情况下是不会出现我说的情况,就是在一些比较大型的计算中才会偶尔出现,这就取决与单元网格的划分大小了,网格单元较大的时候一般不会出现,但较小的时候就会偶尔出现(不是都出现,比如说我的网格宽度为0.2时就不出现这样的情况,但网格宽度为0.25时就出现了),很奇怪!
6 楼
jason388 [专家分:6150] 发布于 2008-03-26 16:08:00
我觉得你提的问题不是计算精度而是浮点数的显示问题。
由于浮点数在机器内部无法准确表示,所以其精度取决于程序选择的精度,如单精度(kind=4)其有效数字为6位,6位之外是不准确的。因此,程序设计时应该根据问题范围精度要求等选择合适的浮点数精度,而不能奢望机器给出与人算的一样的结果。如果计算机语言提供的精度仍然无法满足需要,那就要设计或寻求算法的改进。
计算结果的显示则是另外的问题。一般情况下合理选择Fortran提供的格式符能够满足大部分的需要。当然在很多情况下图形显示会更直观。
7 楼
xuanchuan [专家分:0] 发布于 2008-03-26 18:48:00
MV2007是猜猜工作室推出的一款多媒体网络即时通讯软件。mv2007聊天室整合网络电话、视频会议、聊天室、文件传输等多种功能于一身,mv聊天室具有超清晰的语音对话、高品质的视频传输效果,飞一般的文件传输速度,支持断点续传,独特的防火墙和NAT穿透功能,采用服务器中转机制,保证即时发送、接收消息、文件及点对点的语音、视频通讯的高连通率.
官方主页:http://www.mv178.com
华军下载:http://nj.onlinedown.net/soft/55764.htm
天空下载:http://www.skycn.com/soft/33785.html
8 楼
febi [专家分:0] 发布于 2008-03-30 11:29:00
输出的有效位数控制一下。或用real(8)型
我来回复