7cf3da36e2f206a26d81f6e64e85736c

์ด๊ฒƒ์ด ๋ญ๋ƒํ•˜๋ฉด ํ€˜์ดํฌ 3 ์†Œ์Šค์ฝ”๋“œ์— ์žˆ๋Š” ํ•จ์ˆ˜๋‹ค


์ •ํ™•ํžˆ๋Š” 75f3c028e2f206a26d81f6e14f89๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ํ•จ์ˆ˜์ธ๋ฐ, ๊ด‘์› ํšจ๊ณผ์— ์“ฐ์ด๋Š” ํ•จ์ˆ˜๋ผ์„œ ๊ต‰์žฅํžˆ ๋นจ๋ผ์•ผ ํ•œ๋‹ค

(๋น›์˜ ๋ฐ˜์‚ฌ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐ ์“ฐ๋Š”๋ฐ, ๋‹จ์œ„๋ฒกํ„ฐ๊ฐ€ ์–ด์ฉŒ๊ตฌ ๋ฐ˜์‚ฌ๋ฒกํ„ฐ๊ฐ€ ์ €์ฉŒ๊ตฌ ํ•˜๋Š” ๊ฑด ์ƒ๋žต)


์ค‘์š”ํ•œ ๊ฑด ๋А๋ฆฌ๋ฉด 60 ํ”„๋ ˆ์ž„์„ ๋ชป๋งž์ถ”๊ณ , ๋นจ๋ผ๋„ ๊ฐ’์˜ ์ •ํ™•ํ•˜์ง€ ์•Š์œผ๋ฉด ๋น›์ด ์ด์ƒํ•˜๊ฒŒ ํ‘œํ˜„๋œ๋‹ค



๋‚˜๋ˆ—์…ˆ์ด๋ž‘ ์ œ๊ณฑ๊ทผ์„ ์“ฐ๋Š” ๋ฐฉ๋ฒ•์€ ์ •ํ™•ํ•œ ๋Œ€์‹  ๋ฆฌ์†Œ์Šค๋„ ๋งŽ์ด ํ•„์š”ํ•˜๊ณ  ์คœ๋‚˜ ๋А๋ ค์„œ 60ํ”„๋ ˆ์ž„์„ ๋ชป๋งž์ถ˜๋‹ค


๊ทธ๋ž˜์„œ ํ€˜์ดํฌ 3 ๊ฐœ๋ฐœ์ง„์€ ์ €๋Ÿฐ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด 75f3c028e2f206a26d81f6e14f89๋ฅผ ๋น ๋ฅด๊ณ  ์ •ํ™•ํ•˜๊ฒŒ ๊ณ„์‚ฐํ–ˆ๋‹ค






์ผ๋‹จ ๋ณด๋ฉด ์ฃผ์„์— ์™“๋”๋ป‘์ด๋ผ๊ณ  ์ ํžŒ ๊ฒƒ์ฒ˜๋Ÿผ ์”จ1๋ฐœ ์ด๊ฒŒ ๋ญ์•ผ ์–ด์บ ํ•˜๋Š”๊ฑด๋ฐ ์‹ถ์–ด์ง„๋‹ค


๊ทธ๋ž˜๋„ ํ•˜๋‚˜ ํ•˜๋‚˜ ๋œฏ์–ด๋ณด๋ฉด ์ดํ•ด๊ฐ€ ๋˜๊ธด ๋œ๋‹ค



์šฐ์„  ๋งจ ์•ž์— ๋ณ€์ˆ˜์˜ ์ž๋ฃŒํ˜• ๋‘ ๊ฐœ๊ฐ€ ๋‚˜์˜จ๋‹ค


7ff3da36e2f206a26d81f6e74e877564

long์€ ์ˆซ์ž๋ฅผ ์ด์ง„๋ฒ•์œผ๋กœ 00000000 00000000 00000000 00000000์œผ๋กœ ํ‘œ์‹œํ•œ๋‹ค


longํ˜•์—์„œ ํŠน๋ณ„ํžˆ ๋ด์•ผํ•  ๊ฑด ์—†์œผ๋‹ˆ ๋„˜์–ด๊ฐ€์ž



7ef3da36e2f206a26d81f6e74687746e


float์€ ์†Œ์ˆซ์ ์„ ํฌํ•จํ•œ ์‹ค์ˆ˜๋ฅผ 0 00000000 00000000000000000000000์œผ๋กœ ํ‘œํ˜„ํ•œ๋‹ค


์ฒซ ์ž๋ฆฌ๋Š” ๋ถ€ํ˜ธ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค

0์ด๋ฉด ์–‘์ˆ˜ ๋˜๋Š” 0, 1์ด๋ฉด ์Œ์ˆ˜๋ฅผ ๋œปํ•œ๋‹ค


๋’ค์˜ 8์ž๋ฆฌ๋Š” ์ง€์ˆ˜(2E)๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค

E = -127๋ฅผ 00000000์œผ๋กœ ํ•˜๊ณ  E = +128์„ 11111111๋กœ ์‚ฌ์šฉํ•œ๋‹ค

๋งˆ์ง€๋ง‰ 23์ž๋ฆฌ๋Š” ๊ฐ€์ˆ˜๋ถ€(M)๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค

์ด์ง„๋ฒ•์œผ๋กœ 1.00000000000000000000000๋ถ€ํ„ฐ 1.11111111111111111111111๊นŒ์ง€ ์†Œ์ˆซ์ ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ ์‚ฌ์šฉํ•œ๋‹ค

79f3da36e2f206a26d81f6e644887d64

floatํ˜•์„ ์ˆ˜์‹์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ์ด๋Ÿฐ ๊ผด์ด ๋œ๋‹ค

์ € ์ˆ˜์‹์„ 2์˜ ๋กœ๊ทธ๋กœ ๊ฐ์‹ธ๊ณ  ์ •๋ฆฌํ•˜๋ฉด

74f3c028e2f206a26d81f6e1468171

7ced9e36ebd518986abce8954485736a๊ฐ€ ๋œ๋‹ค


๋œฌ๊ธˆ์—†์ด ๋‚˜์˜จ ๋ฎค(ฮผ)๋Š” log2์˜ ๊ทผ์‚ฌ๊ฐ’์„ ๊ตฌํ•˜๋Š” ๋ฐ ์“ฐ์ธ ์ˆซ์ž๋‹ค


1๋ณด๋‹ค ์ž‘์€ x์— ๋Œ€ํ•ด

viewimage.php?id=2abcdd23dad63db0&no=24b0d769e1d32ca73cea86fa11d0283109283bc9014f0198adabe96cfbc56abd860e3041b6d4a19b1087fded841aa533aa53f5fb8e96d927dcaebd45d2fc7580c5d7c6์ธ๋ฐ ์ ๋‹นํ•œ ์ˆ˜๋ฅผ ๋”ํ•˜๋ฉดviewimage.php?id=2abcdd23dad63db0&no=24b0d769e1d32ca73cea86fa11d0283109283bc9014f0198adabe96cfbc56abd860e3041b6d4a19b1087fded841aa533aa53f5fb8e96d92ad4a3bc12d4fd7780b0d915์ „๋ฐ˜์ ์ธ ์ •ํ™•๋„๋ฅผ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค

์‹คํ—˜์ ์œผ๋กœ ์ฐพ์•„๋‚ธ ์ ์ ˆํ•œ ๊ฐ’์€ ฮผโ‰’0.0430357์ด๋‹ค

์ฐธ๊ณ : https://en.wikipedia.org/wiki/Fast_inverse_square_root#Aliasing_to_an_integer_as_an_approximate_logarithm

78f3da36e2f206a26d81f6e64482776c

๊ทธ๋Ÿฐ๋ฐ floatํ˜•์˜ ๋น„ํŠธ๊ฐ’์€ E*223 + M ๊ผด์˜ ํ˜•ํƒœ๊ฐ€ ๋˜๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ๋‹ค

(์—ฌ๊ธฐ์„œ ์Œ์ˆ˜๋Š” ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š”๋‹ค)


์•ž์—์„œ ๊ตฌํ•œ ๋กœ๊ทธ๊ฐ’์ด๋ž‘ ๋น„๊ตํ•˜์—ฌ ์ƒ๊ฐํ•ด๋ณด๋ฉด floatํ˜•์˜ ๋น„ํŠธ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ํ•˜๋‚˜์˜ ์ •์ˆ˜๋กœ ์ƒ๊ฐํ•˜๋ฉด ์ด ์ •์ˆ˜๋Š” ์›๋ž˜ ๊ฐ’์— log2๋ฅผ ์ทจํ•œ ๊ฒƒ๊ณผ ๊ฐ™๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค



๋ณ€์ˆ˜ ์ •์˜ ๋’ค์— ๋‚˜์˜ค๋Š” i = * ( long * ) &y; ๊ฐ€ ๋ฐ”๋กœ floatํ˜•์œผ๋กœ ๋ฐ›์€ ๋น„ํŠธ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ์ˆซ์ž๋กœ ๋ฐ›๋Š” ์ค„์ธ ๊ฒƒ์ด๋‹ค


7bf3da36e2f206a26d81f6e74383756c

์–ด์ฐŒ์ €์ฐŒํ•˜์—ฌ ์ค‘๊ฐ„๊นŒ์ง€๋Š” ์™”๋Š”๋ฐ ๊ทธ ๋‹ค์Œ ์ค„์ด ๋ฌธ์ œ๋‹ค


์•ž์„œ7cee9e36ebd518986abce895408872์˜€๊ณ 75f3c028e2f206a26d81f6e14f89๋ฅผ ๊ตฌํ•ด์•ผ ํ•˜๋Š”๋ฐ, ๋กœ๊ทธ์˜ ํŠน์„ฑ์— ๋”ฐ๋ผ 7ce99e36ebd518986abce8954483716f๊ฐ€ ๋œ๋‹ค!

๊ทธ๋ฆฌ๊ณ  ์ด์ง„์ˆ˜์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋น„ํŠธ๋ฅผ ์ด๋™(bit shift)ํ•˜๋ฉด 2๋กœ ๋‚˜๋ˆˆ ๊ฒƒ๊ณผ ๊ฐ™์€ ํšจ๊ณผ๋ฅผ ์–ป๋Š”๋‹ค


์˜ˆ๋ฅผ ๋“ค์–ด 110(10์ง„๋ฒ•์œผ๋กœ 6)์„ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋น„ํŠธ ์ด๋™์‹œํ‚ค๋ฉด 11(10์ง„๋ฒ•์œผ๋กœ 3)์ด ๋œ๋‹ค


111(10์ง„๋ฒ•์œผ๋กœ 7)๋„ 11(10์ง„๋ฒ•์œผ๋กœ 3)์ด ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์ง€๋งŒ ์–ด์ฉ” ์ˆ˜ ์—†์ด ๋ฐ›์•„๋“ค์—ฌ์•ผ ํ•œ๋‹ค


์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋น„ํŠธ ์ด๋™์ด >>๋‹ˆ๊นŒ -0.5i๋Š” -(i >> 1)์ด ๋œ๋‹ค


๊ทธ๋Ÿฌ๋ฉด ์ € 0x5f3759df(=1597463040)๋Š” ๋Œ€์ฒด ๋ญ” ์ˆ˜์ผ๊นŒ?






7af3da36e2f206a26d81f6e746857d6c


์‹ค์ œ๋กœ ๊ตฌํ•ด์•ผ ํ•˜๋Š” ํ•ด75f3c028e2f206a26d81f6e14f89๋ฅผ ๊ฐ๋งˆ(ฮ“)๋ผ๊ณ  ํ•˜๋ฉด i์™€ ฮ“์˜ ๊ด€๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค


7ce89e36ebd518986abce8954789766a

์ด๊ฑธ ์ข€์ „์— ๋ดค๋˜7ceb9e36ebd518986abce8954481776d๊ผด๋กœ ํ‘œํ˜„ํ•˜๋ฉด,

7cea9e36ebd518986abce8954589706e

์ •๋ฆฌํ•˜๋ฉด,

7ce59e36ebd518986abce89545857d6f



๊ฐ’์„ ๊ณ„์‚ฐํ•˜๋ฉด, 3/2 * 223 * (127-ฮผ) = 1597488309.57 โ‰’1597463040 = 0x5f3759df

๊ทธ๋ ‡๋‹ค, ์˜ค์ฐจ๋ฅผ ๋ณด์ •ํ•˜๋Š” ๊ฐ’์ด ๋ฐ”๋กœ ์ € 0x5f3759df์˜€๋˜ ๊ฑฐ๋‹ค!

๊ฐ’์„ ๋‹ค ๊ตฌํ–ˆ์œผ๋‹ˆ ๊ตฌํ•œ ๊ฐ’์„ floatํ˜•์œผ๋กœ ๋˜๋Œ๋ฆฌ๊ณ  โ†’ y = * (float *) &i;

f(x) = 0์„ ์ •ํ™•ํ•˜๊ฒŒ ๊ตฌํ•  ๋•Œ ์“ฐ๋Š” ๋‰ดํ„ด-๋žฉ์Šจ๋ฒ•์„ ์ด์šฉํ•ด ์ •ํ™•๋„๋ฅผ ๋†’์—ฌ์ฃผ๋ฉด โ†’ y = y * (threehalfs - (x2 * y * y));



๊ทธ๋ฆฌํ•˜์—ฌ ๋‚˜๋ˆ—์…ˆ๋„, ์ œ๊ณฑ๊ทผ ๊ณ„์‚ฐ๋„ ์—†์ด ํฌ์ธํŠธ ์ฐธ์กฐ, ๋น„ํŠธ ์ด๋™, ๋บ„์…ˆ, ๊ทธ๋ฆฌ๊ณ  ๊ณฑํ•˜๊ธฐ๋งŒ ๊ฐ€์ง€๊ณ  ๋น ๋ฅด๊ณ  ๋น„๊ต์  ์ •ํ™•ํ•˜๊ฒŒ75f3c028e2f206a26d81f6e14f89๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค!


https://youtu.be/p8u_k2LIZyo






๋ญ” ์†Œ๋ฆฐ์ง€ ๋‚œ ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค