题意描述:写一个程序实现sqrt()函数
解题分析:平时用习惯了库orAPI,突然让写一个sqrt()函数,不免要思考一下。以下给出两种常见的解题思路
方法一:二分法。以sqrt(3)为例,运算过程是这样的,任取一个初始值,比如这里取0,则有以下运算过程:
(0+3)/2=1.5 1.5*1.5<3
(1.5+3)/2=2.25 2.25*2.25>3
(1.5+2.25)/2=1.875 1.875*1.875>3
……
最后逐渐求得近似解,代码实现如下:
double getSqrt(double x){
if(x < 0)
return -1;
if(x == 0)
return 0;
double low = 0;
double high = x;
double mid = (low + high) / 2;
while(Math.abs(mid * mid - x) > 0.000001){
if(mid * mid < x)
low = mid;
if(mid * mid > x)
high = mid;
mid = (low + high) / 2;
}
return mid;
}
方法二:牛顿迭代法。仍以sqrt(3)为例,任取一个初始值,这里取8,则有以下运算过程:
(8+3/8)/2=4.185 4.185*4.185>3
(4.185+3/4.185)/2=2.4519 2.4519*2.4519>3
(2.4519+3/2.4519)/2=1.837 1.875*1.875>3
(1.837+3/1.837)/2=1.725 1.752*1.752>3
……
逐渐求得近似解,代码如下:
double getSqrt(double x) {
if(x < 0)
return -1;
if(x == 0)
return 0;
double res = 8;
while(Math.abs(res * res - x) > 0.000001){
res = (res + x/res)/2;
}
return res;
}
实验结果: