- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数值分析上机作业习题1-17唐皓 142460
PAGE 1
数值分析上机作业
姓 名:
唐 皓
学 号:
142460
专 业:
道路与铁道工程
院 系:
交通学院
授课教师:
吴 宏 伟
日 期:
2015年1月
习题一
题目
17.(上机题)舍入误差与有效数
设,其精确值为。
(1)编制按从大到小的顺序,计算的通用程序;
(2)编制按从小到大的顺序,计算的通用程序;
(3)按两种顺序分别计算,,,并指出有效位数。(编制程序时用单精度);
(4)通过本上机题你明白了什么?
通用程序代码
按从小到大的顺序计算
void AscendSum(unsigned long int N)// 计算从大到小的总和
{
for(unsigned long int j=2;j=N;j++)
ascendSum+=(float)1.0/(j*j-1);
coutSum From 1 to N (Ascend) is: ascendSumendl;
Error(ascendSum);
Delimiter();
}
按从大到小的顺序计算
void DescendSum(unsigned long int N)//计算从小到大的总和
{
for(unsigned long int j=N;j=2;j--)
descendSum+=(float)1.0/(j*j-1);
coutSum From N to 1 (Descend) is: descendSumendl;
Error(descendSum);
Delimiter();
}
计算结果展示
图 SEQ 图 \* ARABIC 1 N=100时的计算结果
图 SEQ 图 \* ARABIC 2 N=10000时的计算结果
图 SEQ 图 \* ARABIC 3 N=1000000时的计算结果
表 SEQ 表 \* ARABIC 1-1 计算结果汇总
精确值
按从小到大
按从大到小
值
有效位数
值
有效位数
0.7400494814
0.7400494814
10
0.740049541
6
0.7498999834
0.7498521209
4
0.7498999834
10
0.7499989867
0.751856029
2
0.7529925108
2
计算结果分析
(1)如果采用单精度数据结构进行计算,则相较于双精度的数据结果,由于数据存储字长的限制导致计算机存在较大的舍入误差,因此本程序采用的是双精度数据存储方式。
(2)由计算结果可知,正序计算和逆序计算的精度是不稳定的。由计算结果可以发现,当N=100时,正序计算(1-N)的精度较高;当N=10000时,逆序计算(N-1)的精度较高;当N=1000000时,正序计算和逆序计算的精度一样。
当然,和其他同学做出来的结果对比,结论并不一致。我个人分析这是因为电脑的硬件、软件(位数)不同等原因导致的。但总体而言,在N较小时,正序计算精度高于逆序计算的精度。当N较大时,正序和逆序计算的精度接近。
(3)由于计算机的实际计算过程是一种舍入机制,故对于我们计算所采用的加法交换律是不成立的。计算机中若干数相加时,先要进行对阶操作,即将两数的阶数统一为绝对值较大的数的阶数。这样一来将导致绝对值较小的数的有效数字可能会大量损失,增大舍入误差,即所谓的“大数吃小数”现象。为了避免这种现象的出现,在进行加减法的时候应该先将绝对值较小的数相加,再与绝对值较大的数相加这样按阶逐步递增的相加。
完整代码
#include iostream
#include iomanip
#include math.h
using namespace std;
float accurateSum=0,ascendSum=0,descendSum=0;
void Delimiter()//输出一系列星号以间隔
{
for(int i=1;i=50;i++) cout*;
coutendl;
}
void Error(float Sum)//计算绝对误差
{
float error;
error=fabs(Sum-accurateSum);
int flag;
for(flag=0;flag10;flag++)
{
error=error*10;
if (error0.5)
break;
}
coutThere are flag Valid numbers.\n;
}
void AccurateSum(unsigned long int N)//计算精确值
{
accurateSum=0.5*(1.5-(float)1/N-(
原创力文档


文档评论(0)