C語言標准庫:
http://www.cplusplus.com/reference/cmath/
在一個區間中,每次拿中間數的平方來試驗,如果大了,就再試左區間的中間數;如果小了,就再拿右區間的中間數來試。比如求sqrt(16)的結果,你先試(0+16)/2=8,8*8=64,64比16大,然后就向左移,試(0+8)/2=4,4*4=16剛好,得到了正確的結果sqrt(16)=4。
實現時我第一次沒有進行精度控制,導致一些不能完整開方的數運行不出來,也忘記了對非整數的判斷。代碼1為改正后的代碼,后面代碼2為第一次寫的代碼,貼在這里以作對比提醒。
代碼1:
esp常在C++中用來控制迭代精度,是函數程序事先聲明的常量,在微積分中是無限小值。
float esp=0.000000;
double sqrt(double x)
{
double down,up,n,last;
down=0;
up=x;
n=(down+up)/2;
if(x<=0)
return x;
while((n*n!=x)&&abs(last-n)>esp)
{
if(n*n<x)
{
down=n;
last=n;
n=(down+up)/2;
}
else
{
up=n;
last=n;
n=(down+up)/2;
}
}
return n;
}
代碼2:
double sqrt(double x)
{
double down,up,n;
down=0;
up=x;
n=(down+up)/2;
while(n*n!=x)
{
if(n*n<x)
{
down=n;
n=(down+up)/2;
}
else
{
up=n;
n=(down+up)/2;
}
}
return n;
}
參考:http://www.2cto.com/kf/201206/137256.html