关于invSqrt( )函数
生活随笔
收集整理的這篇文章主要介紹了
关于invSqrt( )函数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?先解釋下InvSqrt函數吧!InvSqrt(value)函數相當于1.0/sqrt(value),所以你大概應該明白了它是什么意思了吧!由于計算機圖形學程序里經常要求一個面或點的單位法線,就不可避免地要用到1.0/sqrt(length)這樣的式子。你可能會說:1.0/sqrt(value)不是挺好的么?這還有什么好拿出來的?!
? ? ? ?但是!下面的這個InvSqrt函數比傳統的1.0/sqrt(value)平均要快4倍,迭代一次就可以得到相應的結果,而且精度很robust。
下面是源代碼:
[cpp]?view plaincopyx = x * (1.5f - xhalf*x*x); // Newton step
? ? ? ? 這一步的由來。所以這里的關鍵在于如何選擇一個好的初始值來進行迭代才能以盡可能少的次數就達到足夠的精度呢?代碼中的整形數 i 轉換成其機器碼對應的浮點數就是一個很好的初始值,事實上它非常地接近x的平方根分之一,因此這也是為什么這里只需迭代一次就可以得到很好的結果的原因。
? ? ? ? 這個代碼牛逼也正好牛逼在選擇了一個好的數據:0x5f375a86-(i>>1),這里的i 是浮點數x對應的機器碼轉換成的整型數據。然后i>>1就是相當于i/2,統統左移一位,再用一個常量來減i>>2,得到另一個整型數據,這個整形數據對應的浮點數就是一個滿足要求的初始值了。
? ? ? ? 問題的關鍵在于,你怎么知道要選擇0x5f375a86這么好的一個數據呢?對此,可以后面的參考論文[InvSqrt.pdf],由于里面的數學知識太多,在這個頁面里的排版不太方面,所以就不貼出來了~~論文中對于IEEE754浮點數據的格式進行了分析,并將浮點部分與指數部分分開討論,對指數的奇偶作了一番探討,最后將R-(i>>1)中的R范圍給大致地確定出來,并分析不同取值的結果。大家如果不喜歡看這些頭疼的數學,了解一下這個代碼到底是怎么回事就行了,沒有必要深究。
? ??
參考論文:http://www.matrix67.com/data/InvSqrt.pdf
總結
以上是生活随笔為你收集整理的关于invSqrt( )函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 四元数姿态解算及多传感器融合详细解析
- 下一篇: 十六进制数转换成float类型数据数据的