- 注册时间
- 2010-8-11
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 44
- 在线时间
- 小时
|
楼主 |
发表于 2010-8-15 16:32:31
|
显示全部楼层
源代码比较多,贴出乘法的吧
void mul(int Precision, unsigned int* Num_Array, int* pSign, int* pExponent, unsigned int* num_Num_Array, int num_Sign, int num_Exponent, unsigned int* buf_Num_Array)
{
int i;
int cutOff = 0;
for (i = Precision - 1; i >=0; i--)
{
buf_Num_Array[i] = Num_Array[i];
if(cutOff == 0 && Num_Array[i] != 0)
{
cutOff = Precision - i;
}
Num_Array[i] = 0;
}
cutOff--;
int temp_Exponent = (*pExponent) + num_Exponent;
*pExponent = 0;
*pSign = (*pSign) * num_Sign;
for (int idxMain = 0; idxMain < Precision; idxMain++)
{
int n = num_Num_Array[idxMain];
if (n!=0)
{
int shift = idxMain + (*pExponent);//(*pExponent)修正量
int cnt = Precision - (cutOff > shift ? cutOff : shift);
int carry = 0;
if (cnt>0)
{
unsigned int* p0 = &Num_Array[shift - 1];
unsigned int* p1 = &buf_Num_Array[-1];
_asm
{
mov ecx,cnt
mov edi,p0
mov esi,p1
mov ebx,0
lp:
mov eax,n
cdq
mul DWORD PTR [esi+ecx*4] // low:eax,high:edx
add eax,[edi+ecx*4]
adc edx,0
add eax,ebx
adc edx,0
mov [edi+ecx*4],eax
mov ebx,edx
loop lp
mov carry,ebx
}
}
//继续进位
if (shift>0)
{
unsigned int* p0 = &Num_Array[shift - 1];
_asm
{
mov ecx,shift
mov edi,p0
mov edx,carry
lp2:
mov eax,[edi]
add eax,edx
mov [edi],eax
mov edx,0
jnc ext
mov edx,1
sub edi,4
loop lp2
ext:
mov carry,edx
}
}
if (carry!=0)
{
(*pExponent)++;
for (i = Precision - 1; i > 0; i--)
{
Num_Array[i] = Num_Array[i - 1];
}
Num_Array[0] = carry;
}
}
}
(*pExponent) += temp_Exponent - 1;
} |
|