任何乙個3d引擎都是通過其內部的數學模型和實現工具來展現它的力量與速度的,quake iii中使用了乙個非常有意思的技巧來計算平方根倒數(inverse square root)
carmack's 不尋常平方根倒數
第乙個跳出來的便是對函式q_rsqrt中對0x5f3759df的使用,這個數計算了乙個浮點數的inverse square root,但是為什麼這個函式有這樣的功能呢?
觀察q_math.c原本的函式:
它不僅有效,甚至在某些cpu上,carmack的q_rsqrt 比(float)(1.0/sqrt(x)的計算快4倍,儘管sqrt()通常使用的是fsqrt的彙編指令!
在另乙個檔案code/common/cm_trace.c 中,我們發現了更簡潔的對同樣hack的實現。這一次,它被用來計算乙個float - sqrt(x)的平方根。注意,其中的唯一不同是在返回值上--用返回*y取代了返回y。
牛頓對根的近似值
上面的**執行了眾所周知的牛頓對根的近似值,像絕大多數其它迭代求近似值的計算一樣,牛頓近似值假定是迭代的;每一次迭代都增強了它的準確度直至達到需要的準確度。
在牛頓近似值中的一般想法是我們我們猜測乙個數x的平方根值y,我們可能通過乙個簡單的操作用x/y來拉平y來取得更好的猜測,使其更接近實際的平方根,例如,我們像下面這樣計算2的平方根,我們假定初始的猜測是1:
如前面所提到的,牛頓的近似值是乙個大家所熟知的用以快速計算平方根的方法。但是,carmack在初始的猜測中就選取的不尋常的值,它徹底加強了準確度並且將quake iii中計算所要的值的迭代次數降到了1次!
魔數 這個函式中真正有意思的方面是神奇的常量0x5f3759df,用來計算初始猜測的,在
結果,這個神奇的常數0x5f3759df成了乙個迷了,在文章"fast inverse square root",普度大學的數學家chris lomont研究了這個常數,用了幾種精細的技術,lomont想自己用數學方法求出這個常數來,結果令人驚奇--lomont用數學方法計算出來的最佳常數(0x5f37642f)有一點點不同,並且除了理論上強一些之外,它產生的結果並沒有源**中使用的原始常數好!確實,john carmack 一定用了天才般的黑盒來找到這個常數。
只是僅僅從數字上來找的方法中,lomont找到了乙個更好的常數,這個數比原始的那個強了那麼一點點。然而,實踐中兩個常數產生了大概相同的結果,lomont提出這個使用了更好的常數的函式:
關於本文,東拼西湊來的,今天也已經很晚了。只是最近我在研究圖形學演算法的過程中,一些數字的數學的方法常常讓我感到震驚,我驚嘆於數學竟是如此的神奇。黑盒的應用是一門大學問,那些偉大的但是並不一定很出名的數學家常常利用黑盒另外開闢了區別於經典演算法的道路,但卻能帶來非常人能想像的效率。在研究這些強人的作品的時候,能得到一種很美妙很利落的體會,好的演算法就就像好的**,當欣賞他們的時候,只想拿起吉它,輕輕的彈上一首……
以其說計算機創造了21世紀,還不如說演算法與資料結構創造了21世紀。前人的智慧型也常讓我感到無比的驚嘆,而已往我卻沒有過這種深刻的體會,應視為較近距離接觸了吧。最近在研究卡爾曼濾波器、小波變換理論、資料融合演算法、以及複雜資料結構的過程中,真正體會到了什麼才叫曠世絕學,雖然現在自己也只是略懂丁點兒,但這些來自前人的偉大思想,卻讓我振奮,讓我更加明智。
世界上增福最快的方法! 錯過就可惜了
古語有云 福人居福地,福地福人居 乙個有福報的人,他無論身處 都是好風水 乙個沒有福報的人,他就是住在再好的風水寶地,也是一場徒勞。福報不是求來的,更不是搶來的,福報是自己修來的,只有積攢了足夠的善良與福德,好運才會常來光顧。在佛家看來,有一種方式增福消業最快。這種方式就是孝順父母。孝順父母,是天下...
世界上最遠的距離
世界上最遠的距離莫過於我站在你面前,可你並不知道我愛你 泰戈爾 世界上最遠的距離 不是生與死的距離 而是我站在你的面前 你卻不知道我愛你 世界上最遠的距離 不是我站在你的面前 你卻不知道我愛你 而是愛到痴迷 卻不能說我愛你 世界上最遠的距離 不是我不能說我愛你 而是想你痛徹心脾 卻只能深埋心底 世界...
世界上最小的linux PC
大家看到的那個黑色的立方體就是世界上最小的linux pc space cube,它是日本shimafuji corporation製作出了一款超小型電腦,本來是為太空任務設計的,它設法將usb埠,讀卡器 音訊輸出和專門的私有介面全都塞到乙個立方體盒子中,底盤大小僅為2平方英吋。這台超小型pc處理器...