数值分析上机作业最强版.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 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)

wyjy + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档