打印

请教一个浮点数的精度问题

[复制链接]
2223|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
EAMCU|  楼主 | 2012-6-10 11:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用stm32做浮点数运算
有浮点数A,浮点数B,浮点数C。
初始值都为0。
循环做下面的运算:
A=A+B;
A=A-B;

除了第一次,以后每次循环后,B都取一个带小数部分的随机浮点数。

请问,会不会出现经过多次运算后,A会不会由于误差累积变得非常大?


下面的循环呢?C也为随机数
A=A+B;
A=A+C;
A=A-B;
A=A-C;
沙发
hhxb| | 2012-6-10 18:53 | 只看该作者
莫名奇妙的问题,
结果取决于随机数的生成算法,

使用特权

评论回复
板凳
EAMCU|  楼主 | 2012-6-10 20:25 | 只看该作者
可能你没有看懂

我的意思是
{
   A=A+B;
   A=A-B;
}
合起来是一个循环,这一个循环结束了才更改B的值。

由于浮点数存储是有近似的,所以A先加上B,然后再减去B,是不是有可能导致结果不为0,只是接近0.
而这种误差有没有可能,在某次运行时都是朝某个方向累积(运气极差的时候),从而导致经过多次循环后,A的值变得很大?

使用特权

评论回复
地板
acgean| | 2012-6-11 08:49 | 只看该作者
大部分情况不会, 如果浮点数 B 小于 A ,那么计算的时候, B 就会丢弃一些精度,这个是事实。
但是在
{
   A=A+B;
   A=A-B;
}
通常两次计算中 B 丢弃的精度是一样的。
有没有可能不一样呢? 当然是有可能的。
A+B 产生尾数溢出的时候, B 丢弃的精度就会不一样

使用特权

评论回复
5
figo20042005| | 2012-6-13 15:29 | 只看该作者
在做加减法时,有可能溢出,超过浮点数范围

使用特权

评论回复
6
xxlin1984| | 2012-6-13 16:03 | 只看该作者
浮点数a = m × b^e,m是尾数,e是指数。

1.  如果随机数B本身就是确定精度的浮点数话(意思是B=N*z,z=1×b^e),则没有累计误差。
2.  如果B = N.xx*z = (N*z,(N+1)*z),则编译器会对 +N.xx 和 -N.xx 取整;假设取整后+B = +N*z;而
-B = -(N+1)*z,则 A+B+(-B)  = -1*z,即误差当前最小精度1×b^e。(注:对编译器将如何取整没研究过)。

使用特权

评论回复
7
EAMCU|  楼主 | 2012-7-15 21:06 | 只看该作者
最后我把涉及到这种情况的计算都改成整数了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

38

主题

396

帖子

2

粉丝