Professional Documents
Culture Documents
主程序:
1 % 舍入误差与有效数字
2 clc;
3 clear;
4 format long;
5 N = input('请输入 N1,N2,N3...Nn (例如[2,3,4],不能为1或小数,长度任意): ');
6 N_size = numel(N); % 获得矩阵元素个数
7 sn = single(zeros(1,N_size)); % single 表示单精度
8 sn1 = single(zeros(1,N_size));
9 sn2 = single(zeros(1,N_size));
10 for i=1:N_size
11 sn(i) = SN(N(i));
12 sn1(i) = SN_1(N(i)); % 从大到小计算
13 sn2(i) = SN_2(N(i)); % 从小到大计算
14 end
15
16 %打印结果
17 disp('-----------------------------------------------------');
18 fprintf(' 输入 精确值 从大到小计算 从小到大计算\n');
19 for i=1:N_size
20 fprintf('N%d=%8d, %f %f %f\n',i,N(i),sn(i),sn1(i),sn2(i));
21 end
22 disp('-----------------------------------------------------');
23
24 function out = SN(N) % 精确值
25 out = single(1/2*(3/2-1/N-1/(N+1)));
26 end
27
28 function out = SN_1(N) % 从大到小计算
29 out = single(0);
30 for i=2:N
31 out = out + 1/(i*i-1);
32 end
33 end
34
35 function out = SN_2(N) % 从小到大计算
36 out = single(0);
37 for i=N:-1:2
38 out = out + 1/(i*i-1);
39 end
40 end
运行结果:
图1 运行结果
由输出结果(单精度)可以看出:
通过此题我明白了,对于相同的数学公式,采用不同的计算方式实现时其造成的误差时不同的。在
此题中,在从大到小时,随着 N 的增大,误差限也在不断增加,而从小到大时则相反,所以这里采用从
小到大的顺序进行计算精度会更高。
上机体会: