- 注册时间
- 2010-2-12
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 1214
- 在线时间
- 小时
|
楼主 |
发表于 2015-8-14 01:08:07
|
显示全部楼层
除法开始的函数:Big_Digit_DIV.c
- #include "DIV.h"
- void Big_Digit_DIV(UINT32 *qut, int *Work,int *Cdiv,int LENdividend, int *divR,int LENdivR)
- {
-
- //int Cdiv[]; // 被除数 dividend
- //int divR[]; // 除数 divisor
- //int qut[]; // 商 quotient
- int CTRL[7]={0}; // 控制 control
- UINT64 C;
- int temp;
- int f0,i,j,n;
-
- CTRL[0]=0; //试商由1变为0时的判断依据。CTRL[0]=1时表示试商由1变为0
- //CTRL[1] 未定义
- CTRL[2]=LENdivR; //除数数组的最大下标
- CTRL[3]=LENdividend; //每次循环参与计算的被除数起始下标
- //CTRL[4] 未定义
- //CTRL[5] 临时存贮试商的值
- CTRL[6]=LENdividend-LENdivR-1; //每次循环参与计算的被除数终点下标
-
-
- i=LENdividend-LENdivR-1;////除法总的循环次数的初始值(从LENdividend-LENdivR-1开始计数,直到0,最多循环LENdividend-LENdivR次)
- while(i>=0)//-----//除法开始
- {
- f0=CTRL[3];
- C=UInt32x32To64(Cdiv[f0],BASE)+Cdiv[f0-1];////-----C=Cdiv[f0]*10^8+Cdiv[f0-1].
- temp=(int)(C/divR[LENdivR]);// 求试商
- if((temp==0)||(CTRL[0]==1))
- {
- i--;//总循环次数减1
- CTRL[6]--; //被除数下标减1,被除数增加一项
- if(CTRL[6]<0)//满足条件时程序结束。
- {
- i=-1; //强制程序退出。
- continue;
- }
-
- C=UInt32x32To64(C,BASE)+Cdiv[f0-2];////--------C=Cdiv[f0]*10^16+Cdiv[f0-1]*10^8+Cdiv[f0-2]
- temp=(int)(C/divR[LENdivR]);//增加一项再求商。Cdiv[f0-2]就是增加的那一项。
- }
-
- CTRL[5]=temp;
- quotient_MUL_divisor(Work,Cdiv,divR,CTRL);////乘法、加法和减法函数,将试商确定为真实商
- if(CTRL[0]==1) continue; //试商由1变为0时,进行下一次循环。
- qut[i]=(unsigned int)CTRL[5];//把确定了的商赋给qut[].
- j=CTRL[3];
- while((Cdiv[j]==0)&&(j>=0))//计算余数从左端起非零第一项的位置下标
- j--;
- if(j<0)//计算出的j小于0,说明除法计算已完成。
- {
- i=-1; //强制程序退出。
- continue;
- }
- if(j<CTRL[6])//条件满足时,说明本次运算余数是零,
- {
- i=j-LENdivR-1;//计算主循环下标。
- CTRL[3]=j;//返回被除数下标(上限,对应数组高位),用于下一次计算
- CTRL[6]=i;//返回被除数下标(下限,对应数组低位),用于下一次计算。
- }
-
- if(j>=CTRL[6])//说明本次运算有非零的余数。
- {
- n=j-CTRL[6]+1;//求余数剩下的位数
- if(n<=LENdivR+1)////当n小于等于除数的长度时
- {
- temp=LENdivR+1-n+1;//求出要补充的新被除数个数。
- CTRL[3]=j;//返回被除数下标(上限,对应数组高位),用于下一次计算
- CTRL[6]=CTRL[6]-temp;//返回被除数下标(下限,对应数组低位),用于下一次计算
- i=CTRL[6];//计算主循环下标
- }
- else
- {
- CTRL[3]=j;//返回被除数下标(上限,对应数组高位),用于下一次计算
- CTRL[6]=j-LENdivR-1; //返回被除数下标(下限,对应数组低位),用于下一次计算
- }
- }
- }
- }
复制代码
补充内容 (2015-8-14 11:00):
应改为:除法开始的文件:Big_Digit_DIV.c |
|