John Carmack 암호: 0x5f3759df

1764 단어
John Carmack 암호: 0x5f3759df
아마도 카맥은 마음속으로 말했다. 사실 나는 대단하지 않다. 단지 내가 다른 사람이 여자를 꼬시는 시간을 가지고 와서 프로그램을 썼을 뿐이다!
John Carmack 암호: 0x5f3759df
누군가가 Quake III의 소스 코드에서 제곱근을 구하는 데 사용되는 이 코드를 발견했다.
/*
================
SquareRootFloat
================
*/
float SquareRootFloat(float number) {
long i;
float x, y;
const float f = 1.5F;

x = number * 0.5F;
y = number;
i = * ( long * ) &y;
i = 0x5f3759df - ( i >> 1 ); //
y = * ( float * ) &i;
y = y * ( f - ( x * y * y ) );
y = y * ( f - ( x * y * y ) );
return number * y;
}

0x5f3759df? 이것은 무엇입니까?수치 분석을 배운 후에 알 수 있듯이 알고리즘 안에서 제곱근을 구하는 것은 일반적으로 무한히 가까운 방법을 채택한다. 예를 들어
뉴턴 교체법, 죄송합니다. 제가 수치 분석을 너무 못 배워서 잘 모르겠어요.간단하게 말하면 5의 제곱근을 구하고 추측치를 하나 골라서 2를 구하면 우리는 이렇게 계산할 수 있다
5/2 = 2.5; 2.5+2/2 = 2.25; 5/2.25 = xxx; 2.25+xxx/2 = xxxx ...
이렇게 반복해서 교체하면 결과는 반드시 sqrt(5)에 수렴된다. 그래, 일반적인 제곱근을 구하는 것은 모두 이렇게 계산한다.카마르크의 다른 점은 신비로운 추측치 0x5f3759df를 시작으로 전체 접근 과정의 수렴 속도가 폭등했고 Quake III가 요구하는 정밀도 10의 마이너스 3차원에 대해 한 번의 교체만 하면 결과를 얻을 수 있다는 것이다.좋아, 만약 이것이 소 b가 아니라면, 이어서 보자.퍼듀 대학의 수학자 크리스 로몬트는 보고 재미를 느껴 카마크가 내놓은 이 추측치의 비밀을 연구하기로 했다.로몬트도 소인간으로 정성을 들여 연구한 후에 이론적으로도 가장 좋은 추측치를 추론해 냈는데 카마르크의 숫자와 매우 가깝다. 0x5f37642f.카마르크는 정말 소다. 그는 외계인인가?전설은 여기서 끝나지 않았다.로몬트는 결과를 계산한 후 매우 만족하여 자신이 계산한 시작값과 카마르크의 신비한 숫자를 가지고 시합을 하여 누구의 숫자가 더 빠르고 정확하게 제곱근을 구할 수 있는지 보았다.결국 카마르크가 이겼군..카마르크가 어떻게 이 숫자를 찾았는지 아무도 모른다.마지막으로 로몬트는 화가 나서 폭력적인 방법으로 한 숫자 한 숫자를 시험해 보았는데 마침내 카마르크보다 조금 더 좋은 숫자를 찾았다. 비록 실제로 이 두 숫자가 발생한 결과는 매우 비슷하지만 이 폭력으로 나온 숫자는 0x5f375a86이다.Lomont는 이를 위해 "Fast Inverse Square Root"이라는 다음 논문을 썼다.John Carmack, ID의 보물입니다.
출처 블로그:http://jan.yculblog.com/

좋은 웹페이지 즐겨찾기