Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++의 빠른 역제곱근

<시간/>

이 문제에서는 정수 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