【已解决】不调用math库函数求一个数的自然对数
刚发了一帖问求一个数开任意次根,其间写了个用幂级数展开求自然对数,但这个对x是有限制的,ln(1+x)中x是要在 -1到1之间的否则结果不正确,当x较大时怎么解决啊,有什么方法吗?再说的明白点: 用幂级数展开只能算小数的ln,但是对大数取ln,只能靠查表,那么math库函数里面log是怎么实现的捏
-----------------------------------------------------------------------
我承认我钻牛角尖了,一直在想用级数展开做,其实当我写了第一个mln时我已经完成一大半了,再用下ln函数的性质就可以求出大数的ln,看代码:
程序代码:#include<stdio.h>
#include<math.h>
#define LN10 (2.302585)
double nci(double k,int r) //求r个k相乘
{
int i;
double b=1;
if (r==0)return 1;
for (i=1;i<=r;i++) b=b*k;
return b;
}
double mln(double a)
{
int i,coo;double x,ans;
int k=0;
while (a>1)
{
a = a / 10.0;
k++;
}
x=a-1;
ans=k*LN10;coo=1;
for (i=1;i<100;i++){
ans += coo*nci(x,i)/i;coo=coo*(-1);}
return ans;
}
double jiec(int i)
{
int j; double ans=1;if (i==0) return 1;
for (j=2;j<=i;j++)
ans *=j;
return ans;
}
double mexp(double ab)
{
int i;double ans=0;
for (i=0;i<100;i++)
ans += nci(ab,i)/(jiec(i)*1.0);
return ans;
}
main()
{
double a,b;
printf("enter a,b : ");
scanf("%lf %lf",&a,&b);
printf("手写mln a结果 is %lf\n",mln(a));
printf("调用math库log a 结果is %lf\n",log(a));
printf("手写求a的b次的结果answer is %lf\n",mexp(b*mln(a)));
printf("调用math库求a的b次的结果pow answer is %lf \n",pow(a,b));
getch();
}
[ 本帖最后由 zjsxwc 于 2011-2-18 10:26 编辑 ]





