高精度加,减法算法

大数加,减法目前我所知道的算法:

1)对于用子符串形式表示的数,可以直接相加,减,例:1 的ascii码为49,2 的ascii码为50,1+2的字符串相加为49+50=99 ,再减去一次48等于51,51是3的ascii码。

2)对于直接用数的值表示的数,可以直接相加减,也可以换算成大的进制表示形式进行运算,理论上大进制表示的数运行效率更高,如:1234+4567,当十进制时要运行4次加法,万进制时只需一次加法,那么我们进行大数加法时,有必要把十进制转换成万进制计算完后,再转换回来,答案是没必要,这样做只会更慢,因为进制转换所需时间大大超过十进制的直接加法运算,作为单次的大数加法运算,假如能直接相加(包括用子符串形式表式的数),那么直接相加就是最快的算法。

假如你要进行综合运算,如sin(x)的高精运算,里面有大量的加减乘除运算,一般情况为了更高的计算速度,常常采用大进制表示数,但大进制数加,减计算时会出现指数难以快速对位的问题,每一次的指数位调整没有高效算法会影响整个运算。

本篇文章主要也是讨论网上查不到的大数加减法中的指数或小数对位问题:

虽然理论上所有的有限长实数都可以化为整数进行计算,大数库也只提供对整数的支持,但这个例子的整数算法为:1.23E10*1.23E-10;化为整数为(12300000000*123)/10^12 = 1.5129

我的乘法因为直接对实数操作运算,步骤是这样的,先1.23*1.23= 1.5129;再指数位相加,10+(-10)=0,结果为1.5129E0,这种方法比化为整数再调用整数乘法子程序计算,效率更高,特别是这种(1.23E1000*1.23E-1000)数,更是相差巨大,这些都不是大问题,关键是通过调用大数整数子程序实现的有限长实数的大数支持,所需的调用前和调用后小数点或指数调整还是很复杂的,最难的是你需要很长的调试验证才能保证运行结果的正确性

这里我讲讲我的有限长实数加法(减法原理是一致的)的两种实现:

第一个方法是把数转换为十进制数,再把指数调整为相等,把两数以小数点位置为中心向两边扩充对位,最后运算。

例:1.23456789+9.87654e3 转换为:1.23456789e0+9876.54e0   内存扩充对位为:0001. 23456789+9876. 54000000,然后两数从右向左加,得结果为:9877. 77456789

第二个方法是采用大进制,这里以千进制数讲一下我的具体算法:这里设定千进制下的指数位为十进制下的指数位,十进制数9.87654e3换算成千进制数为009.876 540e3,为什么这么设定,当时也是进行了综合考虑,这样更利于后面的指数对位计算和进制转换。

1.23456789+9.87654e4的千进制表示形式为:0.123 456 789e1+0.987 654e5(这里实际应用时要采用纯小数的表达形式0.xxx...*10^n,

这里也必须要指数对位后才能运算,这里要用到两个参数x=(5-1)\3 =1 ,y=(5-1) mod 3 =1'这里的5是较大的数的指数,1是较小数的指数,3是千进制时的基数,根据x的值把较小的数调整为0.000 123 456 789,再根据y的值把前一次调整后的值调整为0.000 012 345 678 900,此时把两个操作数调整为等长,即:0.000 012 345 678 900+0.987 654 000 000 000,运算,运算后的结果的指数采用较大数的指数,最终结果为9.876663456789e4

其实上述方法中也可以根据x和y的值直接对两数(没有进行后续调整的两数0.123 456 789e1+0.987 654e5)进行运算,代码更简洁,速度有很小的下降,我目前就是采用的这种方法。

为什么我对千进制加法讲了这么多,因为综合运算需要大进制的有限长实数加法运算支持,刚开始我不知道大进制下的指数如何对位,我只能把大进制数换算成十进数后再相加,然后在转换回大进制数,大量的进制转换使综合运算效率很低,最后得到一个网友的帮助,对大进制数采用纯小数的表达形式才解决了千进制加法的问题,然后才能使我的落叶高精度表达式计算器1.2版的速度获得了很大的提升。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
落叶高精度表达式计算器V1.0(32位)版 本计算器程序是在win7 32位系统上,使用VB6.0开发的,本程序的主要特点是: 1) 高精度,支持万位精度的有理数常用运算; 包括:,减,乘,除,乘方,开N次方,三角函数,反三角函数,双曲三角函数,反双曲三角函数等。 2) 表达式运算,本程序没有采用常用计算器的边输入边计算,而是输入完所有数据或算式后,解析表达式,分解运算符和数据,最后在运算出结果。 点击程序界面上的等于按钮,计算器开始运算。 3) 本计算器的各种运算函数大都是自已所写,没有调用大数库或其它数学库,仅大数开平方调用GMP大数库。 本计算器的各种子函数是通过定义的一个高精度数据结构接收和返回运算结果,这个高精度数据结构可以定义有符号(整数,小数,科学计数法表示的数), 函数内部集中对数值,小数点位置,指数进行运算,优点是调用简单,不易出错,可以说比较完善,综合运算能力强。 这点和大数库的实现不同, 大数库大都只提供对整数的运算,假如要对有理数运算, 一:你需要很多的调用前和调用后处理工作,这些工作并不需要很高的知识,但却需要很长间的调试,它并不会因为你的水平很高而获得很大的间提升。 二:很难进行综合运算。当你把某一个函数调顺后,进行综合运算,会出现很多新的问题。 高精度数据结构VB定义为: Type StrToZx '高精度数的结构头 ZhFhBz As Boolean '正负号标志 XsdWz As Long '小数点右边数字的长度。例1234.567中这个数是3(为什么要这样定义,因为大多的基本运算都是右对齐的,这样定义减少了中间一些不必要的转换) JzBz As Integer '标记数组存的是什么进制的数(十进制或其它进制数) strlen As Long '运算数长度 Zx() As Long '存放运算数的数组 eE As Long '存放指数 End Type 4)综合运算,里面的三角函数,用户界面的算式,表达式运算,都是综合运算的体现,综合运算是大量基础运算的集合,中间稍有差错,就会算不出正确答案,里面内容繁琐,这里简单介绍一下。 5)本程序从2015年11月开始试编写,至2016年8月大致完成,开发周期很长,中间代码写了一两万行,从零基础到运行效率,综合效率的初中等水平,主要目的是练习编程,老外的数学软件已很强大,是我不可能相比的,我觉得我的程序如果把程序源码作为大数实例初级学习更合适。 6)程序中函数都具有输入值较验功能,若输入错误,会弹出提示窗口提示那一个函数输入错误。 7)由于本人是初次编程练习,且自身知识的不足,上精力有限,最后的测试收尾也只是简单测试,里面肯定存在很大的不足和没发现的BUG,请网友们在论坛,或 我的邮箱:wtbzhy@126.com, 微博:qq_34030789,中指正,交流。 我若纠错后,会在下载网站更新,并根据您的地址发一份给您,谢谢! 再次欢迎大家使用本计算器,本计算器具有很好的表达式解析功能,会在以后的使用中获得很好的用户体验!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值