這次我們來學習一下如何求平方根。在計算機中很難有精確的求出資料的平方根的演算法,基本都是要求乙個誤差可接受範圍內的近似值。治理我們取誤差值為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中使用了下面的演算法,它第一次在公眾場合出現的時候,幾乎震住了...