二分法与牛顿迭代法实现sqrt
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define err 0.000001
/*二分法寻找平方根*/
float SqrtRootBisection(float n)
{
if(n < 0){
return n;
}
float low = 0.0;
float up = n;
float mid = 0.0;
float last = 0.0;
mid = (low + up) / 2;
do{
if(mid * mid > n){
up = mid;
}else{
low = mid;
}
last = mid;
mid = (low + up) / 2;
}while(fabs(last - mid) > err);
return mid;
}
/*
* 牛顿迭代法快速寻找平方根
*
* 原理:我们仅仅是不断用(x,f(x))的切线来逼近方程x^2-a=0的根。
* 根号a实际上就是x^2-a=0的一个正实根,这个函数的导数是2x。
* 也就是说,函数上任一点(x,f(x))处的切线斜率是2x。
* 那么,x-f(x)/(2x)就是一个比x更接近的近似值。
* 代入 f(x)=x^2-a得到x-(x^2-a)/(2x),也就是(x+a/x)/2。
*/
float SqrtByNewton(float x)
{
float val = x;//最终
float last;//保存上一个计算的值
do
{
last = val;
val =(val + x/val) / 2;
}while(abs(val-last) > err);
return val;
}
int main()
{
float a1 = 2;
float b1 = SqrtRootBisection(a1);
printf("%f\n", b1);
float a2 = 3;
float b2 = SqrtByNewton(a2);
printf("%f\n", b2);
getchar();
return 0;
}