2013-02-05 5 views
3

나는 다른 사람들의 코드를 검토하는 데 꽤 괜찮은 사람이라고 생각하고 싶다.하지만 나는 실망했다. Doom3 수학 라이브러리에서 가져옵니다. 나는 이것이 아마도 Quake 1 이후로 GPL에 존재했다고 생각한다. 이것은 math.h를 참조한다. 나는 이것이 실제로 코사인을 계산하는 어떤 방법이 있다고 생각하지만 ... 나는 그것을 이해할 수 없다. 아무도 설명하지 않습니까?() 및 보정 계수를 기록, 그것은 (또는 어쩌면 팔분, 나는 성가 시게 할 수없는 ... 그것을 알아낼) 하나의 사분면까지 각도를 접는 것처럼실제로 코사인 16 비트 함수는 무엇을합니까?

ID_INLINE float idMath::Cos16(float a) { 
    float s, d; 

    if ((a < 0.0f) || (a >= TWO_PI)) { 
     a -= floorf(a/TWO_PI) * TWO_PI; 
    } 
#if 1 
    if (a < PI) { 
     if (a > HALF_PI) { 
      a = PI - a; 
      d = -1.0f; 
     } else { 
      d = 1.0f; 
     } 
    } else { 
     if (a > PI + HALF_PI) { 
      a = a - TWO_PI; 
      d = 1.0f; 
     } else { 
      a = PI - a; 
      d = -1.0f; 
     } 
    } 
#else 
    a = PI - a; 
    if (fabs(a) >= HALF_PI) { 
     a = ((a < 0.0f) ? -PI : PI) - a; 
     d = 1.0f; 
    } else { 
     d = -1.0f; 
    } 
#endif 
    s = a * a; 
    return d * (((((-2.605e-07f * s + 2.47609e-05f) * s - 1.3888397e-03f) * s + 4.16666418e-02f) * s - 4.999999963e-01f) * s + 1.0f); 
} 
+5

이은을하자 ** 사람들이 자신의 코드에 주석을 달아야하는 이유에 대한 예 ** –

+0

apocwslvn –

+0

@LightnessRacesinOrbit, s/code/math code/: P – Griwes

답변

5

모든 조건의 물건이 보인다 d).

마지막 줄은 일종의 10 차 다항식 근사치 (어쩌면 Taylor 또는 Chebyshev?)를 수행하고 있습니다. *cos은 짝수 함수이므로 짝수 글자에만 적용됩니다. 또한 큰 힘을 여러 번 직접 계산하는 것을 피하기 위해 Horner's method을 사용합니다.

그런 다음 d을 사용하여 올바른 부호를 다시 적용합니다.


*이, 옥타브에서 다음 코드를 실행 해보십시오 "확실히"정확한 것을보고 (온라인 예를 들어 here 그것을 할 수 있습니다) :

% One quadrant 
a = (-pi/2):0.1:(+pi/2); 

% Exact result 
y_exact = cos(a); 

% Our approximation 
s = a .* a; 
y_approx = (((((-2.605e-07 .* s + 2.47609e-05) .* s - 1.3888397e-03) .* s + 4.16666418e-02) .* s - 4.999999963e-01) .* s + 1); 

% Plot 
hold on 
plot(a, y_exact, 'b') 
plot(a, y_approx, 'r') 

+0

*이 답변의 편집을 중단 하시겠습니까? –

+0

@ MarkRansom : 어느 시점에서;) –