迭代法对大于1的数计算更准确,小于1的话就比较麻烦,所以大于1用迭代,小于1用二分
#define n_ACCURACY (0.002)//最大为误差
#define n_MAX_COUNT_TIME 10 //最大计算次数
double mySqrt( double x )
{
double a = x;
double min,max,mid,res;
unsigned char t;
unsigned char count=0;
if(x<=0)return 0;
if(x>=1)//牛顿迭代法
{
while ((a * a - x) > n_ACCURACY){
a = (a + x / a) / 2;
count++;
if(count>=n_MAX_COUNT_TIME )break;
}
return a;
}
else//二分法
{
min = 0;
max = 1;
mid = 0.5;
t=1;
while(t)
{
t=0;
res = mid*mid;
if(res > x)
{
if((res-x)>n_ACCURACY)
{
t=1;
max = mid;
mid = (max+min)/2;
}
}
else
{
if((x-res)>n_ACCURACY)
{
t=1;
min = mid;
mid = (max+min)/2;
}
}
count++;
if(count>=n_MAX_COUNT_TIME )break;
}
return mid;
}
}