Greg Hewgill 과 IllidanS4 는 훌륭한 수학적 설명과 함께 링크를 제공했습니다. 세부 사항에 너무 많이 들어가고 싶지 않은 사람들을 위해 여기에 요약하려고합니다.
몇 가지 예외를 제외하고 모든 수학 함수는 다항식 합계로 나타낼 수 있습니다.
y = f(x)
정확히 다음과 같이 변환 할 수 있습니다 .
y = a0 + a1*x + a2*(x^2) + a3*(x^3) + a4*(x^4) + ...
여기서 a0, a1, a2, ...는 상수 입니다. 문제는 제곱근과 같은 많은 함수의 경우 정확한 값에 대해이 합계는 무한한 수의 구성원을 가지며 일부 x ^ n 에서 끝나지 않는다는 것 입니다. 그러나 만약 우리가 어떤 x ^ n 에서 멈 추면 우리는 여전히 정확도까지의 결과를 가질 것입니다.
따라서 다음과 같은 경우 :
y = 1/sqrt(x)
이 특별한 경우에는 아마도 계산 속도 때문에 모든 다항식 멤버를 두 번째 이상으로 버리기로 결정했습니다.
y = a0 + a1*x + [...discarded...]
그리고 작업은 이제 y가 정확한 값과 가장 작은 차이를 갖도록 a0과 a1을 계산하기 위해 내려 왔습니다. 그들은 가장 적절한 값이 다음과 같다고 계산했습니다.
a0 = 0x5f375a86
a1 = -0.5
따라서 이것을 방정식에 넣으면 다음과 같은 결과를 얻을 수 있습니다.
y = 0x5f375a86 - 0.5*x
코드에 표시되는 줄과 동일합니다.
i = 0x5f375a86 - (i >> 1);
편집 : 실제로 정수로 부동 소수점을 2로 나눌뿐만 아니라 지수를 2로 나누고 다른 아티팩트를 발생 y = 0x5f375a86 - 0.5*x
시키기 i = 0x5f375a86 - (i >> 1);
때문에 실제로 는 동일 하지 않지만 여전히 일부 계수 a0, a1, a2 ....
이 시점에서 그들은이 결과의 정밀도가 목적에 충분하지 않다는 것을 발견했습니다. 따라서 그들은 결과 정확도를 향상시키기 위해 Newton의 반복의 한 단계 만 수행했습니다.
x = x * (1.5f - xhalf * x * x)
그들은 필요한 정확도가 충족 될 때까지 결과를 개선하는 루프에서 더 많은 반복을 수행 할 수있었습니다. 이것이 바로 CPU / FPU에서 작동하는 방식입니다! 그러나 한 번의 반복만으로도 충분 해 보이며 속도에도 축복이었습니다. CPU / FPU는 결과가 저장되는 부동 소수점 숫자의 정확도에 도달하기 위해 필요한만큼 반복을 수행하며 모든 경우에 작동하는보다 일반적인 알고리즘을 가지고 있습니다.
즉, 그들이 한 일은 다음과 같습니다.
CPU / FPU와 (거의) 동일한 알고리즘을 사용하고, 1 / sqrt (x)의 특수한 경우에 대한 초기 조건의 개선을 이용하고 CPU / FPU가 더 빨리 중지 될 것이므로 정밀하게 계산하지 마십시오. 계산 속도가 증가합니다.