이 문제에서는 정수 x가 주어집니다. 우리의 임무는 빠른 역제곱근( ) 32비트 부동 소수점 숫자.
숫자의 역제곱근을 찾는 알고리즘은 비디오 게임의 벡터 정규화 와 같은 프로그래밍에 매우 유용합니다. 3D 그래픽 등에서
알고리즘:
1단계: 알고리즘은 부동 소수점 값을 정수로 변환합니다.
2단계: 정수 값을 연산하고 역제곱근의 근사값을 반환합니다.
3단계: 1단계에서 사용한 것과 동일한 방법을 사용하여 정수 값을 다시 부동 소수점으로 변환합니다.
4단계: 뉴턴의 방법을 사용하여 정밀도를 향상시키기 위해 근사가 이루어집니다.
알고리즘의 작동을 설명하는 프로그램:
예시
#include<iostream> using namespace std; float calcInvSqRoot( float n ) { const float threehalfs = 1.5F; float y = n; long i = * ( long * ) &y; i = 0x5f3759df - ( i >> 1 ); y = * ( float * ) &i; y = y * ( threehalfs - ( (n * 0.5F) * y * y ) ); return y; } int main(){ int n = 256; float invSqRoot = calcInvSqRoot(n); cout<<"The inverse square root of the number "<<n<<" is "<<invSqRoot; return 0; }
출력 -
The inverse square root of the number 256 is 0.0623942