如何编写指数函数 而不使用math.h
来源:百度知道 编辑:UC知道 时间:2024/05/23 11:24:23
我已经写出来了 pow(a, b) without math.h
int pow(int b,int p)
{ int i,sum;
if(p<0)
return 0;
else
{
for(i=1;i<=p;i++)
{ if(i==1)sum=b;
else
sum*=b;
}
return sum;
}
}
但是还有个问题
题目要求 print出来的 是从 b的 一次方开始
一直print到b的 p次方 该如何写main fuction啊
最基本的方法:把b分成整数部分和小数部分。整数部分从右往左数的第N位(二进制,N从0开始算)对应了a的2 ^ N次方;小数部分从左往右数的的第N位对应了a的2 ^ -(N + 1)次方。
结果初始值为0,如果某一位是1,则结果乘上其所对应a的X次方;否则不乘。
比如b的二进制表示是101.01 结果就是 a ^ 4 * a ^ 1 * a ^ (1/4)
----
不过开方还是问题,这样貌似不行+_,+b
----
wangtk1982 的方法玩儿过火了...
硬要弄的话我那个方法配上开方就可以了。远比那样绕弯子效率高。而开方最好用牛顿迭代算出倒数,这样可以避免大量不必要的除法。不过这样应该不是合理的实现。VC实现乘方貌似根本没用开方。
#include <stdio.h>
const int N=100;
double coef(int n)
{
if(n==0) return 0;
double t=1.0/n;
if(n%2==0) t=-t;
return t;
}//x^n的系数
double horner(double x)
{
double u=coef(N);
for(int i=N-1;i>=0;i--)
u=u*x+coef(i);
return u;
}
double sqrt(double b)
{
double x=1;int step=0;
while((x*x-b<-0.000000000000001||x*x-b>0.000000000000001)&&step<50)
{x=(b/x+x)/2.0;step++;}
return x;
}//开平方
double ln(double x)//ln(1+x)=x-x^2/2+x^3/