回 帖 发 新 帖 刷新版面

主题:请教数据计算有效位数问题

各位老师好,
本人在用fortran编程的过程中遇到这样一个问题:
我定义了两个变量类型:a,b均为实型,但在计算中会出现如下类似情况
19.98+0.02=19.999999
怎样才能使计算出来的结果为20.00,即消除计算中的误差(不能用格式输出的方式,因为后面还需要用这个结果继续计算,我只是举这样一个例子)?程序中用的的数第三位小数以后都是0.
急!

回复列表 (共8个回复)

沙发

可能大家没太看明白我问的问题,特粘贴一段我的计算结果供参考:
注:坐标之间的差值分别为: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
怎样避免这样的计算误差?谢谢!

板凳

在数字后面加d0也不行吗 试试

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位。

4 楼

谢谢!我不太明白您的意思,在数字后面加d0?能详细说一下吗?

5 楼

我用的powerstation version 4.0,正常情况下是不会出现我说的情况,就是在一些比较大型的计算中才会偶尔出现,这就取决与单元网格的划分大小了,网格单元较大的时候一般不会出现,但较小的时候就会偶尔出现(不是都出现,比如说我的网格宽度为0.2时就不出现这样的情况,但网格宽度为0.25时就出现了),很奇怪!

6 楼


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

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

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

7 楼

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


8 楼

输出的有效位数控制一下。或用real(8)型

我来回复

您尚未登录,请登录后再回复。点此登录或注册