【已解决】不调用math库求一个数开任意次根
我知道math.h里有个pow函数可以实现这个功能,不过我想知道我们不调用pow函数怎么实现这个功能。这是数学问题吧?有pow函数的代码吗----------------------------------------
我在linux下用写了个f.c
如下:
#include<math.h>
main()
{
pow(9.0,0.5);
}
然后用gcc-E gcc -S 得到的汇编指令是这个:
.file "f.c"
.text
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
popl %ebp
ret
.size main, .-main
.ident "GCC: (GNU) 4.5.0"
.section .note.GNU-stack,"",@progbits
看不懂汇编
怎么弄啊
——————————————————
弄出了个半成品,由于用了幂级数展开求自然对数,底数a只能在很小(小于2)的时候才行,math库是怎么求对数的啊?
程序代码:
求a的b次,a,b为实数 #include<stdio.h> #include<math.h> 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; x=a-1;ans=0;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)//手写求e的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));//输出a的自然对数 printf("log a is %lf\n",log(a));//调用math库输出a的自然对数 printf("answer is %lf\n",mexp(b*mln(a)));//输出a的b次 printf("pow answer is %lf \n",pow(a,b));//调用math库输出a的b次 }
---------
改进后的代码见https://bbs.bccn.net/thread-331356-1-1.html
[ 本帖最后由 zjsxwc 于 2011-1-21 14:38 编辑 ]