数值计算:计算机精度
机器数
由于计算机的储存空间有限,所以对于一个实数,有时候存储的只是它的近似值
其中为尾数,是个有限位数二进制数,其大小为,整数称为阶码。当一个实数的位数过多,其便会被舍去一部分精度
计算机浮点数
在以32位表示单精度实数的计算机中,阶码用8位表示,位数用24位表示,其表示的范围为到,有6位的十进制精度值
对于64位表示的双精度值,用11位表示阶码,用53位表示尾数,其表示的范围为到,有16位的十进制精度值
计算误差
在计算机的计算过程中,由于本身的存储的数值可能只是是近似值,而且中间结果可能会有舍入,导致误差不断地增大,例如我们计算n个0.1相加的和(n=10, 100, 1000, ...),代码如下:
#include<bits/stdc++.h>
using namespace std;
int main(){
int n = 1;
for(int j = 0; j < 9; j++){
n = n * 10;
float ans = 0;
for(int i = 0; i < n; i++){
ans += (1 / 10.0);
}
printf("n= %d
ans= %f
", n, ans);
}
system("pause");
}
结果为
n | 计算结果 | 正确结果 |
---|---|---|
10 | 1.000000 | 1 |
100 | 10.000002 | 10 |
1000 | 99.999046 | 100 |
10000 | 999.902893 | 1000 |
100000 | 9998.556641 | 10000 |
1000000 | 100958.343750 | 100000 |
10000000 | 1087937.000000 | 1000000 |
100000000 | 2097152.000000 | 10000000 |
1000000000 | 2097152.000000 | 100000000 |
在计算过程中由于中间的结果不断被舍入,所以误差越来越大,到了最后由于0.1相对于中间结果来说太小了,所以加数0.1也被省略了,以至于到了最后即使n增大, 计算结果也是不变的。