|
楼主 |
发表于 2012-3-30 22:41:15
|
显示全部楼层
vows 发表于 2012-3-30 22:30
我写了一段简单的程序,证明乘法运算是丢精度的.
我是用的单片机是msp430f449,带硬件乘法器的.
代码如下:
int main( void )
{
float a,b,c;
int i;
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
a=64;
a=(float)(123456789123456789)*a;
b=(float)(123456789123456789)*0.5;
for(i=0;i<1000;i++)
b=b*0.5;
for(i=0;i<1000;i++)
b=b*2;
b=b*2;// 这里下断点
c=10;
if(a==b)
c=1;
c=c*c;
b=c;
return 0;
}
为了保险,我做了1000次以上的乘法运算,并且只作乘法运算.
如果乘法运算不会丢精度,那么运行到最后b=c的那句时,c的值应当仍然为1.0
上图:
开始运行时,
到这一步,c已经被赋值,为10.0.如果乘法运算是精确的话,那么if语句里的c=1应当被执行.
可是到了最后,c变成了100.说明a==b不成立.
由此可见,float类型的乘法计算在msp430f449上是丢精度的.
谢谢回复啊,
看你的程序,是b乘1000次0.5
再b乘1000次2,相当于乘1000次1
值应该为123456789123456789
你的a是不是
a=64;
a=(float)(123456789123456789)*a;
a =(float)(123456789123456789)*64;
那a和b是不是就是不相等?????? |
|