首页 > 代码库 > 高精度计算(1)--引言

高精度计算(1)--引言

    我们知道,目前计算机计算数值的精度较高,但因硬件限制,往往达不到实际生产需要,因此我们可以通过对程序进行缜密设计实现高精度计算。今天我们来谈谈这个问题。

    首先,我们应知道,高精度计算的工作原理:

    像竖式一样,我们可以利用竖式的进位、借位,再通过字符串存储数据与字符串函数的操作、计算,实现高精度计算。

   Eg.

     5 2 2                           a3 a2 a1

+  6 2 3                       +   b3 b2 b1

____________________             =====>               _________________________          

 1 1 4 5                        c4 cc2 c1

   那么,在高精度计算时,我们应注意什么?

     这就说来话长了······

    1.数据的接收与存储

  当输入数据很长很长······(如:1000位,10000位,10000000...位时),我们只要开出足够的字符串长度,利用字符串函数的操作、计算,将每一位取出,存入数组中。

 1 void init(int a[]) { /*传入数组*/ 2  3     string s; 4      5     cin>>s; 6      7     a[0]=s.length(); /*用a[0]计算字符串s的位数*/ 8      9     for (i=1;i<=a[0];i++)10       a[i]=s[a[0]-i]-0;11     /*s----->a[],并倒序*/12 13 }

    另一种是直接用循环加数组方法,也是异曲同工之妙。

 

   2.确定高精度数位数

    位数的确定:接收时往往是使用字符串,所以它的位数==字符串长度

 

  3.进位、退位

 

 1 /*加法进位*/ 2 c[i]=a[i]+b[i]; 3 if (c[i]>=10) { 4  5     c[i]%=10; 6     ++c[i+1]; 7  8 } 9 10 /*减法进位*/11 if (a[i]<b[i]) {12 13     --a[i];14     a[i]+=10;15 16 }17 18 c[i]=a[i]-b[i];19 20 /*乘法进位*/21 c[i+j-1]=a[i]*b[j]+x+c[i+i-1];22 x=c[i+j-1]/10;23 c[i+j-1]%=10;

 

    以上就是高精度计算的理论知识,以后我将会发放相关事例。

  谢谢!

 

高精度计算(1)--引言