從零開始學演算法 求平方根

2021-10-06 23:05:32 字數 2293 閱讀 9621

這次我們來學習一下如何求平方根。在計算機中很難有精確的求出資料的平方根的演算法,基本都是要求乙個誤差可接受範圍內的近似值。治理我們取誤差值為1e-5。

筆者的程式語言及環境如下

程式語言:c++

編譯器:code blocks

系統: windows 10 x64

二分法求平方根的思路如下:

設定乙個初始區間[0,n],若n<1則初始區間為[0,1]。

取區間中值mid的平方與資料n比較。

若資料n小則令區間變為[0,mid];否則變為[mid,n(或1)]。

若先後兩次中值的差在誤差範圍內,則此次mid為平方根的近似值。

**如下:

double

sqrt

(double number)

//二分法

while

(fabs

(mid-last)

>

1e-5);

return mid;

}

以123456789012為測試資料結果如下

迭代法求平方根的主要思路為:

令x為任意值(通常取資料n的一半)。

令y=(x+n/x)/2。

若x與y的差在誤差範圍內,則y為平方根近似值;否則令x=y執行第2步

**如下:

double

sqrt1

(double number,

double x)

以123456789012測試結果如下:

說實話,筆者對於 int i = (int)&x;這種寫法也就見過這麼一次,可以說卡馬克演算法無論是從思想上還是**上都極具魅力,你能想象到求平方根演算法連乙個迴圈乙個迭代都沒有麼!世上沒有取巧的**,只有強大的理論。

同樣以123456789012測試,其效果如下:

我們可以看到資料同一二種方法有了資料差異,但是資料差異僅有0.1%,可以說是完全可以接受。如果迭代兩次的話效果如下圖:

誤差來到了0.0002%,可太可怕了。

下面附上處理double型資料的**,就不進行效果展示了:

double

sqrt

(double number)

現在對以上三種方法進行整體**演示:

#include

#include

#include

using

namespace std;

double

sqrt0

(double number)

;//二分法

double

sqrt1

(double number,

double x)

;//牛頓迭代法

float

sqrt2

(float x)

;//卡馬克快速平方根

double

sqrt3

(double number)

;//double版

求平方根函式

加一點注釋 unsigned short work unsigned int n 要進行開平方運算的物件 unsigned int ans 0 開平方運算的結果 unsigned int square 0 記錄中間產生的平方值 unsigned short r 0 程式最終的返回結果 for int...

4 求平方根

問題描述 實現int sqrt int n 函式,計算返回n的平方根。問題示例 sqrt 3 1,sqrt 10 3,sqrt 4 2,sqrt 5 2。問題分析 一般遇到解方程的題目,最常用的就是二分法。實現 class solution def my sqrt self,n 利用二分法實現平方根...

快速平方根演算法

在3d圖形程式設計中,經常要求平方根或平方根的倒數,例如 求向量的長度或將向量歸一化。c數學函式庫中的sqrt具有理想的精度,但對於3d遊戲程式來說速度太慢。我們希望能夠在保證足夠的精度的同時,進一步提高速度。carmack在quake3中使用了下面的演算法,它第一次在公眾場合出現的時候,幾乎震住了...