spT=su_ad(spC,spX);
su_fr(spC);
spC=su_co(spT);
su_fr(spT);
}
spT=su_mo(spC,iC1);
su_fr(spC);
spC=su_ad(spNew,spT);
su_fr(spNew);su_fr(spT);
spNew=su_co(spC);
su_fr(spC);
}
spT=su_mo(spNew,-iYDec);
su_fr(spNew);
spNew=su_co(spT);
su_fr(spT);
su_fr(spYDec);
su_fr(spX);
su_fr(spY);
return spNew;
}
在此函数中,我们使用了在高精度计算软件包中定义的其他函数(本文省略其实现代码),主要有:
1.将字符串转化为SUPERNUMBER类型:
struct SUPERNUMBER * su_as(char*zpSource);
2.将一个SUPERNUMBER复制到另一个SUPERNUMBER中:
struct SUPERNUMBER * su_co(struct SUPERNUMBER * spSource);
3.两个SUPERNUMBER的“等于”关系运算,若相等,返回1:
int su_ee(struct SUPERNUMBER * spSource, struct SUPERNUMBER * spDesti);
4.两个SUPERNUMBER数的加法运算:
struct SUPERNUMBER * su_ad(struct
SUPERNUMBER * spSource,struct SUPERNUMBER * spDestination);
5.SUPERNUMBER与用整数表示的数据的加法运算:
struct SUPERNUMBER * su_si(
struct
SUPERNUMBER * spSource, int iDesti);
6.移动小数点:
struct SUPERNUMBER * su_mo(struct
SUPERNUMBER * spSource, int iNum);
7.释放SUPERNUMBER数据的存储空间:
void su_fr(struct SUPERNUMBER * spSource);
应用实例
当我们计算16的阶乘时,常规的方法难于直接得到正确的结果,即使定义长整型(long int)数据,在计算出11的阶乘39916800之后,也开始出现数据错误。但是利用本文介绍的方法,可精确地计算出从1到16的阶乘值。代码如下:
FILE * fp;
struct SUPERNUMBER * spX;
struct SUPERNUMBER * spY;
struct SUPERNUMBER * spZ;
struct SUPERNUMBER * spSum;
fp=fopen(“abcd.txt”,“a+”);
if (fp==NULL) MessageBox(hWndMain,“file error”,“”,MB_OK);
//初始化变量
spX=su_as(“0”);
spY=su_as(“30”);
spSum=su_as(“1”);
//计算从1到16的阶乘值
lp: spZ=su_si(spX,1);
su_fr(spX);
spX=su_co(spZ);
su_fr(spZ); spZ=su_mu(spSum,spX);
su_fr(spSum);
spSum=su_co(spZ);
su_fr(spZ);
su_os(spSum);
su_of(spX,fp);
su_of(spSum,fp);
if (!su_ee(spY,spX)) goto lp;
fclose(fp);
运算结果为:
1 ! 1 2! 2
3 ! 6 4! 24
…
13 ! 6227020800 14! 87178291200
15 ! 1307674368000 16! 20922789888000