編程求解根號2

問題:編程求解根號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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章