【已解决】不调用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 编辑 ]