主题:简单 但是 很奇怪的 一个问题
a_april
[专家分:0] 发布于 2011-05-24 08:04:00
在程序中 c=b-a
debug的过程中,可以看到:
a= 0.00705797460
b= 0.01130300000
然后程序算出来的c= 0.00424502560
但实际上c应该= 0.00424502540
反复核算了好几遍都是这样,为什么呢?
上次在这里问过问题,现在找不到那个帖子了,在这里一并谢谢论坛帮助的人
回复列表 (共13个回复)
沙发
a_april [专家分:0] 发布于 2011-05-24 08:06:00
忘了说a,b,c都是real
板凳
yeg001 [专家分:14390] 发布于 2011-05-24 09:28:00
a= 0.00705797460
b= 0.01130300000
是赋值?
3 楼
asymptotic [专家分:16630] 发布于 2011-05-24 09:28:00
单精度浮点数 -- 六到七位有效数字!
4 楼
dongyuanxun [专家分:7180] 发布于 2011-05-24 11:49:00
计算机表示:lz真奇怪啊
5 楼
cgl_lgs [专家分:21040] 发布于 2011-05-24 22:25:00
请用Real*8:)
6 楼
a_april [专家分:0] 发布于 2011-05-25 05:28:00
haha,lz是很奇怪啦,初学者嘛。
2楼,不是直接赋值,是运算过程中的结果。
谢谢各位。lz现在明白为什么了。
可是这个有没有解决办法呢?因为即使是用real8也还是会有这样的限制啊,不过精确到第几位,总会出现这样的问题,总会有最后几位是估计的。可能用real8会减少一些出现这样错误的概率?我试了real8
a= 0.00705797458067536000
b= 0.01130300000000000000
c= 0.00424502557143569000
实际上,c应该= 0.00424502541932464000
我是在用别人的程序做运算,结果总是出错,最后发现是这个原因。各位高手,有没有什么建议?
7 楼
yeg001 [专家分:14390] 发布于 2011-05-25 08:55:00
浮点数本身就会截断, 有兴趣看看二进制表示浮点数. 能精确运算的是整数.
如果你对最后几位那么关心的话在算法设计的时候就需要考虑这个截断误差(rounding error).
8 楼
cgl_lgs [专家分:21040] 发布于 2011-05-25 22:58:00
你的软件真的需要如此高精度么?
9 楼
a_april [专家分:0] 发布于 2011-05-26 01:25:00
楼上两位,谢啦
8楼,这个程序大概出这个错的概率是百分之以,用几百组数据试算,出现了几个这样的错误。
7楼,“在算法设计的时候就需要考虑这个截断误差”,应该有办法,会仔细考虑考虑。
关于二进制这个建议,有两个问题:
1.是不是程序所有其它数据都要换成二进制?整个程序就是另外一种写法?
2.难道二进制就没有位数限制了吗?难道不是数字越长,二进制表示也更长?
10 楼
yeg001 [专家分:14390] 发布于 2011-05-26 10:19:00
1. 这个不是几率问题. 只是我们没有办法去细究每一步的计算, 也就是信息量不足而貌似几率问题.
2. 如果你对这个实在介意的话可以看看<What every computer scientist should know about Floating-point Arithmetic> 这个资料好像是dongyuanxun兄还是asymptotic兄推荐过的. 我也只是快速浏览了一遍.
3. 数据你这样看到的十进制数据是已经格式化的, 但在计算机里面他们本身就是二进制数据. 程序代码没必要"另一种写法". 当然是可以输入二进制数据的,不过你自己转换过来的二进制数据本身也有截断误差.
4. real(kind=4)或者real(kind=8)就是二进制数据存放的长度. 定好了就不会改变.(二进制数据只能精确到某个精度, 十进制数据超过这个精度, 给得怎么长都没用.)
我来回复