均方根誤差不超過 快速平方根倒數演算法

2021-10-16 11:28:52 字數 2345 閱讀 9256

**位址戳這裡​www.lomont.org

一、介紹

快速平方根倒數演算法也稱為平方根倒數速演算法(fast inverse square root)是用於快速計算 的一種演算法。此演算法由於出現在《雷神之鎚iii競技場》源**中而被人們所熟知。此演算法最早被認為是由約翰·卡馬克所發明,但後來的調查顯示,該演算法在這之前就於計算機圖形學的硬體與軟體領域有所應用,此演算法至今為止仍未能確切知曉演算法中所使用的特殊常數的起源。

下列**是《雷神之鎚iii競技場》源**中平方根倒數速演算法之例項:

快速平方根倒數演算法**

二、浮點數整數儲存方式

要理解這段**,首先需了解浮點數的儲存格式。乙個浮點數以32個二進位制位表示乙個有理數,而這32位由其意義分為三段:首先首位為符號位,如若是0則為正數,反之為負數;接下來的8位表示經過偏移處理(這是為了使之能表示-127-128)後的指數;最後23位表示的則是有效數字中除最高位以外的其餘數字。將上述結構表示成公式即為:

浮點數在計算機中的表示方式

浮點數儲存示意圖

其中m表示有效數字尾數(此處0<=m<=1,偏移量b=127,而指數的值e-b決定了有效數字) 代表的是小數還是整數。以上圖為例,m = =0.250,e-b=124-127=-3,所以浮點數的值為x=(1+0.250)x =0.15625。

浮點數儲存為整數時,該整數的數值為 i = e x 2^23 + m ,其中e表示指數,m表示有效數字;以上圖為例,e=124, m= 2^21 ,則轉換後的整數數值為i = 124 x 2^23+ 2^21 。由於平方根倒數函式僅能處理正數,因此浮點數的符號位必為0,而這就保證了轉換所得的有符號整數也必為正數。

三、浮點數平方根倒數近似值

回想上一節關於整數和浮點數表示的比較:對於同樣的32位二進位制數字,若為浮點數表示時實際數值為 x = (1+mx)2^ex ,而若為整數表示時則實際數值為ix = exl + mx ,其中l = 2^(n-1-b) ,基於上面整數和浮點數的表示,我們進行如下的推到過程:

整數與浮點數相互表示的的推導過程

對等式y = 1/sqrt(x)兩邊取二進位制對數有:

兩邊取對數

以如上方法,就能將浮點數x和y的相關指數消去,從而將乘方運算化為加法運算。由於log2x和log2x^(-1/2)線性相關,因此輸入值和首次近似值間可以線性組合的方式建立方程。在此mceniry再度引入新數σ描述log 2 ( 1 + x )與近似值r間的誤差。由於0<=x<=1時,有log 2 ( 1 + x ) 約等於 x,則再次可以定義σ與x的關係為log 2 ( 1 + x ) = x + σ,代入上面有:

代入 ex,mx , b和l有:

如上所述,對於以浮點規格儲存的正浮點數x,若將其作為長整型表示則示值為ix = exl + mx ,的可以得到x的整數匯出y的整數表示值為:

最後匯出式iy = r - 0.5ix 與**中的i = 0x5f3759df - (i>>1)相匹配,由此可見,在平方根倒數速演算法中,對浮點數進行一次移位操作與整數減法,就可以可靠地輸出乙個浮點數的對應近似值,mceniry只證明了,在常數r的輔助下,可近似求取浮點數的平方根倒數,但仍未能確定**中的r值的選取方法。

n位浮點數的儲存方式

四、牛頓迭代法改善進度

在進行了如上的整數操作之後,示例程式再度將被轉為長整型的浮點數迴轉為浮點數(x = *(float*)&i;),並對其進行一次浮點運算操作(x = x*(1.5f - xhalf*x*x);),這裡的浮點運算操作就是對其進行一次牛頓法迭代,若以此例說明:

牛頓迭代示意圖

均方根誤差有沒有單位 快速求任意數的平方根

大多數人看到這個題目,第一反應結果在區間 內,因為 我們可以使用如下方法計算。方法一 根據我們的分析,此題的結果在區間 內,我們使用二分法,我們試一下 是否滿足我們對精度的要求。我們發現差等於 不滿足我們精度的要求。結果在 區間內,但是離結果更近了,那麼我們再次使用二分法,離譜了,說明 小了,說明結...

快速平方根演算法

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

快速計算平方根

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