暑期项目总结

发布 2022-08-22 15:46:28 阅读 2488

项目背景。苹果的成功带来了一系列app开发的高潮。objective-c也成为现今最流行的一门语言。

本次暑期项目我们选择学习objective-c这门语言,我们认为开始学习阶段应该先从简单入手,所以我们选择通过编写一个有图形界面的高精度计算器来加深我们对objective-c的认知,一方面项目不会因为难度过大而导致我们难以完成。另一方面计算器是一个很好的平台,可以完成很多有意义的事情,在完成最基本的计算功能后可以很方便的进行功能上扩展,还有就是计算器的实现中可以学到一些新的算法对我们也有帮助。因此我们最后选择用objective-c来写一个高精度计算器。

软件主要功能。

我们的计算器主要特色是高精度,支持高精度浮点数的加减乘除。可以实现多达百位的数字运算。当然运算的精度还可以通过修改**来进一步提高。

主要算法。目前,一般计算机都提供了符合ieee754的单精度和双精度的计算。在此标准下,对于单精度的浮点数,总位数为32位(4bytes);对于双精度的浮点数,总位数占64位(8bytes).

如果所计算数值超过以上的规定,则计算机无法表示,也无法计算,因此不能满足科学计算的需要。

另一方面,在一般情况下,对于相对较大或较小的数,可以使用科学数据格式来描述,如1.2345e+9或1.2345e-9,但这也只是一种近似。

例如,对于1.2345e+9(=1234500000)实际的数可能是1234567891。

迄今为止,在计算机领域,已有一些专门的用于实现高精度计算的库程序,如gmp、mpfr等,另外matlab等也提供了一些高精度计算的支持。如同使用其他库程序一样,在使用这些库程序之前,需要按照一定的要求安装库程序。虽然这些库程序的开发为有些高精度的计算提供了方便,但有些计算方法并不是最佳的,还需要继续发展。

了解高精度算法有利于独立编写高效率的科学计算程序。

高精度计算技术广泛应用于数论、密码学、天文、气象等科学领域,比如,最常见的非对称加密算法rsa就是以高精度运算为基础的。学习并掌握高精度的计算方法,设计高精度计算程序,可以避免计算硬件精度的限制,提高科学计算的精度。

在高精度计算中,有很多基本细节问题,如数字储存方法、存放顺序以及进制的转换等。在编写计算程序前,需要理清这些问题,只有这样,才能思路清晰。

一)数据的存储。

要设计超精度的计算程序,首先要做的是,如何储存超高精度的数。一般说来,对高精度的数可以使用字符串、数组和链表来储存。

1.使用宇符串。

字符串是由一个一个的字符连接而成的,每个字符可以用于保存一个数位单元。可以把一个数字作为字符存放在字符串中,也可以把数字转换成ascii码来保存。由于每个字符的最大ascii码的值是255,因此可以使用256进位制来保存数据。

例如,把十进制数值456789变成一个字符串:

456789)10=(6,248,85)256=chr(6)&chr(248)&chr(85)

若把数字作为字符来保存,则在计算时需要进行字符与数值转换。使用这种方法的好处是,能解决小数点的表示问题。2.使用数组。

如同字符串一样,若使用数组来储存超高精度的数,每个数组单元可以作为一个储存单元,并采用进位制的形式来构成一个超高精度数的储存空间。根据数据类型的不同,如单精度、双精度等,进位制的基数可以设置不同。3.

使用链表。

这种储存方法与使用数组一样,所不同是使用链表。这种方法的好处是,每节链表可以储存更多的信息,并且可以使用链表的前后指针索引相邻数据。高精度整数与小数高精度数据表示。

超高精度数包括整型和浮点型,在设计计算程序时,需要确定如何表示符号、整数、小数、小数点以及它们的长度。为了方便,可以定义一个数据结构类型来表示这些要素。

对于超高精度的浮点数,可以把它分解成整数和小数部分,分别进行计算。在计算时,使用不同的数组分别存放浮点数的各个部分。

高精度计算时要做的第一步是,如何把一个数据读入到一个用于表示高精度的数组、字符串中。我们使用字符串读入数据并进行数字的表示。

为了保存高精度数据的信息,首先定义一个表示髙精度的浮点数变量类型bigfloat,它也可以用于表示一个整数。在这个数据类型中,成员变量包括数值符号、整数数组及长度、小数数组及长度。虽然整数和小数的存放顺序都是从右到左,然而,整数位置排放需要从数组索引号i=0开始,而小数位置排放是从数组索引号i=nd-l开始。

#definemaxlen3000typedefstructbigfloat;

二)高精度加、减法计算。

高精度加、减法计算可以采用传统的算术方法计算。

髙精度加法是最基本的高精度计算,在计算过程中需要注意以下几个问题。

1)运算顺序:要进行数位对齐,先计算低位,再计算高位。使用字符串输入时它与数组的数字序号相反。

2)运算规则:同位上的两个数相加,再加上前一个低位的进位,其和除以进制,得到进位;其和对进制的余数,得到本位的数。

3)最后一位的进位处理:对于整数部分最后的进位,最大长度增加1;对于小数点。

部分的最后进位,增加到整数部分。

4)数据长度:两个相加的数最大长度不大于其中最大长度加1。高精度减法是加法的反向操作,同样可以使用一个数组来保存差的绝对值,另外增加一个变量来保存计算差的符号。

在计算时,先比较减数与被减数的大小,确定其差的符号,再用其中的大数减去小数,得到差的绝对值。

与加法相同,高精度减法也是从低位向高位逐渐进行,若当前数位上的被减数小于减数,则需要借位。根据进制的不同,借位数所表示的大小也不同,例如,100进制的借位所表示的是100。同时,被借位的数位需要减1。

三)高精度乘法计算。

高精度乘法的是高精度除法、乘方和开方等运算的基础,其实现的方法很多,可以直接采用乘法运算,也可以通过变换来进行运算。其中后者可以提高计算速度。高精度乘法计算基础。

由于高精度乘法不同于常规的乘法运算,因此其计算过程有一定的特点。高精度浮点运算方法。

高精度浮点运算可以转换成整数型运算。由于高精度浮点数可以看成是由整数部分与小数部分的组合,因此其乘法可以看成以下3种运算的组合,即整数x整数、整数x小数和小数x小数。用表达式表示,则为。

高精度浮点数x高精度浮点数。

整数x整数+(整数x小数+整数x小数)+小数x小数。

如1.3×2.4=1×22

整数与整数小数与小数整数与小数整数与小数。

对于整数x整数型运算,所得的结果仍然是整数。对于小数x小数型计算,其运算结果仍然是小数。

对于整数x小数型计算,所得到的计算结果是一个浮点数,即可能包括整数和。

小数。此时,可以使用小数部分的每个单元分别乘以整数部分。这样,对于n位小数,可以得到拥有n个数字的字符串。

把第d位乘以整数部分所得到的所有的数字向低位移动d位,则可以得到整数和小数部分的数字位,然后进行求和,即可以得到所需要的计算结果。

高精度与单精度整数相乘。

这种乘法运算与髙精度加法类似高精度与高精度整数乘法。

因为当两个高精度整数相乘时,所得到的积的位数最多不会超过最长整数的两倍,所以保存计算结果的变量空间可以设置为最长整数位数的两倍。当i和j初始值从0开始,乘数的第i位a[i]与被乘数的第j位处b[j]相乘时,则其结果可以加入到c[i+j]中,然后再进行进位处理。

整数与小数乘积算法在不考虑小数点的情况下,先计算整数与每个小数单元中的数字,每次可以得到一个长整数,再根据当前小数单元的位置,确定对这个长整数的缩小位数。第1位小数,缩小10倍(这里以十进制为例),相当于将此长整数整体向右移动1位。同理,对于第n位小数,相当于将此长整数整体向右移动n位。

由此,每次计算都可以得到一个确定的整数和小数部分。对这些数值求和,即可以得到整数与小数部分的乘积。

四)高精度除法计算。

与乘法计算一样,计算高精度除法也有很多方法,可以直接进行计算,也可借助其他算法来提高计算速度。

直接进行高精度除法计算对于髙精度除法,一般也可以分为两种情况来直接计算,一是髙精度与单精度相除:二是高精度与高精度相除。

高精度与单精度除法。

在高精度除以单精度数时,从髙位到低位逐位相除。最需要注意的问題是,后一位继承前一位的余数问题。

高精度与高精度除法。

对于两个高精度的除法直接计算,一般可用被除数减去除数的高精度来实现,在程序中设置一个计数器,用高精度加法来累加减了多少次即为最后的商。当被除数小于减数时,此时被减数即为余数。

我们的收获。

通过编写高精度计算器我们亲身使用objective-c,亲身感受到ios开发的魅力,我们的编程能力也在不同程度得到提高。

通过寻找学习高精度计算的算法。我对高精度计算的实现有了更深的理解,我们手上简简单单的四则运算,为了在计算机中实现却需要不小的功夫。单是一个乘法就需要考虑这么多因素。

为了提高乘法的性能,我们可以通过利用fft、fnt等方法加快运算,计算中还可以借助移位运算等改进。而如何存储数据、如何更快的完成计算,如何让计算更准确,如何考虑可能出现的各种错误都有很深的学问,需要我们细细品味与思考。

虽然objective-c是从c衍生出来的具有c++面向对象特点的一门有趣的语言。在我们接触了c、c++一年之后,我们仍发现在字符串的运用上仍然保留着使用c++提供的输入输出流以及封装好的string类的使用习惯,这使我们在**的跨平台上花费了很大的精力。与此同时,这也让我们深刻体会到学习一门语言不仅仅要学习它的语法,更需要我们去深入理解的是它的思想,在当今几百门语言供我们选择的情况下,思想才是我们真正需要掌握的利器。

通过对一个实际的应用的测试和**改进,我意识到以前所了解的**风格和编码习惯的重要性,对于objective-c的特性所带来的好处和“奇怪”的错误有了一定的了解。由于objective-c的设计,很多工作在程序的运行时(runtime)完成而不是编译链接阶段,这就使很多微妙的错误在编译链接阶段难以发现,而到了运行的时候才感到棘手。这提醒我们做一个有实际意义的应用需要事前良好的规划、事中清晰地思考和事后全面的分析。

我们相信我们在将来的开发中可以写出更好地程序。

我们的不足。

尽管经过大一一年的编程学习与实践,我们的编程能力有了很大的提高。通过c++的学习,我们对面对对象的编程也有了一定的理解。但是因为初次接触objective-c初次使用xcode,我们在编写高精度计算器的过程中还是出现了一些问题,最终编写成的计算器还有很多的不足。

一些期望的功能没有实现。像除法效率低下问题、括号问题等。

不管怎样我们还是受益匪浅。

暑期项目个人总结

这个暑假我们组队利用c 完成了一款叫做 tower defense 的游戏,遇到了一些问题,也学到了不少东西。我主要负责游戏的创意和实现,经过在网上不断的查找,比较,再结合自己的创意,形成了最后这款游戏。这是一款名字与长相都像塔防类的混搭类游戏,但是与世面上的现有的游戏相比有着自己独特的规则与玩法,...

XX年暑期实习总结 项目流程

7.10号我来到了实习公司,开始了一周的技术培训。每天都是9 30开始,晚上6 00结束。每天都很充实,课程的安排也都很紧凑。课程的范围覆盖面很广,从产品,测试,运维,开发,前端,人事,等等都有相关的设计。对公司的业务,公司的系统结构也都有相关的介绍。这一周收获颇丰,比在学校里面自学能学到更多接触不...

暑期实践项目

近年我国新能源产业迅猛发展,风力发电 光伏发电在能源结构中所占地位日益重要。但与此同时,风能 太阳能本身受气候影响大,随机性强 波动大 有间歇,难以提供连续稳定的电能输出。这已成为制约新能源大规模开发利用的关键技术瓶颈。国家风光储输示范工程 由国家电网公司设计 建设,列入国家 金太阳 工程重点项目 ...