计算机实数存储误差

来源:百度知道 编辑:UC知道 时间:2024/06/03 21:23:00
书上说:实数在计算和存储时会有一些微小的误差,这样导致本来是零的量,经过计算或存储变成不等于零。

不明白为什么会这样,我懂补码,请高手解答下!
我说了我懂。。。补码,至少我理解。。 可是本来是0的数怎么会变成非零?????其他数位的误差我倒是可以理解。

这涉及到计算机中实数的存储问题,不论是float还是double在存储方式上都遵从IEEE的规范,float遵从的是IEEE R32.24 ,而double 遵从的是R64.53。想弄明白这个问题可以再找下相关资料。如果连补码都搞不明白,就不要看了。不会看懂的。如果是初学,没必要细究。

关于补充问题:

“导致本来是零的量,经过计算或存储变成不等于零。”你把这句话理解错了吧。给你个例子你运行下:

#include <stdio.h>

int main()
{
float a=999.999;
float b=0.005;
printf("%lf\n",a+b-1000.004);
return 0;
}

看看得到的结果并不是0,按数学计算本来应该是0,但由于浮点数的存储有微小的误差从而导致计算结果不是0.

在给你个例子:

double m;
cin>>m;

你输入3.3,再调试监测m的值你会发现存储的是3.299999998,而不是3.3.这就是本来是3.3而经过存储却变的不是3.3.

这是因为计算机保存浮点数时,
是把数看作a*(2^b)这样的形式的,而不是我们直观上认为的以10为底数,
在计算机内部处理时是以2为底数的。

即将数转换成以2为底的“科学计数法”的形式,
再由这个形式反转换成10进制形式,
但是由于数据有位数的限制,
所以有些数转换成二进制计数形式后位数超出了限制的位数,那么超出的位就被截去了,
那么转换回来时得到的数就会与原数有偏差,不同的数这个偏差是不同的,
有可能在小数点后第7位,也有可能在第8位,也有可能在其他位数,
但是能保证第6位之前是正确的。

计算机内的实数貌似不存在绝对零,称作浮点数比较合适,这种浮点数表达方式是利用科学计数法来表达实数的,即用一个尾数,一个基数,一个指数以及一个表