您的位置:首页 > 理论基础 > 数据结构算法

多精度计算备忘录之数据结构

2014-08-24 14:31 120 查看
前段时间对一个多精度计算的大数类维护已经过一段落,

现对此做个总结,以备遗忘.

初步定为大约有 数据结构,,乘法,除法,倒数,平方,有理数幂等,可能到时会略有更改.

数据结构篇:

根据需要,可采用的2次幂进制(比如2^32,2^31,2^30,2^28,2^16等等),采用10次幂进制(10^9,10^4,10^1等等),, 对这些进制各有优劣.

采用二进制本身计算相对简便,但是由于人习惯于 10进制显示的,这进制间还需要有个转换过程,而这个转换过程相对还比较复杂,对有显示需求的,采用二进制并不是非常合适.

采用十进制则相反,计算相对繁复一些,但是显示直观.

通常如果有显示需求,采用10进制比较合适,否则二进制更方便优化.

至于对二(十)进制体系内部的不同的进制选取,如(2^32,2^31,2^30,10^9,10^4,10等等),通常这些不同的选取是基于优化对数据运算时溢出处理的考虑.这里对此不再展开

当然,还存在其他进制,比如7进制,36进制,这些特殊的进制通常是作为特殊用途的,通常的多精度计算并不会选择这些相对特殊进制.

class HUGEINT{
bool bSymbol;					//符号
//int iExponent;			        //指数
DATA vData;					//真实数据.
static unsigned int iRADIX;                     //进制 = 10^9
 }
这表示法有点类似于科学计算法,符号位,指数,真实数据,

指数实际和小数点实际位置相关.

这里采用的是数组的数据结构来存储真实数据,通常根据实际需要数组长度需可调整,

直接看成 typedef std::vector<unsigned int> DATA;这也无妨碍理解.

这里还有个取舍问题,就是这个指数是否需要使用,有这个指数,数据的末端0则可以直接被处理掉.但是在其他运算时,这个指数有个额外的偏移量计算.稍稍增加计算量.

具体实现时,可以根据需要选取是否使用这个指数,

这里具体的实现是采用10^9进制,并没有采用指数这个参数.

数据结构,大致到这里.

由于多精度加法,减法,基本上实现都是相同的,没有什么特别的优化手段,不再对多精度的加法,减法进行讨论.

后面对会对多精度运算里,相当重要的乘法展开讨论
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: