日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

关于invSqrt( )函数

發(fā)布時(shí)間:2024/4/24 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于invSqrt( )函数 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?先解釋下InvSqrt函數(shù)吧!InvSqrt(value)函數(shù)相當(dāng)于1.0/sqrt(value),所以你大概應(yīng)該明白了它是什么意思了吧!由于計(jì)算機(jī)圖形學(xué)程序里經(jīng)常要求一個(gè)面或點(diǎn)的單位法線,就不可避免地要用到1.0/sqrt(length)這樣的式子。你可能會(huì)說(shuō):1.0/sqrt(value)不是挺好的么?這還有什么好拿出來(lái)的?!

? ? ? ?但是!下面的這個(gè)InvSqrt函數(shù)比傳統(tǒng)的1.0/sqrt(value)平均要快4倍,迭代一次就可以得到相應(yīng)的結(jié)果,而且精度很robust。

下面是源代碼:

[cpp]?view plaincopy
  • float?invSqrt(float?x)??
  • {??
  • ????float?xhalf?=?0.5f?*?x;??
  • ????int?i?=?*(int*)&x;??????????//?get?bits?for?floating?value??
  • ????i?=??0x5f375a86?-?(i>>1);????//?gives?initial?guess??
  • ????x?=?*(float*)&i;????????????//?convert?bits?back?to?float??
  • ????x?=?x?*?(1.5f?-?xhalf*x*x);?//?Newton?step??
  • ????return?x;??
  • }??
  • ? ? ? ? ?乍看一下上面的代碼,你或許還沒(méi)明白是怎么回事。事實(shí)上,說(shuō)白了,這就是個(gè)牛頓迭代法的應(yīng)用。考慮函數(shù) ,牛頓迭代法求f(y)=0的迭代式是 。所以代入f(y)和f ' (y),就很自然地就明白了
    x = x * (1.5f - xhalf*x*x); // Newton step
    ? ? ? ? 這一步的由來(lái)。所以這里的關(guān)鍵在于如何選擇一個(gè)好的初始值來(lái)進(jìn)行迭代才能以盡可能少的次數(shù)就達(dá)到足夠的精度呢?代碼中的整形數(shù) i 轉(zhuǎn)換成其機(jī)器碼對(duì)應(yīng)的浮點(diǎn)數(shù)就是一個(gè)很好的初始值,事實(shí)上它非常地接近x的平方根分之一,因此這也是為什么這里只需迭代一次就可以得到很好的結(jié)果的原因。
    ? ? ? ? 這個(gè)代碼牛逼也正好牛逼在選擇了一個(gè)好的數(shù)據(jù):0x5f375a86-(i>>1),這里的i 是浮點(diǎn)數(shù)x對(duì)應(yīng)的機(jī)器碼轉(zhuǎn)換成的整型數(shù)據(jù)。然后i>>1就是相當(dāng)于i/2,統(tǒng)統(tǒng)左移一位,再用一個(gè)常量來(lái)減i>>2,得到另一個(gè)整型數(shù)據(jù),這個(gè)整形數(shù)據(jù)對(duì)應(yīng)的浮點(diǎn)數(shù)就是一個(gè)滿(mǎn)足要求的初始值了。

    ? ? ? ? 問(wèn)題的關(guān)鍵在于,你怎么知道要選擇0x5f375a86這么好的一個(gè)數(shù)據(jù)呢?對(duì)此,可以后面的參考論文[InvSqrt.pdf],由于里面的數(shù)學(xué)知識(shí)太多,在這個(gè)頁(yè)面里的排版不太方面,所以就不貼出來(lái)了~~論文中對(duì)于IEEE754浮點(diǎn)數(shù)據(jù)的格式進(jìn)行了分析,并將浮點(diǎn)部分與指數(shù)部分分開(kāi)討論,對(duì)指數(shù)的奇偶作了一番探討,最后將R-(i>>1)中的R范圍給大致地確定出來(lái),并分析不同取值的結(jié)果。大家如果不喜歡看這些頭疼的數(shù)學(xué),了解一下這個(gè)代碼到底是怎么回事就行了,沒(méi)有必要深究。

    ? ??

    參考論文:http://www.matrix67.com/data/InvSqrt.pdf


    總結(jié)

    以上是生活随笔為你收集整理的关于invSqrt( )函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。