首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

求用C语言高精度计算的方法解决思路

2012-02-27 
求用C语言高精度计算的方法如WINDOWS自带的计算器,计算精度很高。我试着用C的double类型编写了,小数点后只

求用C语言高精度计算的方法
如WINDOWS自带的计算器,计算精度很高。我试着用C的double类型编写了,小数点后只有15位的精度。有什么好办法吗?

本人主要是想编写一段分析程序,需要高精度的计算。

[解决办法]
学习一下写高精度算法吧.以下是我以前写的给你一个参考,写得不是很好.
#include <stdio.h>
#include <string.h>
#define Max 500

int t1[Max],t2[Max],t3[Max];
int c1[Max],c2[Max],c3[Max];
int to[Max];

void exchange(char *s,int *t)
{
int i,len;
len=strlen(s);
memset(t,0,sizeof(int)*Max);

for (i=len-1;i> =0;i--)
{
t[len-i]=s[i]- '0 ';
}
t[0]=len;
}


void plus(int *t1,int *t2,int *to)
{
int i,len;

memset(to,0,sizeof(int)*Max);
len=t1[0]> t2[0]?t1[0]:t2[0];

for (i=1;i <=len;i++)
{
to[i]+=t1[i]+t2[i];//这里注意不要漏掉 + 号
if (to[i]> =10)
{
to[i+1]+=to[i]/10;
to[i]%=10;
}
}
if (to[len+1]> 0) len++;
to[0]=len;
}

void sub(int *t1,int *t2,int *tq) //只能算结果为正的减法
{
int i,len,to[Max];
len=t1[0];
memset(to,0,sizeof(int)*Max);
for (i=1;i <=len;i++)
{
to[i]+=t1[i]-t2[i];//这里注意不要漏掉 + 号
if (to[i] <0)
{
to[i]+=10;
to[i+1]--;
}
}
while (to[len]==0&&len> 1) len--;
to[0]=len;
for (i=0;i <=len;i++) tq[i]=to[i];

}

void mul(int *t,int a,int *tq)
{
int i,len,to[Max];
len=t[0];
memset(to,0,sizeof(int)*Max);
for (i=1;i <=len;i++)
{
to[i]+=t[i]*a;
if (to[i]> =10)
{
to[i+1]+=to[i]/10;
to[i]%=10;
}
}

len++;
while (to[len]> =10)
{
to[len+1]+=to[len]/10;
to[len]%=10;
len++;
}

while (len> 1&&to[len]==0) len--;
to[0]=len;

for (i=0;i <=len;i++) tq[i]=to[i];
}


void h_mul(int *t1,int *t2,int *to)
{
int i,j,k,len;
memset(to,0,sizeof(int)*Max);
len=t1[0]+t2[0]+1; //可能达到的最高位数;
for (i=1;i <=t1[0];i++)
for (j=1;j <=t2[0];j++)
{
k=i+j-1;
to[k]+=t1[i]*t2[j];//这里注意不要漏掉 + 号
if (to[k]> =0)
{
to[k+1]+=to[k]/10;
to[k]%=10;
}
}

while (to[len]==0&&len> 1) len--;
to[0]=len;

}

void devide (int *t1,long int a,int *to)
{
int i,len;
long int s;

memset(to,0,sizeof(int)*Max);
len=t1[0];
s=0;
for (i=len;i> =1;i--)
{
s=s*10+t1[i];
to[i]=s / a;
s%=a;
}
while (to[len]==0&&len> 1) len--;
to[0]=len;
}

int compare(int *t1 ,int *t2)
{
int i,j,len;
i=t1[0];
j=t2[0];
if (j> i) return -1;
else if (i> j) return 1;
else
{
len=i;
for (i=len;i> =0;i--)
if (t1[i]!=t2[i])
{
if (t1[i]> t2[i]) return 1;
else return -1;
}
}
return 0;
}

void h_devide(int *t1,int *t2,int *to)
{
int i,len,tq[Max];

memset(to,0,sizeof(int)*Max);
memset(tq,0,sizeof(int)*Max);
tq[0]=1;
len=t1[0];
for (i=len;i> =1;i--)
{
mul(tq,10,tq);
tq[1]=t1[i];
while (compare(tq,t2)> =0)
{
sub(tq,t2,tq);
to[i]++;
}
}
while (len> 1&&to[len]==0) len--;
to[0]=len;

}

void output(int *to)


{
int i;
for (i=to[0];i> =1;i--)
{
printf( "%d ",to[i]);
}
printf( "\n ");
}


main()
{
char s1[Max],s2[Max],answer[Max];
int i;

memset(answer,0,sizeof(answer));
strcpy(s1, "99999999 ");
strcpy(s2, "33 ");
exchange(s1,t1);
exchange(s2,t2);

//plus(t1,t2,to);
//sub(t1,t2,to);
//mul(t1,0,to);
//h_mul(t1,t2,to);
//devide(t1,2,to);
h_devide(t1,t2,to);

for (i=to[0];i> =1;i--)
{
printf( "%d ",to[i]);
}
printf( "\n ");

return 0;

}


//高精度加减乘除代码 wind 2004/10/22
//最后修改:2005-10-30

热点排行
Bad Request.