计算机实数存储误差
来源:百度知道 编辑: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位之前是正确的。
计算机内的实数貌似不存在绝对零,称作浮点数比较合适,这种浮点数表达方式是利用科学计数法来表达实数的,即用一个尾数,一个基数,一个指数以及一个表