前段时间对一个多精度计算的大数类维护已经过一段落,
现对此做个总结,以备遗忘.
初步定为大约有 数据结构,,乘法,除法,倒数,平方,有理数幂等,可能到时会略有更改.
数据结构篇:
根据需要,可采用的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进制,并没有采用指数这个参数.
数据结构,大致到这里.
由于多精度加法,减法,基本上实现都是相同的,没有什么特别的优化手段,不再对多精度的加法,减法进行讨论.
后面对会对多精度运算里,相当重要的乘法展开讨论