Re: [閒聊] 老遊戲的變態程式碼
看板C_Chat (希洽)作者kuoyipong (petohtalrayn)時間6小時前 (2025/07/22 19:15)推噓21(21推 0噓 10→)留言31則, 21人參與討論串3/3 (看更多)
i = * ( long * ) &y
把原本浮點數改成long整數的目的
最主要是因為浮點數的紀錄方式可以用來近似成該數字取對數的值
也就是這個動作實際上是在取log(y)的近似值(乘以2^23然後再加上常數)
i = 0x5f3759df - ( i >> 1 );
既然取了對數,那要求原本的數字的根號,只要取對數後的數值除2就好
而二進位數字除2很簡單,就跟10進位數字除10一樣,移一格就好
然後前面的0x5f3759df這個數字是用來調整結果的常數,俗稱魔法數字
因為根號的函數是曲線,這個運算則是直線方程式,會稍微有誤差
實際上最神的也是這個常數,你要怎麼找到誤差最小的常數就是這個運算方式的關鍵
y = * ( float * ) &i;
經過簡單的加減乘除之後,再把原本的整數變回浮點數
也就是把取了log的數字還原成原本的數字
到這一步得到的結果誤差大概5%以下
y = y * ( threehalfs - ( x2 * y * y ) )
這個則是牛頓法求根,不知道牛頓法是什麼的請去下面這個wiki然後看中文版解說
https://en.wikipedia.org/wiki/Newton%27s_method
簡單來說就是大概把上面那個5%以下的誤差縮小到1%以下
因為原本找到的答案就已經很接近了,用牛頓法可以輕易找到誤差更小的數字
而牛頓法是用越多次誤差會越小,因此原本的程式碼中用了2次,
但工程師認為沒有必要用到2次,1次的誤差就夠小了
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.64.25.104 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/C_Chat/M.1753182946.A.234.html
※ 編輯: kuoyipong (61.64.25.104 臺灣), 07/22/2025 19:16:30
推
07/22 19:17,
6小時前
, 1F
07/22 19:17, 1F
→
07/22 19:25,
6小時前
, 2F
07/22 19:25, 2F
→
07/22 19:25,
6小時前
, 3F
07/22 19:25, 3F
→
07/22 19:26,
6小時前
, 4F
07/22 19:26, 4F
推
07/22 19:28,
6小時前
, 5F
07/22 19:28, 5F
推
07/22 19:29,
6小時前
, 6F
07/22 19:29, 6F
推
07/22 19:30,
6小時前
, 7F
07/22 19:30, 7F
推
07/22 19:30,
6小時前
, 8F
07/22 19:30, 8F
→
07/22 19:32,
6小時前
, 9F
07/22 19:32, 9F
推
07/22 19:32,
6小時前
, 10F
07/22 19:32, 10F
推
07/22 19:33,
6小時前
, 11F
07/22 19:33, 11F
→
07/22 19:34,
6小時前
, 12F
07/22 19:34, 12F
推
07/22 19:43,
6小時前
, 13F
07/22 19:43, 13F
→
07/22 19:45,
6小時前
, 14F
07/22 19:45, 14F
推
07/22 19:54,
6小時前
, 15F
07/22 19:54, 15F
→
07/22 19:58,
6小時前
, 16F
07/22 19:58, 16F
→
07/22 19:59,
6小時前
, 17F
07/22 19:59, 17F
→
07/22 20:00,
6小時前
, 18F
07/22 20:00, 18F
推
07/22 20:01,
6小時前
, 19F
07/22 20:01, 19F
推
07/22 20:03,
6小時前
, 20F
07/22 20:03, 20F
推
07/22 20:05,
6小時前
, 21F
07/22 20:05, 21F
推
07/22 20:20,
5小時前
, 22F
07/22 20:20, 22F
推
07/22 20:20,
5小時前
, 23F
07/22 20:20, 23F
推
07/22 20:25,
5小時前
, 24F
07/22 20:25, 24F
推
07/22 20:37,
5小時前
, 25F
07/22 20:37, 25F
推
07/22 20:45,
5小時前
, 26F
07/22 20:45, 26F
推
07/22 20:57,
5小時前
, 27F
07/22 20:57, 27F
推
07/22 22:53,
3小時前
, 28F
07/22 22:53, 28F
→
07/22 22:53,
3小時前
, 29F
07/22 22:53, 29F
推
07/22 22:58,
3小時前
, 30F
07/22 22:58, 30F
推
07/22 23:11,
2小時前
, 31F
07/22 23:11, 31F
討論串 (同標題文章)
C_Chat 近期熱門文章
PTT動漫區 即時熱門文章
10
41