一、实现sqrt函数
一个采用牛顿迭代法的函数
double sqrt(double number)
{
if(number<=0)return 0;
//设置初始值i,i值越接近sqrt(number),所需循环次数越少
double i = 1; //一个快速算法是:int exp;double i=ldexp(frexp(number,&exp),(exp>>1));
double j = number/i;
while((i<j?j-i:i-j)>1e-9)//随着循环次数的增加,i与j将非常接近
{
i = (i+j)/2;
j = number/i ;
}
return i;
}
原理见:
泰勒级数展开法:f(x)=sqrt(x)在x=1处展开,得:
f(x) = 1+(1/2)×(x-1)+(0.5)×(-0.5)/2!×(x-1)2+(0.5)×(-0.5)×(-1.5)/3!×(x-1)3……
非常不建议使用级数展开,因为当数字比较大时收敛实在慢。
二、实现pow函数
double pow (double base , usigned int exponent)
{
if (exponent == 0) {
return 1;
} else if (exponent == 1) {
return base;
}
double result = pow (base, exponent >> 1);
result *= result;
if (exponent & 0x1 == 1) {
result *= base;
}
return result;
}