You are on page 1of 2

第一章上机作业

主程序:

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 运行结果

由输出结果(单精度)可以看出:

当从大到小计算时,S ,S ,S 的有效位数分别为 6、4、3


当从小到大计算时,S ,S ,S 的有效位数分别为 5、6、6

通过此题我明白了,对于相同的数学公式,采用不同的计算方式实现时其造成的误差时不同的。在
此题中,在从大到小时,随着 N 的增大,误差限也在不断增加,而从小到大时则相反,所以这里采用从
小到大的顺序进行计算精度会更高。

上机体会:

这次编程主要学会的新东西是 single 函数,其可以将结果转为单精度显示,要注意的是打印结果


的时候同样要用 %f 来打印单精度的结果。

You might also like