澳门新葡新京

人们对计算能力的需求澳门新葡新京

作者:操作系统    来源:未知    发布时间:2020-01-06 05:06    浏览量:

人们对计算能力的需求澳门新葡新京。咱俩明白计算机的测算精度不是最为大的,以至是足够个其他。CPU的字长和操作系统的拍卖技能一向制约着运算精度和平运动算本领。随着计算机应用的深深,人们对计量本领的须要,特别是精度的要求,更加高。尽管日前叁16个人CPU及操作系统提供的简政放权精度,较之早先本来就有比不小的滋长,何况精度更高的69人CPU及操作系统正在遍布,然则,对众多微处理机应用课题来讲,能或无法抱有不直接信任硬件标准的高精度、高性能总结本事仍为第生机勃勃的。为此,设计高精度总计的软件包,用软件方法达成高精度计算,是生龙活虎件有实用价值的劳作。比方,方今在电商应用中,密码的校验及计算正是对高精度计算的头角峥嵘需要。

深入分析难题

出于C语言具备奉行效用高、帮助动态存款和储蓄分配等特点,大家接受C语言编写了风流浪漫套工具函数,供高精度总括使用。乘法运算在微微机运算中是后生可畏种基本运算,它的测算进程对任何总结效用有第风流浪漫的震慑。留心切磋乘法运算对高精度总括十三分供给。

为了落到实处高精度计算,首先要树立高精度的数据表示方法。大家运用将整数和小数分开,组成三个类别的不二秘诀囤积数据。这种方法不但节省存款和储蓄空间,何况有益于有限辅助整数运算的精度。

呈报运算对象的数据布局如下:

struct VARARRAY {

char cDigit; //保存数据位

//指向下三个多少位

struct VARARRAY * spNext;

};

 

struct SUPERNUMBER

{

人们对计算能力的需求澳门新葡新京。//指向最低位整数

struct VARARRAY * spIntPart;

 

//指向最低位小数

struct VARARRAY * spDecPart;

 

//指向最高位整数

struct VARARRAY * spIntLast;

人们对计算能力的需求澳门新葡新京。 

//指向最高位小数

struct VARARRAY * spDecLast;

 

int iNumberInt; //整数位数

int iNumberDec; //小数位数

char cSign;

}; //符号位

人们对计算能力的需求澳门新葡新京。在用SUPE牧马人NUMBE凯雷德构造描述运算对象的底蕴上,大家定义了一套函数,周密达成SUPE揽胜NUMBE卡宴型数据的输入、输出、赋值、比较、加、减、乘、除、整除等运算作用。本文入眼介绍无精度损失的乘法总括方式及主要性函数的策画。

乘法算法

为了不损失总括精度,我们将乘法调换为加法达成,基本算法如下:

1.将数符很多的数据表示为X,作为加数,数符相当少的数据表示为Y,调整加法次数;

2.生龙活虎旦Y含有小数部分,将Y调换为纯整数YDEC,并记下小数点的右移位数I;

3.开头化重回值T为0,拿到Y的位数WIDTH,设流速计COUNT为0;

4.取Y侧边第COUNT+1位,以此数为次数加X,再左移COUNT位,加到T中;

5.把COUNT加1;

人们对计算能力的需求澳门新葡新京。6.若COUNT等于WIDTH,转下一步,不然转第4步;

7.将T中的小数点左移I位;

8.再次回到T,获得乘法结果。

本算法的个性是加法次数少,若Y的宽度为W,最多开展9×W次加法及W次移位即可。

乘法函数

乘法函数通过把七个SUPEENCORENUMBEENCORE型的数码相加落成运算目标,其结果通过指针重回。

struct SUPERNUMBER * su_mu(

struct SUPERNUMBER * spSourceOne,

struct SUPERNUMBER * spSourceTwo)

{

struct SUPERNUMBER * spNew;

struct SUPERNUMBER * spYDec;

struct SUPERNUMBER * spX,* spY,* spC,* spT;

struct VARARRAY * spTem;

int iYDec,iWidth,iDigit,iC1,iC2;

spNew=su_as(“0”);

if (spSourceOne->iNumberInt+spSourceOne->iNumberDec>=spSourceTwo->iNumberInt+

spSourceTwo->iNumberDec){

spX=su_co(spSourceOne);

spY=su_co(spSourceTwo);

}

else{

spY=su_co(spSourceOne);

spX=su_co(spSourceTwo);

}

iYDec=spY->iNumberDec;

spYDec=su_mo(spY,iYDec);

i;iNumberInt;

spTem=spYDec->spIntPart;

for(iC1=0;iC1<iWidth;iC1++)

{

iDigit=(int)(spTem->cDigit-‘0’);

spTem=spTem->spNext;

spC=su_as(“0”);

for(iC2=0;iC2<iDigit;iC2++)

{

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.将字符串转变为SUPE途观NUMBE兰德索罗德类型:

struct SUPERNUMBER * su_as(char*zpSource);

2.将两个SUPE奔驰M级NUMBE汉兰达复制到另叁个SUPEXC90NUMBELacrosse中:

struct SUPERNUMBER * su_co(struct SUPERNUMBER * spSource);

3.多少个SUPEXC60NUMBE凯雷德的“等于”关系运算,若相等,重回1:

int su_ee(struct SUPERNUMBER * spSource, struct SUPERNUMBER * spDesti);

4.八个SUPEKugaNUMBESportage数的加法运算:

struct SUPERNUMBER * su_ad(struct

SUPERNUMBER * spSource,struct SUPERNUMBER * spDestination);

5.SUPE普拉多NUMBECR-V与用整数表示的多少的加法运算:

struct SUPERNUMBER * su_si(

struct

SUPERNUMBER * spSource, int iDesti);

6.移动小数点:

struct SUPERNUMBER * su_mo(struct

SUPERNUMBER * spSource, int iNum);

7.释放SUPEPAJERONUMBE奥迪Q5数据的积累空间:

void su_fr(struct SUPERNUMBER * spSource);

使用实例

当大家总计16的阶乘时,常规的法子难于直接获取不错的结果,尽管定义长整型(long intState of Qatar数据,在计算出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

下一篇:没有了

更多新闻推荐

Copyright © 2015-2019 http://www.xzmthb.com. 澳门新葡新京有限公司 版权所有