問題:編程求解根號2,不能使用內置函數sqrt ?
方法一、牛頓迭代法(切線逼近法)
最先反應出的是,這是一個數學問題,自然想到切線逼近
根據步驟5,得到的公式,我們來編程計算:
double Sqr(double k) {
double x = k; // 當前迭代的x
double y = 0.0; // 上一次的迭代結果
// 兩次迭代的差值非常小時,便接近結果了
while (fabs(x - y) > 0.00001) {
// 保存上一次迭代的結果
y = x;
// 求解新的x
x = (x * x + k) / (2 * x);
}
return x;
}
參考:
牛頓法:
https://zh.wikipedia.org/wiki/牛頓法
導數表:
https://baike.baidu.com/item/導數表/10889755?fr=aladdin
方法二、二分查找
- 從 0~ k 之間取中間值m,m*m 與 k 做比較
- 若 mm > k ; 則下次取 0 ~ mm 中間值比較
- 若mm < k ; 則下次取 mm ~ k 中間值比較
- 逐漸逼近…
#include<iostream>
#include<cmath>
using namespace std;
double MySqrt(double n)
{
//此處一定爲浮點數,不要用整數
double _max = n;
double _min = 0.0;
//此處爲精度,當滿足該精度時,返回該近似值
double p = 1e-5;
double mid = (_max + _min) / 2.0;
//此處是浮點數之差的絕對值與精度進行比較
while(fabs(mid * mid - n) > p)
{
if(mid * mid < n)
_min = mid;
else if(mid * mid > n)
_max = mid;
else
return mid;
mid = (_max + _min) / 2.0;
}
return mid;
}
int main()
{
cout<<MySqrt(2)<<endl;
}